複雑な入力処理やランタイム制御の再マッピングなど、より高度な入力機能を必要とする Unreal Engine 5 (UE5) プロジェクトの場合、実験的機能の Enhanced Input プラグイン により、デベロッパーは Unreal Engine 4 (UE4) からの簡単なアップグレードパスとエンジンのデフォルト入力システムとの下位互換性を利用できます。 このプラグインにより、放射状のデッド ゾーン、コード アクション、コンテキストに応じた入力および優先順位付けを行う機能、さらに アセット ベースの環境で raw 入力データのフィルタリングと処理を拡張する機能が実装されます。
使用を開始する
Enhanced Input を使用するようにプロジェクトを構成する際は、Enhanced Input プラグインを有効化します。これには、エディタの [Edit (編集)] ドロップダウン メニューを開き、 [Plugins (プラグイン)] を選択します。[Plugin (プラグイン)] リストの [Input] セクションで [Enhanced Input] プラグインを見つけて有効にし、エディタを再起動します。

エディタを起動すると、プラグインが有効になります。
エディタが再起動したら、UE5 のデフォルト入力ハンドラの代わりに Enhanced Input プラグインのクラスを使用するようにプロジェクトを設定できます。[Edit] ドロップダウン メニューに移動して、[Project Settings (プロジェクト設定)] を選択します。[Project Settings (プロジェクト設定)] の [Input (インプット)] セクション ([Engine (エンジン)] という見出しの下にある) を特定して、 [Default Classes (デフォルト クラス)] 設定を見つけます。これには、最初、標準の PlayerInput クラスと InputComponent クラスが指定されています。
拡張入力を使用するには、これらの設定をそれぞれ EnhancedPlayerInput と EnhancedInputComponent に変更します。
エディタから、チルダキー (〜) を押してコンソール コマンド ウィンドウを開き、次のコマンドを入力します。
showdebug enhancedinput
このコマンドは、すべてが必要に応じて構成されるまで、次のステップを提供します。
主要概念
拡張入力システムには、次の 4 つの主要な概念があります。
- 入力アクション (Input Actions) は拡張入力システムとプロジェクトのコードの間の通信リンクです。入力アクションは、ジャンプしたりドアを開けたりするなど、インタラクティブなキャラクターが実行する可能性のあるあらゆるアクションに相当します。また、ボタンを長押ししてキャラクターのウォーク動作をランに変更するなど、ユーザー入力の状態を示す際にも使用できます。入力アクションは raw 入力とは異なるものです。入力アクションはそのアクションをトリガーした特定の入力には認識しないものの、その入力の現在の状態は認識しており、最大 3 つの独立した浮動小数点軸で入力値を報告することができます。
例えば、「アイテムを拾う」アクションでは、ユーザーが何かを拾おうとしているかどうかを示すオン/オフの状態のみが必要で、「歩行」アクションでは、ユーザーが歩いていこうとしている方向と速度を指定するために 2 つの軸が必要です。
- 入力マッピング コンテキスト (Input Mapping Contexts) は、ユーザー入力を入力アクションにマッピングします。また、入力マッピング コンテキストはユーザーごとに動的に追加、削除したり、優先順位を付けることができます。また、 Enhanced Input Local Player Subsystem を使用してローカル プレイヤーに 1 つ以上のこうしたコンテキストを適用し、適用したコンテキストに優先順位を付けることで、同じ入力を受け取る複数のアクション間の競合を解決できます。
たとえば、キャラクターがワールドを歩き回る際にドアを開けたり、キャラクターがバックパックを確認してアイテムを選択したりできる単一のボタンを考えてください。
キャラクターがドアに近づくと、都度「ドアを開ける」コンテキストを追加できます。一方、キャラクターがバックパックを開いている場合は、「ドアを開ける」コンテキストに優先する「アイテムを選択する」入力マッピング コンテキストを追加して、キャラクターがドア付近に立ってバックパックを確認している時に、バックパックからアイテムを選択できるようにします。そしてキャラクターがバックパックを閉じたら「アイテムを選択する」コンテキストを削除して、「ドアを開ける」コンテキストを有効化します。
こうした入力マッピング コンテキストにより、ユーザーの入力がキャラクターの状況に基づいて正しく解釈されることが保証され、ドアとバックパックのシステムを意識して入力処理レベルでコードをプログラミングする必要がなくなります。
-
モディファイア (Modifiers) は、ユーザーのデバイスから受け取る raw 入力の値を調整します。入力マッピング コンテキストは、入力アクションのそれぞれの raw 入力に関連付けられたモディファイアをいくつでも含むことができます。このプラグインには、デッド ゾーン、複数フレームにわたる入力のスムージング、ローカル空間からワールド空間への入力ベクターの変換をはじめとする一般的なモディファイアが含まれています。さらに、デベロッパーが独自のモディファイアを作成することもできます。
-
トリガー (Triggers) はポストモディファイア入力の値、または他の入力アクションの出力の大きさを使用して、入力アクションを有効にする必要があるかどうかを決定します。入力マッピング コンテキスト内の入力アクションは、入力ごとに 1 つ以上のトリガーを含むことができます。例としては、写真を撮るには、カメラの照準を合わせるための別の入力アクションが有効であるときに、ユーザーが左マウス ボタンを 1/4 秒押す必要がある場合などが挙げられます。
以上の概念を組み合わせることで、デベロッパーはシンプルな入力システムから複雑な入力システムまで素早くセットアップし、プロジェクト コードを変更することなく入力システムを調整することができます。
入力アクション
入力アクション (Input Action) は、システムとユーザーのプロジェクトのコードを関連付けます。入力アクションを作成するには、コンテキスト ブラウザ で右クリックして、 [Input (入力)] オプションを展開し、[Input Action (入力アクション)] を選択します。入力アクションをトリガーするには、その入力アクションを入力マッピング コンテキストに設定し、その入力マッピング コンテキストをローカル プレイヤーの Enhanced Input Local Player Subsystem に追加する必要があります。

