Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4.26 Enhanced Inputについて

そろそろ正式版がリリースされそうですが、今回もUE4.26ネタです。

UE4.26 Previewの概要については以下から。
forums.unrealengine.com

今回は数ある4.26の新機能であるEnhanced Inputについてを解説します。Enhanced Inputはその名前の通り、強化された入力のシステムです。既存の入力システムでは微妙に届きづらなかった部分にもアクセスが可能になっています。

では早速使い方を解説していきましょう。

前準備

まずはEnhanced Inputを使える状態にしましょう。Enhanced Inputはプラグイン形式で提供されているので、まずはプラグインを有効化し、エディターを再起動する必要があります。

f:id:alwei:20201128163214p:plain

次にプロジェクト設定から"Input"→"Default Player Input Class"と"Default Input Component Class"を"EnhancedPlayerInput"と"EnhancedInputComponent"に切り替えておきます。

f:id:alwei:20201128163417p:plain

これでEnhanced Inputを使う準備が整いました。

InputActionとInputMappingContextの追加

ここでアセットを新規作成します。コンテンツブラウザー内で"Input"→"Input Action"、"Input Mapping Context"を追加します。

f:id:alwei:20201128163518p:plain

Input Actionは入力ごとの設定を格納するためのファイルです。Input Mapping Contextが一覧の入力設定をキーごとにマッピングした集合データのファイルです。

まずはInput Actionを開いてみましょう。

f:id:alwei:20201128163720p:plain

色々な設定があるので個別にみていきます。

Consume Input → 入力が複数あった場合、先行した入力で消耗し、その後の入力は受け取らないかの設定です。
Trigger When Paused → ゲームポーズ中でも入力がトリガーされるかの設定です。
Reserve All Mappings → 自分よりも優先度の高いマッピングが存在した場合、上書きせずに保持したままにするかの設定です。
Value Type → 入力値を表す値をBoolean、Float、Vector2、Vector3のどの値で受け取るかを設定します。
Triggers → 入力のトリガーをどのように受け取るかを追加します。詳細は後述。
Modifiers → 入力値に加工を加え、更に変更する設定を追加します。詳細は後述。

この中で複数の選択がある、TriggersとModifiersの項目についての説明です。

Triggers

Chorded Action → このトリガーを呼ぶために別のInputActionをトリガーとして設定します。
Down → 一番一般的なボタンを押している間に呼び出されるトリガーを設定します。
Hold → 指定秒ボタンを押し続けるとトリガーを設定します。Hold時に1度だけ呼び出すOne Shotも設定可能です。
Hold And Release → ボタンを押し続けた時と離した際に呼び出されるトリガーを設定します。
Pressed → ボタンを押した際に呼び出されるトリガーを設定します。Downとは違い、トリガーは1度のみです。
Released → ボタンを離した際に呼び出されるトリガーを設定します。
Tap → 指定秒ボタンを押して離した際に呼び出されるトリガーを設定します。

Modifiers

Dead Zone → 最終入力値をLowerとUpper内の値で丸めてクランプし調整します。
FOV Scaling → プレイヤーカメラのFOV値に応じて入力値をスケーリングし調整します。
Modifier Collection → ユーザー定義のModifiersを設定し、設定を簡素化します。現状ではまだコレクション作成が不可能。
Negate → 特定の入力軸だけを反転させ調整します。
Response Curve - Exponential → 特定の入力軸に単純な指数曲線で値を調整します。
Response Curve - User Defined → 特定の入力軸にユーザー定義の曲線で値を調整します。
Scalar → 入力値を指定した値でスケールし、調整します。
Smooth → 入力値を複数フレームに跨いで値をスムーズ化し、調整します。
Swizzle Input Axis Values → 入力軸の値を指定のOrder順で入れ替えて、調整します。
To Wolrd Space → 入力軸の値をワールド空間軸に変換し、調整します。例: X → Y、Y → Z、Z → X

と、TriggersとModifiersの設定次第ではかなり複雑な入力値を受け取ることができるようになることがわかります。次にInput Mapping Contextについてです。

f:id:alwei:20201128184059p:plain

Input Mapping Contextでは複数のInput Actionについて、実際のどのキーをトリガーに使うのか?とマッピングしたいInput Actionのリストを設定します。ここで設定されたInput Mapping ContextをBPで上で設定することによって、既存の入力に上書きしたり、逆に削除してしまうことも可能です。これらは全てランタイム上で設定するので、後述するBP上でノードの呼び出しを行う必要があります。

実際の使い方とEnhanced Inputノード

現状では作成したInput ActionとInput Mapping Contextを適用するためにBP上でノードを呼び出し設定する必要があります。

f:id:alwei:20201128185021p:plain

Get Player Controllerから呼び出せるEnhanced Input Local Player Subsystemを用いて、Add Mapping Contextを呼び出します。これで設定したInput Mapping Contextを適用することができます。既存のマッピングはRemove Mapping Contextで指定したマッピング、Clear All Mappingsで全てのマッピング消去することが可能です。Query Map Key In Active Context Setノードを用いることで、現在マッピングされているコンテキストへ安全にマッピング可能かどうかを調べることが可能です。

マッピングが完了するといよいよイベントノードを使ってトリガーを取得します。

f:id:alwei:20201128190905p:plain

EnhancedInputAction XXXXXX(InputAction名)という名前のノードが追加されているので、これをそれぞれの出力ピンと繋いで利用します。出力ピンは以下の種類があります。

Started → トリガー評価を開始したイベントを出力
Ongoing → トリガー評価を処理中のイベントを出力
Canceled → トリガー評価中にキャンセルされたイベントを出力
Triggerd → トリガーが発生した、もしくは発生中のイベントを出力
Completed → トリガーが発生し、トリガーが完了したイベントを出力
Action Value → 入力値をInputActionに設定されたBoolean,Float,Vector2,Vector3でそれぞれ出力
Elapsed Seconds → トリガー評価の間にかかっている時間を出力
Triggered Seconds → トリガーが発生し、完了までの時間を出力

これだけのイベントと値が相当取得可能なので、組み合わせることでかなり複雑な入力値を受け取れることがわかります。

以下は実際にトリガーを発生させた際のイベントを可視化したものです。

このようにEnhanced Inputは非常に柔軟で強力な入力システムとなっていますので、ぜひ活用してみましょう!