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 にすると良いと思います.

f:id:xrdnk:20210131220112p:plain

ただし問題点があって,例えば 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 コンポーネントをアタッチします.

f:id:xrdnk:20210131220357p:plain

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 という名の通りの機能なので当たり前ですが.

動作確認

gyazo.com

Arch を潜れるようになりました.
カメラの位置の高さ(=頭部の位置の高さ)に合わせて,Character Controller の高さが変わっているのが一目瞭然かと思います.
ちなみに高さが変わるのは,ロコモーションイベント処理が開始された瞬間になります.