トリガーされた入力アクションに Pawn クラスを応答させるには、ブループリント グラフ にイベントを追加する必要があります。各入力アクションは、入力アクションのアセットの名前でイベントを生成します。例えば、入力アクションを作成し、そのアセットに「MyAction」という名前を付けると、イベント名は「MyAction」になります。ブループリント グラフ のブランクのスペースを右クリックして、コンテキスト メニューの Enhanced Action Events カテゴリから適切なイベントを選択します。アセット名を入力して、コンテキスト メニューの結果を絞り込むこともできます。

ブループリント グラフの右クリックで表示されるコンテキスト メニューから MyAction イベントを見つけます。
同じ名前の異なるフォルダに複数の入力アクション アセットがある場合、このリストにはその名前のイベントが複数表示されます。これらのイベントにマウスのカーソルを合わせると、ツールチップが表示されます。ツールチップではフォルダ パスを含む完全なアセット名が表示されるので、目的のイベントを確実に選択できます。ブループリントにイベントを追加すると、イベントは折りたたまれます。ノードを展開すると、他の実行ピンや追加データを確認できます。

完全に展開されたイベント ノード。これは「MyAction」の状態に基づいて各ティックで適切な 1 つまたは複数のピンを実行します。
入力マッピング コンテキスト
入力マッピング コンテキスト は、1 つ以上の入力アクションをトリガーするためのルールを記述します。Input Mapping Context の基本的な構造は、最上位レベルに入力アクションのリストを持つ階層です。入力アクション レベルの下には、キー、ボタン、移動軸などの各入力アクションをトリガーできるユーザー入力のリストがあります。
最下位レベルには、各ユーザー入力の入力トリガーと入力モディファイアのリストがあります。このリストを使用すると、入力の raw 値のフィルタリングまたは処理方法、および階層の最上位にある入力アクションを制御するために満たす必要のある制約事項を決定することができます。
どの入力にも複数の入力モディファイアと入力トリガーを設定できます。このような入力モディファイアおよび入力トリガーは、ユーザーが作成するリストに表示される順に評価されます。これは、各ステップの出力を次のステップの入力として使用する入力モディファイアにとって特に重要です。
入力マッピング コンテキストを作成するには、 コンテキスト ブラウザ を右クリックして、 [Input] オプションを展開し、 [Input Mapping Context] を選択します。

