タッチ アダプテーション レイアウトのコントロールにセマンティック アイコンを提供することは、各コントロールの意図をゲームのプレイヤーに伝える効果的な方法です。 Xbox コントローラーに慣れているプレイヤーは一般的な A、B、X、Y ボタンをすばやく理解しますが、他のプレイヤーにとっては、コントロールがトリガーするアクションを表示すると、タッチ コントロールをより簡単に理解できるでしょう。 たとえば、Xbox A のボタンを設ける代わりに、ジャンプする人のイメージを記したボタンを設ける方が、プレイヤーが各コントロールが実行するアクションを理解するのに役立ちます。
組み込みのアイコン一式からコントロールに使うものを選択してもいいですが、ゲームの視覚的な美しさに合ったアートワークでカスタマイズすることもできます。 そうすることで、ゲームのタッチ コントロールがゲームとより一体化しているように見えるので、ゲームをプレイするエクスペリエンスもモバイルに対してよりネイティブに感じられます。
たとえば、標準アイコンを使用して構築されたレイアウトを次に示します:
同じレイアウトをカスタム アートワークで作ったものを次に示します:
このレイアウトがゲームに読み込むと、カスタム アートワークによって、タッチ コントロールのビジュアル スタイルとゲームのビジュアル スタイルが結び付けられます。
アセット ファイル
アセットは PNG ファイルであり、基本解像度の 1.5x、2.0x、3.0x、4.0x スケールで提供する必要があります。 これにより、ゲーム ストリーミング アプリは、ゲームがストリーミングされているデバイスの DPI に基づいて、表示するアセットの最適なバージョンを選択できます。 各アセットの種類の基本解像度は次の一覧に表示されます。
タッチ アダプテーション キットは、アセットのローカライズをサポートしています。これにより、ゲームのストリーミング先のデバイスの言語に応じて異なるアセットを提供できます。 アセットのローカライズされた各バージョンには、必要な解像度をすべて含める必要があります。
ディスク上にアセットをレイアウトする場合、ファイル構造は最初に言語 で整理され、次にアセット スケール別に整理されます。 たとえば、ファイル構造は次のようになります:
assets/
neutral/
@1.0x/
JoystickBackground.png
JoystickKnobBackground.png
JoystickKnobForeground.png
@1.5x/
JoystickBackground.png
JoystickKnobBackground.png
JoystickKnobForeground.png
@2.0x/
JoystickBackground.png
JoystickKnobBackground.png
JoystickKnobForeground.png
@3.0x/
JoystickBackground.png
JoystickKnobBackground.png
JoystickKnobForeground.png
@4.0x/
JoystickBackground.png
JoystickKnobBackground.png
JoystickKnobForeground.png
fr/
fr-CA/
@1.0x/
JoystickKnobForeground.png
@1.5x/
JoystickKnobForeground.png
@2.0x/
JoystickKnobForeground.png
@3.0x/
JoystickKnobForeground.png
@4.0x/
JoystickKnobForeground.png
@1.0x/
JoystickKnobBackground.png
@1.5x/
JoystickKnobBackground.png
@2.0x/
JoystickKnobBackground.png
@3.0x/
JoystickKnobBackground.png
@4.0x/
JoystickKnobBackground.png
このセットアップでは、カナダ フランス語は fr-CA
JoystickKnobForeground
アセット、fr
JoystickKnobBackground
アセット、および netural
JoystickBackground
アセットを使用します。 フランス フランス語では、fr
アセットを JoystickKnobForeground
と JoystickKnobBackground
の両方に、neutral
アセットを JoystickBackground
に使います。 他のすべての言語では、すべてに対して neutral
アセットが使用されます。
レイアウトからのアセットの参照
アセットは、アセットが適用されているコントロールのスタイル セクション内から参照されます。 アセットを参照するには、スタイルを設定するアイテムの型を "asset" にする必要があり、値は PNG 拡張子のないアセット ファイルの名前にする必要があります。 たとえば、上記のアセットでスタイルが設定されたジョイスティックは、次のように構成できます:
{
"type": "joystick",
"styles": {
"default": {
"background": {
"type": "asset",
"value": "JoystickBackground"
},
"knob": {
"faceImage": {
"type": "asset",
"value": "JoystickKnobForeground"
},
"background": {
"type": "asset",
"value": "JoystickKnobBackground"
}
}
}
}
}
このスタイルにより、ジョイスティックに使用されている 3 つのアセットのそれぞれについて、タッチ アダプテーション キットはプレイヤーのデバイスの言語と DPI を使用して、使用するレイアウトに最適なアセットを見つけ出します。 したがって、タッチ アダプテーション キットでは最適なアセットが自動的に見つけ出せるため、レイアウトでは使用する言語やアセット スケールは指定されません。
変数置換によるアセットの使用
また、XGameStreamingUpdateTouchControlsStateOnClient API を使用して、ランタイムでレイアウトによって使用されるアセットを変更することもできます。 これを行うには、コントロールに使われる可能性のあるアセットの一覧を、タッチ アダプテーション バンドルの context.json
ファイルで定義する必要があります。
context.json:
{
"$schema": "https://raw.githubusercontent.com/microsoft/xbox-game-streaming-tools/main/touch-adaptation-kit/schemas/context/v3.3/context.json",
"definitions": {
"potionButtonImages": [
"Empty",
"Healing",
"Invisibility",
"Mana"
]
},
"state": {
"potionButtonFaceImage": "Empty"
},
"allowedStateValues": {
"potionButtonFaceImage": {
"$ref": "#/definitions/potionButtonImages"
}
}
}
}
これにより、レイアウト内のポーション ボタン イメージに Empty.png
、Healing.png
、Invisibility.png
、または Mana.png
のうちのいずれかが使えるようにバンドルのコンテキストが設定されます。 現在選択されているイメージは、状態変数 potionButtonFaceImage
に格納されます。 ボタン自体は、このコンテキストへの参照を使用して構成されます。
layout.json:
{
"type": "button",
"styles": {
"default": {
"faceImage": {
"type": "asset",
"value": {
"$ref": "../../context.json#/state/potionButtonFaceImage"
}
}
}
}
}
これにより、コンテキストの potionButtonFaceImage 状態変数に現在格納されているアセットをフェイス イメージとして使用するようにボタンに指示します。
最後に、このボタンに現在表示されているイメージをゲームで変更する場合は、次のようなコードが使用されます:
HRESULT ChangePotion(XGameStreamingClientId client, const char* potionName)
{
XGameStreamingTouchControlsStateOperation updateOperations[1] = {};
updateOperations[0].operationKind = XGameStreamingTouchControlsStateOperationKind::Replace;
updateOperations[0].path = "/potionButtonFaceImage";
updateOperations[0].value.valueKind = XGameStreamingTouchControlsStateValueKind::String;
// potionName is one of "Empty", "Healing", "Invisibility", "Mana"
updateOperations[0].value.stringValue = potionName;
return XGameStreamingUpdateTouchControlsStateOnClient(client, _countof(updateOperations), updateOperations);
}
このコードは、potionButtonFaceImage 状態変数に格納されているアセットの名前を変更します。これにより、新しく選択されたアセットが、スタイルでこの状態を参照しているレイアウトに表示されます。
カスタム アセットのサイズ
次の表は、カスタム アセットを適用できる各コントロールの要素と、各アセットの 1.0 倍のスケールの最大ピクセル サイズをまとめたものです。
コントロール | スタイル指定可能な要素 | @1.0x ピクセル サイズ |
---|---|---|
ArcadeButton | background | 60 x 60 |
faceImage | 60 x 60 | |
ボタン | background | 60 x 60 |
faceImage | 60 x 60 | |
DirectionalPad | background | 60 x 60 |
ジョイスティック | background | 120 x 120 |
knob/background | 60 x 60 | |
knob/faceImage | 60 x 60 | |
スロットル | knob/background | 60 x 60 |
knob/faceImage | 60 x 60 | |
タッチパッド | 背景 (renderAsButton = true) | 60 x 60 |
背景 (renderAsButton = false) | 120 x 120 | |
faceImage | 60 x 60 |
ArcadeButton faceImage、Button faceImage、Joystick knob faceImage、Throttle knob faceImage、Touchpad faceImage アセットのピクセル サイズは次のとおりです。
スケール | ピクセル サイズ |
---|---|
@1.0x | 60 x 60 |
@1.5x | 90 x 90 |
@2.0x | 120 x 120 |
@3.0x | 180 x 180 |
@4.0x | 240 x 240 |
ArcadeButton background、Button background、DirectonalPad background、Joystick knob background、Throttle knob background、Touchpad (renderAsButton=true) background の各アセットのピクセル サイズは次のとおりです。
スケール | ピクセル サイズ |
---|---|
@1.0x | 60 x 60 |
@1.5x | 90 x 90 |
@2.0x | 120 x 120 |
@3.0x | 180 x 180 |
@4.0x | 240 x 240 |
Joysitck background とTouchpad (renderAsButton=false) background アセットのピクセル サイズは次のとおりです。
スケール | ピクセル サイズ |
---|---|
@1.0x | 120 x 120 |
@1.5x | 180 x 180 |
@2.0x | 240 x 240 |
@3.0x | 360 x 360 |
@4.0x | 480 x 480 |
イメージの量子化
タッチ アダプテーション バンドルを構築する場合、TAK CLI は、生成される .takx ファイルのサイズを小さくするために、提供された PNG に対して量子化を行います。 量子化はアセットの外観に影響を与えてはなりませんが、タッチ レイアウトに表示されるアセットが、イメージの作成時に期待した外観と一致することを確認することをお勧めします。
量子化プロセスがイメージのレンダリング方法に影響を与える場合は、バンドルの構築時に --no-asset-optimization
オプションを TAK CLI に渡すことによって無効化してもよいでしょう。