Enhanced Input
Enhanced Input は、Parrot で使用する、Epic Games で制作されたファーストパーティ プラグインです。 Unreal Engine 5 の最新バージョンを使用している場合は、デフォルトで有効になっています。 有効になっているかどうかは、[Edit (編集)] > [Plugins (プラグイン)] でチェックボックスをオンにすることで確認できます。
Enhanced Input は、Unreal Engine のデフォルトの入力システムに代わるものであり、複雑な入力処理やランタイム制御の再マッピングの標準となっています。 Epic Games の公式ドキュメントには、システムの概要と入力アセットの設定方法がわかりやすく記載されています。
主要概念
公式ドキュメントを改めて説明すると、Enhanced Input の主要概念として理解しておくべきものは以下のとおりです。
入力アクション
入力マッピング コンテキスト (IMC)
入力モディファイア
入力トリガー
Unity の新しい入力システムを使用したことがあれば、これらの概念はすでにご存知かと思います。
入力アクションとは、ゲームの特定のコンテキストにおいて「ゲーム内で実行されるアクションがどのような動作をするか」を表すものと考えるのが適切です。 たとえば、キャラクターが車に乗っている場合、「加速」や「ブレーキ」といったアクションを設定することを考えます。
入力マッピング コンテキストもこの例で役立ちます。 プレイヤーが車に乗り降りする際に、特定のキーやゲームパッド ボタンの動作を変更したい場合があります。
入力トリガーは、すべてのトリガー条件が満たされない限り、アクションが実行されないようにします。 たとえば、アクションをトリガーするために、プレイヤーが一定時間ボタンを押し続けるように設定したい場合などです。
入力モディファイアは入力値そのものを変更します。 デッド ゾーンは、生の入力値を緩和するためによく使用される入力モディファイアです。 Enhanced Input は、少し設定するだけでこれらの問題をすべて解決します。
Parrot の例を見てみましょう。 「Content/Input/Gameplay」の下に、「Actions」フォルダと「IMC_Gameplay」アセット ファイルがあります。 「Actions」フォルダで、IA_Jump アセットを見つけます。
ここでの値の型は Digital (bool) (デジタル (ブール型)) で、これはこのアクションの出力型を示します。 トリガーには以下の型があります。
押される
リリース済み
この入力アクションを見ると、マッピングされているキーまたはボタンは、必ず押下によってトリガーされ、ブール型の出力ステートを持つ必要があることがわかります。 ボタンを離すと、アクションの終了がトリガーされます。 ここでもう 1 つ重要な点は、トリガーとモディファイアの両方が入力マッピング コンテキストによってオーバーライドできることです。 ゲームプレイの入力マッピング コンテキストを見て、モディファイアのオーバーライドを実際に確認してみましょう。
IA_MoveAxis にはトリガーが設定されていないため、変化が検出されるとすぐにゲームパッドの左サムスティック X 軸の値が読み込まれます。 生の入力値を緩和するために、デッド ゾーン モディファイアを使用して入力の上限と下限を設定します。
IMC でオーバーライドを提供しない例として、ジャンプ マッピングがあります。
ここでは、トリガーが入力アクション自体から取得されるため、マッピングでトリガーを定義する必要はありません。 設定もアクションから継承されますが、再マッピングのセクションで説明するため、今は無視して構いません。
Enhanced Input イベント リスナー
アセットの設定が完了したら、実行時に使用するための設定を行う必要があります。 Parrot では、Enhanced Input ローカル プレイヤー サブシステムにバインドして、BP_ParrotPlayerController にイベント リスナーを設定します。 BeginPlay ノードから、IMC_Gameplay のマッピング コンテキストを追加します。
ここで重要なのは優先度パラメータです。 入力マッピング コンテキストは優先度によって評価されるため、コンテキストをレイヤー化する際にこの点に注意してください。 今はゲームプレイ コンテキストのみを使用します。
ここで Notify User Settings パラメータが true に設定されていることに注意してください。これは、後でランタイム入力再マッピングを行うために必要です。
マッピング コンテキストの準備ができたら、あとは必要なアクションに Enhanced Input のイベント ノードを追加するだけです。 以下はジャンプの例です。
このアクションは、プレイヤーがボタンを押したときに開始され、ボタンを離したときに完了します。 BP_ParrotPlayerController 内の他の入力アクションを見て、他の入力タイプがどのように処理されるかを確認してください。 必要な場合は C++ で入力イベントをバインドすることも可能です。詳細については、公式ドキュメントをご覧ください。
ランタイム入力再マッピング
Enhanced Input は、入力アクションにバインドされたキーを実行時に再マッピングする機能です。 この機能は動作しますが、まだ実験段階であるため、この機能を搭載してリリースする際には注意が必要です。 Parrot には、プレイヤーがキーを再マッピングできるキー バインディング画面があります。 これを実現するために、Enhanced Input と Epic Games の Common UI プラグインを組み合わせて、画面のウィジェットに適切なメタデータを提供しています。 Common UI の設定については、「Parrot のユーザー インターフェース」のドキュメントで説明されているため、先に進む前にそのセクションを参照してください。 このプラグインを設定することで、プラットフォーム固有の UI 要素を表示することもできます。
まず、プロジェクト設定で Enhanced Input のユーザー設定を有効にします。 これは、[Edit (編集)] > [ProjectSettings] > [Engine (エンジン)] > [Enhanced Input] にあります。 設定は以下のとおりです。
次に、入力アクション アセットに移動し、[Player Mappable Key Settings (プレイヤー マッピング可能キー設定)] を調整します。 [Name (名前)] フィールドは、すべての入力アクションで一意である必要があります。 [Display Name (表示名)] と [Category (カテゴリ)] は Parrot でローカライズされます。
IMC でキーを定義する際に、[Player Mappable Key Settings] をオーバーライドすることもできます。 ゲームプレイ IMC のジャンプ アクションでは、この設定を [Inherit Settings from Action (アクションから設定を継承)] のままにしているので、特別な操作は必要ありません
プレイヤー コントローラー ブループリントに入力マッピング コンテキストを追加する際、Notify User Settings パラメータが true に設定されていることを確認してください。
次のパートでは、Enhanced Input のアクションを Common UI に関連付ける方法について説明します。 Parrot での入力再マッピングに必要な事項についても説明しますが、このドキュメントは公式の「Common UI クイックスタート ガイド」の補足です。
次のステップとして、「Content/Input/UI」の下に新しい IMC (IMC_UI_Generic) を作成しました。
各入力アクションの [Player Mappable Key Settings (プレイヤー マッピング可能キー設定)] フィールドを設定し、適切な UI メタデータ データ アセットを指定する必要があります。 以下は、汎用的な受け入れ入力アクションとメタデータ アセットの例です。
これらの IMC と入力アクションは、Common UI が UI ナビゲーションによって呼び出されるアクションを認識するために必要です。 プレイヤーが UI 画面をナビゲートする際に常に呼び出す必要があるため、汎用的な受け入れとバック入力アクションは、その代表的な例です。 これらのマッピングは、CommonUIInputData のサブクラスである CommonUI 固有のデータ ブループリントで定義します。
次に、[Edit] > [ProjectSettings] > [Common Input Settings (共通入力設定)] で、入力データを汎用入力データ ブループリントに設定します。
重要なフィールドの設定が完了したら、ウィジェット画面の設定に進みます。 まず、静的画面用に基本的な Parrot 画面クラスを作成し、その他の画面用にアクティブ化可能なクラスを作成します。 静的画面とは、UI ナビゲーションを気にする必要のない HUD のようなものです。 アクティブ化可能な例としては、一時停止メニューが挙げられます。ポーズ メニューは戻るボタンが押されたことを認識する必要があり、ゲーム レイアウトのメニュー レイヤーに存在します。
画面階層については、「Parrot のユーザー インターフェース」のドキュメントで説明されていますが、参考までにここでも再度説明します。
BP 画面のクラス デフォルトには、オプションの入力マッピング コンテキストが設定されています。 これはウィジェットのアクティブ化/非アクティブ化時に適用され、クラスごとにオーバーライドできます。
UParrotActivatableScreen には、バック アクションを処理するための実装があります。 IA_UI_GenericBack イベント リスナーは、これを利用する派生ブループリントのイベント グラフで定義されています。 また、[Details (詳細)] パネルで [Is Back Handler (戻りハンドラである)] チェックボックスをオンにする必要があります。
C++ クラスと BP 内のコメントを参照して、さまざまな画面ウィジェットで戻るパターンがどのように使用されているかを確認してください。
基本クラスについて説明したので、キーバインディング画面を確認してみましょう。 WBP_KeyBindingsScreen は、「Content/UI/Widgets/Screens」にあります。 イベント グラフを自分で確認して、ユーザー設定とキー プロファイルに対してどのようにクエリが実行され、Enhanced Input からプレイヤー キー マッピング タイプが取得されるかを確認することをお勧めします。 このデータは、WBP_InputSelectorBox ウィジェットの追加と設定に使用されます。 WBP_InputSelectorBox ウィジェット内には、2 つの W_ParrotInputSelector ウィジェットがあります。
1 つはゲームパッド入力用、もう 1 つはキーボード入力用です。 Parrot 入力セレクターは、組み込みの入力セレクター ウィジェットを参考にしたカスタム ウィジェットです。 どちらのウィジェットも選択状態になり、入力を待機してから画面を更新します。
マウスとキーボードについては、Enhanced Input サブシステムから返されたテキストを使用して画面を更新します。
ゲームパッドの実装では、コントローラー固有の画像をクエリするために Common UI を利用しています。 今回は、「
Content/Input/UI/Platform」にCommonInput_Gamepad_Xboxという Xbox 用画像クラスを設定しました。 このクラスはUCommonInputBaseControllerDataから派生しています。
このクラスから派生することで、入力キーを画像付きブラシにマッピングできます。 次に、[Edit] > [Project Settings (プロジェクト設定)] > [Common Input Settings (共通入力設定)] でコントローラー データを設定し、プラットフォームに移動します。
データが接続されたら、残りの作業はウィジェットで行われます。 UParrotInputSelector と WBP_InputSelectorBox のコードとコメントは、Enhanced Input サブシステムと Common UI サブシステムを使用した再マッピング機能がどのように動作するかを正確に理解する上で役立ちます。
最後に注目すべき重要な機能は、マッピングされたキーの保存方法です。 これは、WBP_KeyBindingsScreen の SaveKeyMappings で実行されます。 この関数はすべてのセレクター ボックス ウィジェットを反復処理し、ユーザー設定に組み込まれている Apply Settings と Save Settings 関数を使用します。 Save Settings は、保存ゲーム ファイル「EnhancedInputUserSettings.sav」をディスクに書き込みます。 このファイルは、「Project Directory > Parrot > Saved-SaveGames」にあります。
すべてが正しく設定されていれば、キーバインディング画面が動作します。
右下隅に、キーが再マッピングされたときに更新されるアクション ウィジェットがあります。 このウィジェットは WBP_ParrotGamepadActionWidget で、「Content/UI/Widgets/Common」にあります。 これは、Common UI の UCommonActionWidget クラスを多用しています。このクラスは、先ほど作成した共通入力データを用いて、入力アクションに応じてプラットフォーム固有のアイコンを表示するために構築されています。 Common UI を活用することで、ゲームの Enhanced Input アクションを参照する新しいウィジェットを必要に応じて簡単に作成できます。