GameProgrammar's Night

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

UE4 UMGで入力を取得する

 UMG(UMGのBP)では、各Widgetごとにマウスイベントを取得することはできますが、通常のキーイベントを取得するこはできません。

マウスイベント キーイベント
f:id:katze_7514:20160507212145j:plain f:id:katze_7514:20160507212149j:plain

 
 そのため、UMGでメニューを作りキーで操作したい場合、いつも通りにはいきません。
 UMG上でキーを取るには、2つ方法があります。UMGのOnKey系関数をオーバーライドする方法とUMGの外から入力をもらう方法です。

UMGのOnKey系関数をオーバーライドする

f:id:katze_7514:20160507220341j:plain

 OnKeyUP/OnKeyDownをオーバーライドすると、キーアップ/キーダウンされると対応する関数が呼ばれます。

f:id:katze_7514:20160507220927j:plain

 対応するキーはInKeyEvent引数に入っています。それを実際のKey情報に変換(GetKeyノード)して、何のキーかを調べます(Equal(Key)ノード)。キーをUMGで利用した場合は、Return値にHandledノードを接続し、使わないキーだったらUnHandledノードを接続します。

 また、UMGのOnKey系関数を有効するには、UMGに入力モードがある必要があります。入力モードの切り替えは、SetInputModeUIOnlyノードです。AddToViewportノードを使って画面に表示してから呼びます。
 UMGを消す時は忘れずに入力モードをGameに戻す必要があります。Gameに戻すにはSetInputModeGameOnlyノードを呼びます。入力モードがUMGにあるままだと、UMGを消してもLevelやActorで入力が取れなくなりますので、忘れないようにしましょう。

f:id:katze_7514:20160508000710j:plain

 入力モードを持つことはフォーカスを得るという意味にもなるのですが、UE4.11からフォーカスを得られるかどうかのフラグが追加されましたので、そのフラグもオンにします。

f:id:katze_7514:20160530231433p:plain

 UMGとしては、こちらが正式な方法なのですが、一つ問題があります。OnKey系関数では、ActionMappingと連携ができません。OnKey系関数は対応するキーデータを素の状態でしか受け取れず、またキーデータからActionMappingに変換する方法もありません。

 ActionMappingと連携するためにも、UMGの外から入力を受け取るのを、私としてはお勧めします。

UMGの外から入力をもうらう

f:id:katze_7514:20160508003837j:plain

 UMGのBPに、操作用の関数/イベントを作成して、それをLevel/PlayerControllerから呼ぶ形にします。
 上図では省略していますが、UMG表示されているかのチェックなど、メニューを誤操作しないようにする判定を挟むのもお忘れずに。
 
 メニューはGamePauseをかけてから表示することが多いと思いますので、メニュー操作用のキーイベントは忘れずに「Execute when Paused」にチェックをいれておきましょう。

f:id:katze_7514:20160509155946j:plain