Unity 用の Input SDK をバージョン 1.1 にアップグレードする

このガイドでは、ゲームを Input SDK for Unity の 1.0 から 1.1 にアップグレードする方法について説明します。Java と Kotlin の手順については、こちらをクリックしてください。

リリースノート

PC 版 Google Play Games は、Input SDK を使用してゲームが提供するキー バインディングに基づくキーボード コントロールの再マッピングをサポートしています。

ユーザーがこの機能にアクセスするには、オーバーレイを開き、コントロールを選択してから、再マッピングするアクションをクリックします。

PC 版 Google Play Games は、ユーザーが再マッピングしたすべての入力をゲームのデフォルト入力にマッピングします。これにより、ゲームがプレーヤーの再マッピングを認識する必要がなくなります。ゲーム内のキーボード コントロールの表示など、ゲーム内アクションの新しい入力を把握する必要がある場合は、必要に応じてコールバックを登録してイベントの再マッピングを通知できます。

PC 版 Google Play Games では、ユーザーの再マッピングされたコントロールがローカルに保存され、ゲーム セッション間で維持されます。これらの設定はローカルに保存されるため、モバイル エクスペリエンスに影響を与えることはありません。また、これらの設定は PC 版 Google Play Games をアンインストールすると削除されます。設定は複数の PC デバイスの間では保持されません。

ゲーム内でキーの再マッピングを有効にするために Input SDK をアップグレードする必要はありませんが、サポートされていない設定が検出された場合、ゲームで再マッピングが無効になります。

入力再マッピング エクスペリエンスを制御する場合、またはゲームで再マッピング機能が無効になっている場合は、次の手順を行います。

  • Input SDK 1.1.1-beta にアップグレードします。
  • サポートされていない設定を避けるため、キー バインディングを更新します。
  • InputMap更新して、再マッピング機能を有効にします。

ゲームの再マッピング機能を無効にし、一方でキー バインディングの読み取り専用バージョンを引き続き表示するには、次の手順を行います。

  • Input SDK 1.1.1-beta にアップグレードします。
  • InputMap を更新して、再マッピング機能を無効にします。

Input SDK のバージョンを 1.1.1-beta にアップグレードすると、PC 版 Google Play Games の高度な再マッピング機能を利用できます。InputContexts を使用してゲームのさまざまなシーンのコントロールを定義し、再マッピング イベントをリッスンするコールバックを追加し、ユーザーが再マッピングできない予約済みキーのセットを定義し、InputActionInputGroup、または InputMap ごとに再マッピング機能を無効にします。

アップグレードの際は、次の例外を考慮してください。

サポートされていない設定

次の条件が満たされない場合、入力の再マッピングは無効になります。

  • 複数のキーを使用する InputAction は、修飾キーと非修飾子キーで構成する必要があります。たとえば、Shift+A は有効ですが、A+BCtrl+AltShift+A+Tab は無効です。

  • 2 つ以上の InputAction オブジェクトまたは InputGroup オブジェクトで同じ一意の ID を共有できません。

InputContext のご紹介

InputContext を使用すると、ゲーム内の複数のアクションに同じキーを使用しても競合が発生しません。これにより、ゲームにおいて Space でゲームプレイ中のジャンプやメニュー選択の確定を行っている場合、プレイヤーはメニューでの Space キーを Enter キーに、ゲームプレイ中の Space を [] キーに個別に再マッピングできます。

次のシーケンス図は、実行時に setInputContext() API がどのように機能するかを示しています。

キーの再マッピング時の Input SDK のフローを示す図。

アップグレード

Input SDK の以前の実装を使用しているゲームでも、サポートされていない設定を使用している場合を除き、基本的な再マッピングがサポートされます。以前のバージョンの Input SDK をゲームで使用している場合は、0.0.4 から 1.0.0 ベータ版へのアップグレード ガイドをご覧ください。

1.1.1 ベータ版にアップグレードすると、次のような新機能を利用できます。

  • コンテキストの変更をトリガーする。
  • キーマッピング イベントの通知を受信する。
  • アクション、グループ、コンテキスト、マップにより再マッピングを無効化する。

