Create With VR Course

Unity Learn の Create with VR コースの実施ログです。このコースは動画も豊富なので迷うことはあまりありません。

Create with VR

実施環境

  • Unity 6.3
  • Meta Quest 3

VR Software Setup

VR Software Setup - Unity Learn

4. Quest device setup

1. Put your device in Developer Mode:

2. (Windows only) Install the Quest software and connect your device:

ここにある Oculus サイトのリンクは機能しない。リダイレクトされて以下に飛ばされる。Quest Link アプリが必要になるのでインストールしておく。

5. Other device setup

特に無し

6. Set up version control

1 - VR Basics

1 - VR Basics - Unity Learn

VR Project Setup

1.1 - VR Project Setup - Unity Learn

1. Open a new VR project

  • デフォルトのテンプレートからのプロジェクト作成ではなくダウンロードできるテンプレートを使う
    • 上記のように名前を変更したが、元の VR Room Project のままでも良い
  • プロジェクトを Unity Hub からディスクから追加で開く
    • 同じバージョンが無かったため、現状最新の 6.3 を使う
  • 変換はできたようだが、Unity Editor が開いたところで以下のように Errors and Warnings の警告が出ており、見事に VR 系のパッケージが当てはまっている。
    • Invalid Signature なので一旦放置
  • VR 開発用には以下のパッケージが必要らしい

2. Open and explore the starter scene

  • Main Camera ,Right Hand Controller, Left Hand Controller のそれぞれに Tracked Pose Driver がアタッチされている
Main CameraRight Hand ControllerLeft Hand Controller
  • Input Action ManagerXRI Default Input System という Input System 設定を読み込んでいる。
    • ここにある設定が上記の Tracked Pose Driver にも使われている

3. Add a room and background

  • 窓からの景色がざっくり見えるように配置

4. Run the app with the Device Simulator

  • XR Device Simulator を使うとデバッグ実行ができる
  • 実機で実行する際は必ず disabled にするか削除すること

5. Test in VR through Unity

  • Open XR Plugin に関して
    • 運良く Project Validation にはひっかからなかった

6. Build and run on your device

  • Android Build Support が無い場合は、Unity Hub からインストールする
  • 必須かは分からないが、Meta Quest の場合に ADB ドライバーについても言及があった
  • Quest 3 を接続して Refresh すると出てくる
  • 無事 Quest 3 で起動できた

7. Test on other OpenXR-compatible devices

8. Recap

9. Extension Activities

実際のアナログ時計はもっと時・分がなめらかに動くと思いますが、とりあえず簡単に済ませました。

using System;  
using UnityEngine;  
  
public class Clock : MonoBehaviour  
{  
    [SerializeField] private Transform hour;  
    [SerializeField] private Transform minute;  
    [SerializeField] private Transform second;  
  
    // Update is called once per frame  
    private void Update()  
    {        
        var now = DateTime.Now;  
        second.localRotation = Quaternion.Euler(now.Second * 6f, 0f, 0f);  
        minute.localRotation = Quaternion.Euler(now.Minute * 6f, 0f, 0f);  
        hour.localRotation = Quaternion.Euler(now.Hour * 30f, 0f, 0f);  
    }}

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 を置くと思い通りになるかも。