Character Controller Driver を利用して Character Controller の Height を現実の頭部位置に合わせて自在に調整する【XR Interaction Toolkit】
XR Interaction Toolkit の Character Controller Driver を利用してみました.意外と便利な機能な気がします.
検証環境
- Unity 2019.4.17f1
- Universal Render Pipeline 7.3.1
- XR Interaction Toolkit 1.0.0-pre
Character Controller
XR Rig に Character Controller をアタッチします. これにより物体との衝突判定が行われるようになり,コライダが付いている物体にはぶつかるようになります. Height は 身長と合わせるために,1.7にしています.Radius は 0.2 にすると良いと思います.
ただし問題点があって,例えば Arch をしゃがんで潜ろうと思っても, Character Controller の Height が1.7 で固定されていて高すぎるために, VR空間内ではぶつかり続けて潜れない現象が起きてしまいます.
gyazo.com (実際現実世界ではしゃがんでいるが,Character Controller の Height が固定されているためぶつかってしまう)
これを解決するために,XR Interaction Toolkit の Character Controller Driver があります.
Character Controller Driver
Character Controller の高さを現実の頭部位置に合わせるようになる機能です. 適当に空オブジェクトを作成し,Character Controller Driver コンポーネントをアタッチします.
Locomotion Provider
Character Controller Driver の処理を走らせたいロコモーションコンポーネントを設定します. たいていは Continuous Move Provider を設定することになります.
Min Height,Max Height
Character Controller Driver の高さの限界値を定めることができます. ここはデフォルト設定の[0,∞)ままでいいんじゃないかなあと思います.
Character Controller Driver の内部処理を見てみると,XR Rig は以下のように取得しています.
m_XRRig = m_LocomotionProvider.system.xrRig;
Locomotion System で設定した XR Rig を通して,XR Rig の情報を取得しているようですね.
if (m_CharacterController == null && m_XRRig != null) { Debug.LogError($"Could not get CharacterController on {m_XRRig.rig}, unable to drive properties." + $" Ensure there is a CharacterController on the \"Rig\" GameObject of {m_XRRig}.", this); }
また,XR Rig に Character Controller がないとエラーを吐きます. Character Controller Driver という名の通りの機能なので当たり前ですが.
動作確認
Arch を潜れるようになりました. カメラの位置の高さ(=頭部の位置の高さ)に合わせて,Character Controller の高さが変わっているのが一目瞭然かと思います. ちなみに高さが変わるのは,ロコモーションイベント処理が開始された瞬間になります.