入力マッピング コンテキストには関連するすべての入力アクションを設定します。シンプルなプロジェクトでは、すべての入力アクションを 1 つの入力マッピング コンテキストにまとめられる場合があります。一方、複雑なプロジェクトでは、ローカル プレイヤーが一度に複数のアクティブな入力マッピング コンテキストを持つことができるため、複数の入力マッピング コンテキストを使用すると適切に機能します。
例えば、泳いだり、歩いたり、車両を運転したりできるキャラクターは、複数の入力マッピング コンテキストを与えることができます。1 つの入力マッピング コンテキストは常に利用可能で、常に同じユーザー入力にマッピングされている一般的なアクション用で、その他の入力マッピング コンテキストは個々の移動モードごとに追加されます。
デベロッパーは、車両関連の入力アクションを別の入力マッピング コンテキストに設定することができます。これにより、車両に乗車したときにローカル プレイヤーに車両関連の入力アクションを追加し、車両から出たときにローカル プレイヤーからこれらのアクションを削除できます。
これにより、不適切な入力アクションが実行されないようにすることで、最適化およびバグの防止が行いやすくなります。さらに、相互に排他的な入力マッピング コンテキストを使用して入力の競合を回避することで、ユーザー入力をさまざまな入力アクションに使用する際に、入力が誤ったアクションをトリガーすることを防ぎます。
詳細については、「モディファイア」および「トリガー」のセクションを参照してください。

この入力マッピング コンテキストは、実行するための入力アクションを示しています。これは、ゲームパッドの左サムスティックを傾けるなど、複数の入力によってアクティブ化でき、両方の軸を 1 つの入力にまとめることができます。その入力の raw 値は「Dead Zone」入力モディファイアで処理され、結果の値が「Hold」入力トリガーに送信され、「RunAction」入力アクションを制御します。

このドロップダウン メニューには多くの入力バインディングがあります。入力バインディングをより素早く選択するには、ドロップダウンの左にある小さなボタンをクリックしてから、バインドしたいキーまたはボタンを押します。

このシンプルな入力マッピング コンテキストは、ランとジャンプの入力アクションをサポートしています。
入力マッピング コンテキストの設定が完了したら、それをポーンのプレイヤー コントローラーに関連付けられている ローカル プレイヤー に追加できます。これを行うには、ポーンのコントローラーをプレイヤー コントローラーにキャストして、その Enhanced Input Local Player Subsystem を取得し、入力マッピング コンテキストをこのシステムに整数の優先順位の値とともに追加します。また、Enhanced Input Local Player Subsystem では特定の入力マッピング コンテキストのクエリまたは削除、またはすべての入力マッピング コンテキストのクリアもサポートしています。
追加した各入力マッピング コンテキストにより、含まれる入力アクションをトリガーして、ポーンのブループリント グラフで適切なイベントを実行することができます。ゲームプレイ中はいつでも入力マッピング コンテキストのセットを変更できます。
入力モディファイア
入力モディファイア (Input Modifier) は、UE5 が受け取る raw 入力の値を、入力トリガーに送信する前に変更するプリプロセッサーです。Enhanced Input プラグインは、軸の順序を変更したり、「デッド ゾーン」を実装したり、軸入力をワールド空間に変換したり、その他のタスクを実行するための様々な入力モディファイアを備えてリリースされています。
入力マッピング コンテキストが含む入力アクションに関連付けられた各入力は、その入力の 1 つまたは複数の入力トリガーに進む前に、ユーザーが定義した一連の入力モディファイアによって調整されます。入力モディファイアはリストされている順に適用され、各入力モディファイアからの出力値が次の入力値になります。
-
入力モディファイアを作成する必要がある場合は、入力モディファイア を親として使用して新しい ブループリント子クラス を作成することで、独自のモディファイアを作成することができます。
入力モディファイア子クラスの作成
-
次に、[My Blueprint] > [Functions] > [Override] の順にクリックして、ドロップ メニュー から Modify Raw 機能を選択します。
出力パラメータは Input Action Value で、 Vector のように 3 つの float 値を含んでいます。関数の入力パラメータは Player Input オブジェクト、入力ハードウェアまたは前の入力モディファイアの Current Value と Delta Time を含みます。
Modify Raw から戻した入力アクション値は、(あれば) 次の入力モディファイア、または最初の入力トリガーに移ります。
方向入力
入力モディファイアの良い活用例は、1 つの入力アクションを使用した 2 方向入力です。マウスやゲームパッドのアナログ スティックでの 2 方向の動きの読み取りは、少なくとも 2 つの軸をサポートする入力アクションを作成し、適切な入力を入力マッピング コンテキストに追加するだけで済みます。
Enhanced Input は、キーボードの方向矢印や一般的な「WASD」キー構成のような 1 方向のソースからの入力をサポートするので、正しい入力モディファイアを適用することでこの制御スキームを使用することができます。具体的には、一部のキーを負として登録するために Negate (ネゲート) を、一部のキーをデフォルトの X 軸ではなく Y 軸として登録するために [Swizzle Input Axis Values (入力軸値をスイズル)] を使用します。
文字キー | 矢印キー | 目的の入力の解釈 | 必要な入力モディファイア |
---|---|---|---|
W | 上 | 正の Y 軸 | Swizzle Input Axis Values (YXZ または ZXY) |
A | 左 | 負の X 軸 | Negate |
S | Down | 負の Y 軸 | Negate Swizzle Input Axis Values (YXZ または ZXY) |
D | 右 | 正の X 軸 | (なし) |