設置

Unity プラグイン v1.1.1-beta を利用できます。ゲームにインストールされている Input SDK の以前のバージョンを削除し、現在のバージョンにアップグレードする必要があります。

Input SDK v1.1.1-beta をゲームに追加するには、SDK を追加するをご覧ください。

静的フィールドを定義する

バージョン 1.1.1-beta では、InputActionsInputGroupsInputContextsInputMap オブジェクトを InputMappingProvider クラスの静的フィールドとして定義することをおすすめします。これらのフィールドは、アプリの他の部分からアクセスできるためです。

#if PLAY_GAMES_PC
using Java.Lang;
using Java.Util;
using Google.Android.Libraries.Play.Games.Inputmapping;
using Google.Android.Libraries.Play.Games.Inputmapping.Datamodel;

public class InputSDKMappingProvider : InputMappingProviderCallbackHelper
{
    public static readonly string INPUT_MAP_VERSION = "1.0.0";

    private static readonly InputAction driveInputAction =
            InputAction.Create(...);
    private static readonly InputGroup roadInputGroup = InputGroup.Create(...);
    public static readonly InputContext roadControlsContext =
            InputContext.Create(...);
    public static readonly InputMap inputMap = InputMap.Create(...);

    public override InputMap OnProvideInputMap()
    {
        return inputMap;
    }
}
#endif

InputActions を更新する

Input SDK 1.0.0-betaInputAction.create() メソッドは非推奨となりました。InputAction にバージョン ID が付与され、再マッピング可能かどうかをマークできます。Input SDK の 1.0.0-beta create() メソッドを使用して定義した InputAction は、デフォルトで再マッピング可能で、バージョン情報がありません。

Input SDK 1.0.0-beta の InputAction

var driveAction = PlayInputAction.Create(
    "Drive",
    (long)InputEventIds.DRIVE,
    PlayInputControls.Create(
        new[] { AndroidKeyCode.KEYCODE_SPACE },
        new List<PlayMouseAction>()
    )
);

Input SDK 1.1.1-beta の InputAction

private static readonly InputAction driveInputAction = InputAction.Create(
    "Drive",
    (long)InputEventIds.DRIVE,
    InputControls.Create(
        new[] { new Integer(AndroidKeyCode.KEYCODE_SPACE) }.ToJavaList(),
        new ArrayList<Integer>()),
    InputEnums.REMAP_OPTION_ENABLED
);

Input SDK 1.1.1-beta の InputAction(バージョン文字列を使用)

private static readonly InputAction driveInputAction = InputAction.Create(
    "Drive",
    InputControls.Create(
        new[] { new Integer(AndroidKeyCode.KEYCODE_SPACE) }.ToJavaList(),
        new ArrayList<Integer>()),
    InputIdentifier.Create(
        INPUT_MAP_VERSION, (long)InputEventIds.DRIVE),
    InputEnums.REMAP_OPTION_ENABLED
);

キー バインディングのバージョニングの詳細については、キー ID をトラッキングするをご覧ください。

InputGroups を更新する

Input SDK 1.1.1-beta では、各 InputGroup を一意に識別する必要があります。各 InputAction は、関連するアクションのコレクションである InputGroup に属します。これにより、ゲームプレイ中のコントロールのナビゲーションと見つけやすさが向上します。InputAction では 1 つの InputContext のすべてのアクションの間で一意の ID が必要ですが、同様に InputGroup でも既存のグループ間で一意の ID が必要です。

このセクションの例では、ゲームに 2 つの InputContext オブジェクトがあり、それぞれメインメニューとゲームプレイを表しています。これらのコンテキストで、InputGroup ごとに次の列挙型を使用して適切な ID をトラッキングします。

public enum InputGroupsIds
{
    // Main menu scene
    BASIC_NAVIGATION, // WASD, Enter, Backspace
    MENU_ACTIONS, // C: chat, Space: quick game, S: store
    // Gameplay scene
    BASIC_MOVEMENT, // WASD, space: jump, Shift: run
    MOUSE_ACTIONS, // Left click: shoot, Right click: aim
    EMOJIS, // Emojis with keys 1,2,3,4 and 5
    GAME_ACTIONS, // M: map, P: pause, R: reload
}

