対象Ver:UE4.25.0
コントローラやタッチ操作などの入力の複雑さを明確化し、ゲームの内容に応じてカスタマイズするために役立てるための記事です。
#1. 外部入力から検出まで
コントローラ、キーボード、マウス、タッチなどのハードウェアイベントを検出してから最初に入力を受け付ける箇所までの概略図が以下のようになります。HoloLensやOculusコントローラ、アーケードコントローラなどもこのような入力を介して通知されるので、どのInterfaceを利用しているか分からない場合はSlateApplicationでイベントを監視すると分かりやすいです。コンソール機のコントローライベント等も同様の入力インタフェースを利用します。
[ポイント]
・ユーザー入力は各InputInterface, Controllerで監視されており、入力を検出したらFSlateApplicationに通知される
・例えばコントローラの入力は各インタフェースのSendControllerEvents()内で検出して通知する
・各インタフェースはコントローラを最大4つを監視しており、接続された順番に0,1,2...とControllerIdが割り当てられる
・各プレイヤーはデフォルトでControllerIdと一致するコントローラを使用する
・つまり最初のプレイヤー(PlayerId:0)は最初に接続されたコントローラ(ControllerId:0)の入力で動作する
・各デバイス間でControllerIdを相互監視したり排他制御を行わない
・つまりXInputとRawInputコン各1つずつを同一PCに接続した場合、最初のプレイヤーはどちらの入力も受け付ける
・キーボード/マウスは接続毎にControllerIdは割り当てられない
#2.検出から通知まで
入力を受け取ってからゲーム側に入力を引き込んで何かのイベントが発生するまでの流れの概略図が以下のようになります。
[ポイント]
・入力はSlateApplicationから順番に通知する
・ビューポートにフォーカスしている場合はゲーム内に処理を流し込まれる左のルートを通過する
・入力をどこかでブロッキングしたり、複数の入力に分配することもできる
・ボタン押下やテキスト入力など主にUIの操作は右のルートを通過して
・UIナビゲーションの操作などもこちら
・ゲーム側から入力を検出して何かをやらせたい場合はInputProcessorかGameViewportClientのカスタムクラスを作成する
・以下のブログはカスタムInputProcessorクラスを作成する参考になります
くーこのプログラマメモ様:IInputProcessorによるキー入力処理について