はじめに
Udemyで @shop_0761 さんの【UE4】Unreal Engine 4 + VR で建築ビジュアライゼーションをやってみて気になる挙動があったので改善してみました。
気になる部分
この講座ではVR内にドアを設置してコントローラーでドアノブを回すとドアを開けるようになります。
ドアノブを掴むとPickup
イベントが呼ばれて手のオブジェクトとなる Contoller
を非表示にします。
そしてドアノブを離すと Drop
イベントが呼ばれて Controller
を再表示しています。
この時に両手でドアノブを掴むと次のように先に握った手が消えたままになります。
- 右手でドアノブを掴む
- 右手が消える → OK
- 左手でドアノブを掴む
- 左手で掴み直して消える → OK
- 右手も消えたまま → 掴んでない手は再表示したい
更にどちらの手から先に離してもおかしな事になります。
- 先に右手を離す
- 左手も離して再表示される → 左手は掴んだままにしたい
- 右手は消えたまま → 離した手は再表示したい
- 先に左手を離す
- 左手は再表示される → OK
- 右手は消えたまま → 掴んでいない手は再表示したい
これを後から掴んだ手がドアノブを掴み、先に掴んでいた手を再表示する。
また先に掴んでいた手を離しても何もしないといった改善をしてみます。
ドアノブを掴む処理の改善
改善するに当たってまずは仕様を決めます。
- 後から掴んだ手がドアノブを掴む
- 先に掴んでいた手を再表示する
- 先に掴んでいた手を離しても何もしない
最初の項目は実現できているので残り2つを改善したのがピンクの線で囲んだ部分です。
先に掴んでいた手を再表示する
Pickup
イベントが呼ばれた時に既に掴んでいるか判定できればよいので Controller
が有効かどうかで分岐します。
-
Drop
イベントでSet Visibility
の後にController
を破棄する -
Pickup
イベントでAttach To
をController
に代入する前にIsValid
関数の結果がIs Valid
ならSet Visibility
で表示する
どちらかの手でドアノブを掴んでいれば Controller
を有効、両手を離していれば Controller
を無効にしているわけです。
先に掴んでいた手を離しても何もしない
Drop
イベントが呼ばれた時にどっちの手を離したのか分からないのでちょっと詰まったのですが、VR Templateから持ってきたBPを改造して実現できました。
まずは VirtualRealityBP/Blueprints/PickupActorInterface
の Drop
のInputsに変数を追加します。
次に VirtualRealityBP/Blueprints/BP_MotionController
の ReleaseActor
グラフで Drop
の引数 DettachFrom
に MotionController
をつなぎます。
これでドアの Drop
イベントが呼ばれた時に離した手を取れるようになったので変数 Contoller
と比較して同じなら後から掴んだ手なので処理を進める、違うなら先に掴んでいた手なので何もしない、として判定できるようになりました。
さいごに
VR Templateを使うと簡単に掴み処理を実装できたり、改造も割と簡単にできるので導入におすすめです。
ここから更に両手で掴んだ時に拡大縮小したり色々発展できそうです。
Top comments (0)