次の方法で共有


ゲームの状態に応じてタッチ コントロールのレイアウトを変更する

ゲームには、プレイヤーに表示されるタッチ レイアウトを変更したり、現在表示されているレイアウトで使用されている状態を変更したりすることができる機能があります。 この 2 つの方法を併用することで、プレイヤーにとって最も自然な操作性を生み出すことができます。

レイアウトの変更

レイアウトの変更は以下のような場合に行います。

  • 異なるコントロール スキーム間の移行 (ドライビング ゲームとファースト パーソン シューティング ゲームなど)
  • タッチ レイアウトを一時的に非表示にする (フルタッチ体験やシネマティック体験を可能にする場合など)

状態の変更

タッチ アダプテーション バンドルのコンテキスト部分に含まれるゲーム状態の変更は、以下のような場合に使用します。

  • プレイヤーの現在のゲーム状態に基づいて、コントロールの画像や図像を変更する場合。 以下に例を示します。
    • プレイヤーが選択した武器に基づいて、発射ボタンの画像を変更する。
    • 現在プレイヤーの在庫にあるアイテムに基づいて、能力の画像を変更する。
  • プレイヤーの現在のゲーム状態に基づいて、コントロールの視覚エフェクト状態 (可視性や有効性) を変更する。 以下に例を示します。
    • プレイヤーが追加の弾薬を持っていないときに、リロード ボタンを無効にする。
    • プレイヤーが操作できるアイテムに近づくと操作ボタンが表示されるようにする (遠ざかると非表示になる)。

ランタイムでのレイアウト変更

指定したレイアウトを表示する ゲームは XGameStreamingShowTouchControlLayout API を使用して新しいレイアウトを表示する必要があります。

現在のレイアウトを非表示にする ゲームは XGameStreamingHideTouchControls API を使用して、現在表示されているレイアウトを非表示にする必要があります。

ゲームの現在の状態に基づいてゲームのレイアウトを設定する例は以下のとおりです。

void OnGameStateChanged(GameState newState)
{
    // Toggle to the set of touch overlay controls which best match the new state of the game
    switch (newState)
    {
    case GameState::FirstPersonAction:
        XGameStreamingShowTouchControlLayout("FirstPersonAction");
        break;
    case GameState::Driving:
        XGameStreamingShowTouchControlLayout("Driving");
        break;
    case GameState::CutScene:
        // Don't show any touch overlay controls while the cut scene is rendering
        XGameStreamingHideTouchControls();
        break;
    }
}

ランタイムでの状態変更

ゲーム起動時の初期状態は、タッチ アダプテーション バンドルに含まれていた既定の状態によって定義されます。 タッチ コントロール レイアウトでは、実行時に変更される可能性のあるプロパティの状態をコントロールで参照する必要があります。

ゲームは、XGameStreamingUpdateTouchControlsState API を利用して、実行時に状態を更新することができます。

たとえば、"リロード" コントロールは、初期状態では無効ですが、その機能が必要になる場合には次の操作を利用して有効にすることができます。

//Example context file
{
  "$schema": "https://raw.githubusercontent.com/microsoft/xbox-game-streaming-tools/main/touch-adaptation-kit/schemas/context/v3.0/context.json",

  "state": {
    "enableReload": false
  }
}

//Example control in the layout:
{
    "type": "button",
    "action": "leftBumper",
    "enabled": {
        "$ref": "../../context.json#/state/enableReload"
    }
    ...
}

ゲームは、状態を更新するために、次のように API 呼び出しを行います。


// In this example, after the player has switched their active weapon - the game updates the
// enabled state of reload based on whether the player has extra magazines.
//
// Assumes passing in game structure that includes the active weapon with appropriate state.
//

void GameStreamingClientManager::UpdateStateAfterItemsChange(const playerWeapon& playerWeapon)
{
    // create an update for whether the reload button should be enabled
    XGameStreamingTouchControlsStateOperation reloadEnabled;
    reloadEnabled.operationKind = XGameStreamingTouchControlsStateOperationKind::Replace;
    reloadEnabled.path = "/enableReload";
    reloadEnabled.valueKind = XGameStreamingTouchControlsStateValueKind::Bool;
    reloadEnabled.booleanValue = playerWeapon.activeWeapon.reloadClips > 0;

    // combine all the updates into the update state call and make the call
    XGameStreamingTouchControlsStateOperation[1] updateOperations = {reloadEnabled};

    XGameStreamingUpdateTouchControlsState(updateOperations, _countof(updateOperations));
}