InputAction と同様に、Input SDK 1.0.0-betaInputGroup.create() メソッドも非推奨になりました。ゲームの InputGroup を更新し、バージョン ID と、グループ内の InputAction オブジェクトが再マッピング可能かどうかを示すブール値を設定する必要があります。Input SDK 1.0.0-beta で非推奨の create() メソッドで作成されたグループは再マッピングが可能で、ID は 0、バージョン ID は空の文字列("")です。

Input SDK 1.0.0-beta の InputGroup

var gameInputGroup = PlayInputGroup.Create(
    "Road controls",
    new List<PlayInputAction>
    {
        driveAction,
        turboAction,
        openGarageAction,
        openPgsAction,
        openStoreAction
    }
);

Input SDK 1.1.1-beta の InputGroup

private static readonly InputGroup roadInputGroup = InputGroup.Create(
    "Road controls",
    new[]
    {
        driveInputAction,
        turboInputAction,
        openGarageInputAction,
        openPgsInputAction,
        openStoreInputAction,
    }.ToJavaList(),
    (long)InputGroupsIds.ROAD_CONTROLS,
    // All input actions of this group will be remappable unless specified
    // the contrary by the individual input actions.
    InputEnums.REMAP_OPTION_ENABLED
);

Input SDK 1.1.1-beta の InputGroup(バージョン文字列を使用)

private static readonly InputGroup roadInputGroup = InputGroup.Create(
    "Road controls",
    new[]
    {
        driveInputAction,
        turboInputAction,
        openGarageInputAction,
        openPgsInputAction,
        openStoreInputAction,
    }.ToJavaList(),
    InputIdentifier.Create(
        INPUT_MAP_VERSION, (long)InputGroupsIds.ROAD_CONTROLS),
    // All input actions of this group will be remappable unless specified
    // the contrary by the individual input actions.
    InputEnums.REMAP_OPTION_ENABLED
);

キー バインディングのバージョニングの詳細については、キー ID をトラッキングするをご覧ください。

InputMap を更新する

Input SDK 1.0.0-betaInputMap.create() メソッドは非推奨となりました。InputMap を更新してバージョン ID を割り当てるか、再マッピング機能を完全に無効にするか、ユーザーによる再マッピングに使用されないようにする予約済みキーのリストを割り当てます。Input SDK の 1.0.0-beta create() メソッドを使用して定義した InputMap はいずれもデフォルトで再マッピング可能で、ID は 0 です。また、予約済みキーはありません。

Input SDK 1.0.0-beta の InputMap

var gameInputMap = PlayInputMap.Create(
    new List<PlayInputGroup>
    {
        gameInputGroup,
        menuInputGroup
    },
    PlayMouseSettings.Create(false, false)
);

Input SDK 1.1.1-beta の InputMap


public static readonly string INPUT_MAP_VERSION = "1.0.0";
public static readonly long INPUT_MAP_ID = 0;

public static readonly InputMap inputMap = InputMap.Create(
    new[] { roadInputGroup, menuInputGroup }.ToJavaList(),
    MouseSettings.Create(false, false),
    InputIdentifier.Create(INPUT_MAP_VERSION, INPUT_MAP_ID),
    // Use ESC as reserved key
    InputEnums.REMAP_OPTION_ENABLED,
    new[]
    {
        InputControls.Create(new[]
        {
            new Integer(AndroidKeyCode.KEYCODE_ESCAPE)
        }.ToJavaList(),
        new ArrayList<Integer>())
    }.ToJavaList()
);

次のステップ

InputContexts を使用してシーンごとに異なるコントロールを割り当てるか、InputRemappingListeners を使用して再マッピング イベントの通知を受け取ることでゲームの UI を更新し、1.1.1-beta へのアップグレードを続けます。

キー バインディングを更新する場合は、キー バインディングの設計に関するベスト プラクティスを参照し、再マッピング機能の制約制限を考慮してください。