方向矢印または「WASD」キーのこの解釈を使用すると、1 方向入力を 2 方向入力アクションにマッピングすることができます。
各キーは正の 1 方向の値を報告するので、この値は常に X 軸を占有し、特定のティックで 0.0 または 1.0 の値を持ちます。
左および下の入力に対して値をネゲートして、軸の順序を切り替え、上と下の入力に対して、入力の X 軸の値が Y 軸に移動するようにすることで、入力モディファイアを使用して 1 方向入力のセットを 1 つの 2 方向入力値として解釈することができます。
入力トリガー
入力トリガーは、ユーザー入力が入力モディファイアのオプション リストで調整された後、その入力マッピング コンテキスト内で対応する入力アクションをアクティブにするかどうかを決定します。ほとんどの入力トリガーは入力自体を分析します。つまり、最小有効化値を確認して、短いタップ、長押し、または通常の「押す」または「離す」イベントなどのパターンを検証します。このルールの例外の 1 つが、別の入力アクションでのみトリガーされる [Chorded Action] 入力トリガーです。デフォルトでは、入力に対するユーザー アクティビティは、ティックごとにトリガーされます。
入力トリガーには次の 3 つのタイプがあります。
-
Explicit タイプは、入力トリガーが成功した場合に入力を成功させます。
-
Implicit タイプは、入力トリガーと他のすべての暗黙的タイプの入力トリガーが成功した場合にのみ入力を成功させます。
-
Blocker タイプは、入力トリガーが成功した場合に入力を失敗させます。
以下は、各トリガー タイプが他のトリガー タイプとの状況でどのように相互作用するかの論理的な例です。
Implicits == 0, Explicits == 0 - 値が 0 でない限り、常に起動する。
Implicits == 0, Explicits > 0 - 最低 1 つの explicit が起動している。
Implicits > 0, Explicits == 0 - すべての implicit が起動している。
Implicits > 0, Explicits > 0 - すべての implicit と最低 1 つの explicit が起動している。
Blockers - トリガーの失敗を強制するためにすべての他のトリガーをオーバーライドする。
ユーザー入力を処理すると、入力トリガーは次の 3 つの状態のいずれかを返します。
-
None は、入力トリガーの条件が満たされていないため、入力トリガーが失敗したことを示します。
-
Ongoing は、入力トリガーの条件が部分的に満たされ、入力トリガーが処理中であるがまだ成功していないことを示します。
-
Triggered は、入力トリガーのすべての条件が満たされ、入力トリガーが成功したことを示します。
Input Trigger の基本クラス、すわなち Input Trigger Timed Base を拡張することで、独自の入力トリガーを作成することができます。Input Trigger Timed Base は、入力を受け入れて Ongoing の状態を返す前に、入力が一定時間押し続けられていることを確認します。
指定された Input Trigger Timed Base クラスは Triggered ステートを返すことはありません。新しい入力トリガー子クラス内の関数をオーバーライドして、ユーザー入力に対する応答を決定します。関数 Get Trigger Type は入力トリガーのタイプを決定します。Update State はプレイヤーの入力オブジェクト、現在の入力アクション値、デルタ時間を受け取り、None、Ongoing、Triggered のステートを返します。
