UE4建築コンテンツを制作する際に困ったこと、どう対応したか --04 VRテンプレートでテレポートレーザーが天井を突き抜ける問題--
今回はリクエストが有りましたので、タイトル通りUE4のVRテンプレートのナビメッシュ×テレポートムーブを用いて複数階をもつ建物をVR化した際に、テレポートレーザーが天井を突き抜けて認識してしまう現象の対処法について書きます。
当該現象はこの通り。
後半、ところどころテレポートレーザーが天井を突き抜けていますね。
では具体的に順序を追って実装しましょう。
※本件対処法につきましては、調べに調べてたどり着いた公式フォーラムの回答を実装したものになります、こちらのフォーラム回答の通りノードを組み替えると動作します。
4.13 VR template - teleporting through the roof - Unreal Engine Forums
VirtualRealityBP / Blueprints 内のBP_MotionControllerを開き、関数のTraceTeleportDestinationを開きます。
この際に、天井を判定するためのブーリアンを作っておきます(名称は任意で)
次に、図の通りBreak Hit Result ノードの normal ピンからBreakVector へピンを繋ぎます。(値をXYZに分解しています。)
BreakVectorのZ出力ピンから float<float ピンに接続し、さらにPredict~Object TypeノードとReturnノードの間に、先程作成した天井判定ブーリアンのセットを挟みます。
float<float の出力ピンを挟んだブーリアンに接続します。
これで、テレポートレーザーが衝突したオブジェクトのnormalのZ値が負(-)のとき、当該オブジェクトは天井だと判定する仕組みになっていると思います(間違っていたらごめんなさい教えて下さい…)
これでBP_MotionControllerの設定は終了。コンパイルしておきましょう。
次にMotionControllerPawnのHandle Teleportation部分を編集します。
BranchからBranchの間にさらに、天井かどうかを判定するBranchノードを挟みます。
このときの最大の注意点が、最初からある前方のBranchノードから追加したBranchノードへの渡しを、"False"側に変更する必要があることです。
(CustomEvent)Execute TeleportaionのMotion ControllerピンからTarget Is Ceilingに接続し、追加したBranchノードのconditionピンに接続します、これで天井かどうか判定させます。
※Target~(任意の名前)の入力ピン付きブーリアンは、「状況に合わせた表示」チェックを外すと現れるはずです。
このブーリアンは、先程BP_MotionController内で作った値を参照させています。
あとは
・Trueの場合 → Is Teleporting を挟んで Disableに
・Falseの場合 → 次のBranchに
以上で、天井を突き抜けないナビメッシュ×テレポートシステムが出来上がりました。
※うまくいかない場合は併せて、BP_MotionControllerのProject Nav Extendsの値を100程度に変更してやるとうまくいくかと思います。(デフォ値は500)