다음을 통해 공유


게임 상태에 따라 터치 컨트롤 레이아웃 변경

게임은 플레이어에게 표시되는 터치 레이아웃을 변경하거나 현재 표시된 레이아웃이 사용 중인 상태를 수정할 수 있습니다. 두 방법을 함께 사용하면 플레이어에게 가장 자연스러운 환경을 만들 수 있습니다.

레이아웃 변경

레이아웃 변경은 다음과 같은 경우에 사용해야 합니다.

  • 다양한 제어 체계 간 전환(예: 차량 운전 및 1인칭 슈팅)
  • 터치 레이아웃을 일시적으로 숨기기(전체 터치 환경, 영화 같은 환경 사용 목적)

상태 변경

터치 적응 번들의 컨텍스트 부분에 포함된 게임 상태 변경은 다음과 같은 경우에 사용해야 합니다.

  • 플레이어의 현재 게임 상태에 따라 컨트롤의 이미지/아이콘 체계를 수정합니다. 일부 예시는 다음과 같습니다.
    • 플레이어가 선택한 무기에 따라 발사 버튼의 이미지를 변경합니다.
    • 플레이어가 현재 인벤토리에 있는 아이템에 따라 기능의 이미지를 변경합니다.
  • 플레이어의 현재 게임 상태에 따라 컨트롤의 시각적 상태(표시성 및 사용)를 수정합니다. 일부 예시는 다음과 같습니다.
    • 플레이어에게 탄약이 없는 경우 로드 버튼이 사용되지 않도록 설정합니다.
    • 플레이어가 상호 작용할 수 있는 항목에 접근할 때 상호 작용 버튼을 표시하고 이동 시 보이지 않도록 합니다.

런타임 시 레이아웃 변경

지정된 레이아웃 표시 게임은 XGameStreamingShowTouchControlLayoutAPI를 사용하여 새 레이아웃을 표시해야 합니다.

현재 레이아웃 숨기기 게임은 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));
}