VR
UE4
UnrealEngine
UnrealEngine4

Udemyの「【UE4】Unreal Engine 4 + VR で建築ビジュアライゼーション」でドアノブの処理を改善してみた

はじめに

Udemy@shop_0761 さんの【UE4】Unreal Engine 4 + VR で建築ビジュアライゼーションをやってみて気になる挙動があったので改善してみました。

気になる部分

この講座ではVR内にドアを設置してコントローラーでドアノブを回すとドアを開けるようになります。

image.png

ドアノブを掴むとPickup イベントが呼ばれて手のオブジェクトとなる Contoller を非表示にします。
そしてドアノブを離すと Drop イベントが呼ばれて Controller を再表示しています。

この時に両手でドアノブを掴むと次のように先に握った手が消えたままになります。

  1. 右手でドアノブを掴む
    • 右手が消える → OK
  2. 左手でドアノブを掴む
    • 左手で掴み直して消える → OK
    • 右手も消えたまま → 掴んでない手は再表示したい

更にどちらの手から先に離してもおかしな事になります。

  • 先に右手を離す
    1. 左手も離して再表示される → 左手は掴んだままにしたい
    2. 右手は消えたまま → 離した手は再表示したい
  • 先に左手を離す
    1. 左手は再表示される → OK
    2. 右手は消えたまま → 掴んでいない手は再表示したい

これを後から掴んだ手がドアノブを掴み、先に掴んでいた手を再表示する。
また先に掴んでいた手を離しても何もしないといった改善をしてみます。

ドアノブを掴む処理の改善

改善するに当たってまずは仕様を決めます。

  1. 後から掴んだ手がドアノブを掴む
  2. 先に掴んでいた手を再表示する
  3. 先に掴んでいた手を離しても何もしない

最初の項目は実現できているので残り2つを改善したのがピンクの線で囲んだ部分です。
image.png

先に掴んでいた手を再表示する

Pickup イベントが呼ばれた時に既に掴んでいるか判定できればよいので Controller が有効かどうかで分岐します。

  • Drop イベントで Set Visibility の後に Controller を破棄する
  • Pickup イベントで Attach ToController に代入する前に IsValid 関数の結果が Is Valid なら Set Visibility で表示する

どちらかの手でドアノブを掴んでいれば Controller を有効、両手を離していれば Controller を無効にしているわけです。

先に掴んでいた手を離しても何もしない

Drop イベントが呼ばれた時にどっちの手を離したのか分からないのでちょっと詰まったのですが、VR Templateから持ってきたBPを改造して実現できました。

image.png

まずは VirtualRealityBP/Blueprints/PickupActorInterfaceDrop のInputsに変数を追加します。
次に VirtualRealityBP/Blueprints/BP_MotionControllerReleaseActor グラフで Drop の引数 DettachFromMotionController をつなぎます。

これでドアの Drop イベントが呼ばれた時に離した手を取れるようになったので変数 Contoller と比較して同じなら後から掴んだ手なので処理を進める、違うなら先に掴んでいた手なので何もしない、として判定できるようになりました。

さいごに

VR Templateを使うと簡単に掴み処理を実装できたり、改造も割と簡単にできるので導入におすすめです。
ここから更に両手で掴んだ時に拡大縮小したり色々発展できそうです。