初めに
VRを使ってWidgetを操作する際に右手で操作しているのか左手で操作しているのか区別が必要な場合があったため、その時の備忘録的な感じでこの記事を書いています。
具体的には【UE】リストの項目をドラッグ操作で入れ替えるで紹介しているドラッグ操作を実行する際に、右手で操作している最中に左手で操作しても問題ないようにするため区別が必要になりました。
あまり活用することはないかと思いますが、同じように操作した際の手の区別が必要になった方の一助になればと思います。
環境情報
Windows 11
UE 5.3.2
実装方法
今回の例ではVRテンプレートを使って説明していきます。
大まかなポイントは以下の通りです
・WidgetでOnKeyDown/Up関数をオーバーライドさせる
・Widegt Interaction Componentに対してPress Keyを実行させる
①Widgetを用意する
これはぶっちゃけ何でもよいとしか言いようがないです。
今回はWBP_TestMenuというものを作りました。
BorderとTextが並んでいるだけの簡素なものです。
VRのコントローラーでクリックされた際にクリックしたコントローラーが右だったか左だったかをRight/Leftで表示します。
ここで重要なポイントです。
Hierarchyの一番上にある要素を選択してDetailsタブの中身を見ます。
Interactionの項目のなかにIs Focusableというものがあるのですが、
ここに必ずチェックを入れてください。
このあとOnKeyDown/Up関数をオーバーライドするのですが、ここにチェックを入れていないと
Widget Interaction Componentで操作してもその通知がWidgetに対して行われなくなります。
②OnKeyDown/Up関数をオーバーライドする
OnKeyDown/Up関数をオーバーライドしていきますが、先にクリックされた手がどちらだったかを表示する処理を追加します。
WriteTextというイベントを作成して引数のIsRightの値に応じてRight/Leftを表示します。
FUNCTINOSのOverrideからOnKeyDown/Upを選択します。
今回は説明簡略化のためにOnKeyDownのみを実装していきます。
今回はOnKeyDown関数内部では以下のように実装します。
Widget Interaction ComponentでOnKeyDownを呼ぶ際にGamepad Left Trigger/Gamepad Right TriggerをKeyとして設定する予定なので、一応それ以外のキーが引数で渡された場合は処理を行わないようにします。
後はWriteTextイベントに渡されたKeyが右手操作によるものかの判定結果を渡します。
③Widget Interaction ComponentでOnKeyDown/Upを実行する
VRテンプレートではVRPawnでWidget Interaction Componentを持っていますが、
実装はMenuクラスで行っているのでこちらに手を入れていきます。
Menuが持っているWidgetComponentにのWidget Classに今回作成したWBP_TestMenuを設定します。
MenuクラスのEvent Graphを見ると左下の方にEnhancedInputAction IA_Menu_Interact_Left/Rightがあります。
Widget Interaction Ref Left/RightでPress Pointer Keyを実行しているのでその続きで以下のように実装します。
必ずPress Pointer Keyの後にPress Keyを実行するようにしてください。
Press Key単体ではOnKeyDown/UpをオーバーライドしているWidgetでイベントが発火されません。
Is Over Focusable Widgetの判定でTrueの時だけ実行させることでWidget Interaction ComponentがホバーしているWidgetに対してだけOnKeyDown/Upイベントを発火させることができます。
PressKeyで渡すKeyは正直なんでも大丈夫です。他のキーと被らないように左右で別のキーを渡せればOKです。
実際に実行してみるとこんな感じです。