0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UE】VRでWidgetに対して右手/左手で操作したことを通知する

Posted at

初めに

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で表示します。

image.png

ここで重要なポイントです。
Hierarchyの一番上にある要素を選択してDetailsタブの中身を見ます。
Interactionの項目のなかにIs Focusableというものがあるのですが、
ここに必ずチェックを入れてください。

image.png

このあとOnKeyDown/Up関数をオーバーライドするのですが、ここにチェックを入れていないと
Widget Interaction Componentで操作してもその通知がWidgetに対して行われなくなります。

②OnKeyDown/Up関数をオーバーライドする

OnKeyDown/Up関数をオーバーライドしていきますが、先にクリックされた手がどちらだったかを表示する処理を追加します。
WriteTextというイベントを作成して引数のIsRightの値に応じてRight/Leftを表示します。

image.png

FUNCTINOSのOverrideからOnKeyDown/Upを選択します。
今回は説明簡略化のためにOnKeyDownのみを実装していきます。

image.png

今回はOnKeyDown関数内部では以下のように実装します。

image.png
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を設定します。
image.png

MenuクラスのEvent Graphを見ると左下の方にEnhancedInputAction IA_Menu_Interact_Left/Rightがあります。
Widget Interaction Ref Left/RightでPress Pointer Keyを実行しているのでその続きで以下のように実装します。

image.png

必ずPress Pointer Keyの後にPress Keyを実行するようにしてください。
Press Key単体ではOnKeyDown/UpをオーバーライドしているWidgetでイベントが発火されません。
Is Over Focusable Widgetの判定でTrueの時だけ実行させることでWidget Interaction ComponentがホバーしているWidgetに対してだけOnKeyDown/Upイベントを発火させることができます。
PressKeyで渡すKeyは正直なんでも大丈夫です。他のキーと被らないように左右で別のキーを渡せればOKです。

実際に実行してみるとこんな感じです。

show.gif

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?