1.2 - VR Locomotion

1.2 - VR Locomotion - Unity Learn

1. Fill the room with furniture

2. Add snap turning

  • XR Origin (VR) の子として Locomotion を作成
  • デバッグ実行すると確かに左右コントローラーモードにした状態で A/D キーを押すとスナップ回転する

3. Add Continuous turn

  • disorienting for people new to VR: VR 初心者には方向感覚を失わせる
  • Snap Turn と Continuous turn を同時に有効にするのは良くないので、左右のコントローラで切り替えるようにする

4. Add a teleportation area

  • これまでと同様に XR Origin (VR) -> Locomotion の下に Teleport という GameObject を作り Teleportation Provider を付ける
  • 今回は部屋の中央にある Rug に Teleportation Area をアタッチし、Teleportaion Provider プロパティに先ほど作成した Teleport GameObject を入れる
  • 実行すると、Ray が白く変わる
    • G キーで Teleport が発動します

4.1 XR Origin 配下の修正

  • ここまで Hand Controller のメッシュが Debug 時に見えていなかったのですが、どうやら Right/Left Hand ControllerCamera Offset の中に入っていなかったようです。
    • 構造を以下のように修正しました
    • 加えて、Character ControllerHeight に合わせて Center0 -> 0.56 に変更しました。
    • これで常にコントローラーが前に見えている状態になりました

5. Add teleportation anchors

  • 向きを指定してテレポートできるように
  • ドアの方向にローカルの X が向くようにして配置
  • Teleportation Anchor
    • Teleportation Configuration -> Match OrientationTarget Up And Forward 二変更
  • この状態でテレポートすると、ドアの方向を向いてテレポートされる
  • このオプションだと、テレポート先のオブジェクトのローカル座標を必ずテレポート結果の方向に合わせなければいけないが、前方に関する設定値はこれしかない。

6. Customize the teleportation reticles

  • これまではテレポートエリア/アンカーに手から伸びるラインが接触したかの判定は「白く変わる」だけだったが、さらに Reticle を追加する
  • Teleportation Area/Anchor
    • どちらにも Custom Reticle という項目があるので、そこに Reticle の Prefab を追加

6.5 Teleportation Anchor と Area の違い

TeleportationAnchorTeleportationArea は、どちらも Unity XR Interaction Toolkit でテレポート移動を実現するためのコンポーネントですが、**「移動先の決定方法」**に大きな違いがある。

1. Teleportation Area

ユーザーが指し示した(レイが当たった)正確な位置にテレポートする。

  • 動作: コライダー上のどの場所でも、レイキャストが当たったその一点が移動先になります。
  • 主な用途: 床、地面、広場など、ユーザーが自由に歩き回れる広い平面に使用します。
  • コード上の特徴: TeleportationArea.cs の GenerateTeleportRequest メソッドを見ると、移動先 (destinationPosition) に raycastHit.point(レイが当たった位置)を使用しているのが分かる。
  • teleportRequest.destinationPosition = raycastHit.point;
2. Teleportation Anchor (テレポートアンカー)

ユーザーがどこを指しても、あらかじめ決められた特定の位置と向きにテレポートする。

  • 動作: アンカーのコライダーを指し示せば、レイがどこに当たったかに関係なく、設定された Teleport Anchor Transform の位置と向きに強制的に移動させられます。
  • 主な用途: 特定の立ち位置、椅子の前、ワープポイント、別の部屋への入り口など、「ここに立ってほしい」「こっちを向いてほしい」という意図がある場所に使用します。
  • コード上の特徴: TeleportationAnchor.cs では、raycastHit の情報は使われず、設定されたアンカー (m_TeleportAnchorTransform) の位置と回転が使用される。
var pose = m_TeleportAnchorTransform.GetWorldPose();
teleportRequest.destinationPosition = pose.position;
teleportRequest.destinationRotation = pose.rotation;
機能Teleportation AreaTeleportation Anchor
移動先レイが当たったその場所 (自由)設定された固定位置 (指定)
向きプレイヤーの向きを維持 (設定による)設定された固定の向きに補正
用途自由移動できる床や地面定位置への移動 (操縦席、スタンド、ワープ)
例えば、部屋の中を自由に歩かせたいなら Area を床に貼り付ける。 「このボタンの前に立って操作してほしい」といった場合は、その位置に Anchor を置くと思い通りになるかも。