GameProgrammar's Night

ゲームプログラム系の覚え書き

UE4 アクターの入力取得をコントロールする

docs.unrealengine.com
docs.unrealengine.com

 この辺りに書いてあることと独自調査を元にキー/パッド/マウス入力(以下単に入力)で悩まないようにするためのまとめとなっています。

入力を取得できるようにする設定

 あらゆるActorは適切な設定を行うことで、入力を取得できるようになります。

詳細パネル

f:id:katze_7514:20160719230556j:plain

 デフォルト設定は詳細パネルのInputの項目で行います。
 [AutoReceiveInput]の項目を入力取得したいPlayerIndexに設定することで、そのプレイヤーからの入力を取得することができます。一人用の場合、Player0にしておけばOKです。
 [Input Priority]については後述します。

BPノード

f:id:katze_7514:20160719230606j:plain

 実行中に入力取得の可否をコントロールする時は、上記のEnable/DisableInputを使います。
 名前通り、EnableInputは入力取得ができるようになり、DisableInputは入力取得ができなくなります。
 Actorピンに設定したいActorを接続します。
 PlayerControllerピンは入力を取得したいPlayerIndexを持つPlayerControllerを接続しますが、一人用の場合は何も接続しなくても大丈夫です。

入力取得の順序

 UE4の入力取得は、実はブロードキャストされておらず、決まった順番で入力情報が配送されていきます。あるアクターで入力が使われると、その後の順番になっているアクターは入力取得することができません。
 例えば、Wキーを取得するHogeアクターとFooアクターがあり、入力順序が、Hoge→Foo だった時、HogeでWキーを取得すると、FooではWキーの入力取得ができません。

 この入力順序は、詳細パネルの[InputPriority]でコントロールします。値が大きい方が先に入力を取得できます。
 ただし、いくつかのアクターは固定順序になっていますので、実際には以下の通りになります。

  1. 以下に無いActorがPriority降順
  2. PlayerControllerのComponent
  3. PlayerController
  4. [常にロード]のLevel
  5. PlayerPawnのComponent
  6. PlayerPawn

の順番に配送されていきます。
 PlayerPawnとはPlayerControllerにPossessされているPawnのことです。
 同一Priorityの時は、後から生成されたもの、後からEnableInputをしたアクターが優先度高くなります。

 なお、配送処理自体はPlayerControllerのTickタイミングで行われていますので、PlayerControllerのTickを停止するとすべての入力を取得できなくなりますので、ご注意ください。

BlockInput

 詳細パネルに[BlockInput]という項目がありました。同一名のBPノードもあります。
 入力配送処理を終えるフラグです。このフラグがONになっているアクターより優先度が低いアクターは入力が一切取得できなくなります。

 DisableInputノードは、入力取得順序から一時的に外れる処理となっていますので、優先度が低いアクターが入力取得ができなくなることはありません。

ConsumeInput/GamePause

f:id:katze_7514:20160509155946j:plain

 入力にまつわる重要な設定に、ConsumeInputとGamePauseがあります。
 ConsumeInputは、優先度の低いアクターに入力を渡さないかどうかの設定です。先ほど上げた例ですと、HogeアクターのWキー入力のConsumeInputフラグをOFFにすると、FooアクターでもWキーを取得できるようになります。
 アクターの入力はGamePauseの影響を受けますので、GamePauseをすると入力取得を行いません。しかし、メニュー操作などGamePause中でも入力を取得したい時は、[Execute when Paused]フラグをONにすることで、GamePause中でも取得されるようになります。