初めてのMeta Quest3アプリ開発記

こちらは [ミライトデザイン Advent Calendar 2023](https://qiita.com/advent-calendar/2023/miraito-inc) の24日目の記事となっています。

23日目は [suzuki-hoge](https://qiita.com/suzuki-hoge) さんの [「身体的疲労との付き合い方](https://zenn.dev/suzuki_hoge/articles/2023-12-health-keep-337c1febf2fc98)」 でした。

自分はもうそろそろで40代後半に突入しそうな歳で、若い時のように無茶をするのは無理な体になってきています。
こまめに体をほぐしたりするだけでも疲れ具合が軽減されるので、こちらの記事の内容を参考にしてあまり疲労を溜めないようにしようと思いました。

# はじめに

Quest3を手に入れたので、せっかくなのでUnityを使って色々作って遊ぼうと考えています。
なので、まずは簡単なアプリを作ってみてQuest3での開発がどんな感じなのかを知ろうと思い立ちました。

自分が作業しながらメモした内容等を箇条書きでまとめた状態にしています。
Quest3とは直接関係ない部分(主にStep1)もありますが、自分と同じようにQuest3で初めてアプリを作る方の参考になれば良いなと思っています。

# Step 1 環境構築

## PC周りの設定

### MacからWinodwsへの接続

- Windows機がHomeエディションでリモートデスクトップが使えなかったのででProへアップデート
- Windows上で「システム設定」からリモートデスクトップを有効化
- MacにRemote Desctop をインストールして接続
    - コンピュータ名はWindowsのマシン名の後ろに `.local `を付与する
        - 例： `SurfacePro8.local`
    - 接続用のユーザー名はコマンドプロンプトから `whoami` コマンドで確認出来る
        - [ドメイン名]\[ユーザー名] の形式で表示されるのでそれをそのまま使用する
        - 例: `surfacepro8\frozenvoice`
    - もしくは、MicrosoftアカウントでPCにログインしている場合はそちらのID/PassでもOK
    - 接続設定で「Use all monitors」をONにして、Mac側のディスプレイ全てをWindows側でも使えるように設定

## Unity準備

### インストール

- Unity Hubをダウンロードしてインストール
    - https://unity.com/ja/download
- Unity HubからUnityをインストール
    - 自分が作業した時点の最新は `2022.3.16f1` だったのでそちらを利用
- Unity HubでインストールしたUnityに下記のモジュールを追加
    - Android Build Support
        - Android SDK & NDK Tools
        - OpenJDK

## Meta Quest Developer Hub準備

### インストール

- Meta Quest Developer Hubをダウンロードしてインストール
    - https://developer.oculus.com/downloads/package/oculus-developer-hub-win/?locale=ja_JP

### 実機との接続確認

- Quest3の開発者モード有効化
    - 自分は既にImmersedを有線接続するために開発者モードをONにしているのでそのままでOK
- WindowsPCとQuest3をUSBケーブルで接続
- Meta Quest Developer Hub を起動
　  -Device Managerのタブで 「Set Up New Device」を選択してQuest3を登録
- 「Cast」をしてみてQuest3で見えてる映像がPC側でも見えることを確認

# Step 2 VRアプリを作る

## Hello World的な簡易アプリ作成

### Quest3向けのプロジェクト設定

- Unity Hubで新規プロジェクトを作成して起動
- メニューから「File」 → 「Build Setting…」を選択して下記を設定
    - 「Platform」 で `Android` を選択
    - 「Texture Compression」 で `ASTC` を選択
    - 「Switch Platform」ボタンを押下
- メニューから「Window」 → 「Asset Store」 を選択してAsset Storeを表示
    - 「Open Package Manager」 を押下
    - 左上「＋」マークから「Add package by name…」を選択
    - `com.meta.xr.sdk.core` を 入力して 「Add」ボタンを押下
    - インストールが終わると「Restart Unitiy」のダイアログが出るので「Restart Editor」のボタンを押下して再起動
- メニューから「Edit」 → 「Project Settings…」を選択
    - 左側ツリーから `Oculus` を選択して、右側ペインで「Fix All」ボタンと「Apply All」ボタンを押下 

### アプリ作成

- 「Hierarchy」 タブから `Main Camera` を削除
- 「Project」タブのツリーで `Packages > Meta XR Core SDK > Prefabs` を選択
    - `OVRCameraRig` を 「Hierarchy」タブにドラッグ&ドロップして追加
    - 「Inspector」タブの「OVR Manager」部分で 「Target Device」として`Quest ３`がデフォルトだとOFFなのでONに変更
- 「Hierarchy」タブの左上「+」マークから「3D Object > Cube」を選択
    - 動きがないと面白くないので、下記のスクリプトを作成してCubeにアタッチ

#### 回転用スクリプト

```c#:RotateCube.cs
using UnityEngine;
using System.Collections;

public class RotateCube : MonoBehaviour {
    void Update () {
        float deg = 30.0f * Time.deltaTime;
        transform.Rotate(new Vector3(deg, deg, 0));
    }
}
```

# Step 3 PCとQuest3を接続して実機で確認

## 実機で動作確認

- PCとQuest3をUSBケーブルで接続
- Unity上で「File」→「Build Settings…」を選択
    - 「Run Device」 で `Oculus Quest 3` を選択
    - 「Build And Run」ボタンを押下

# Step 4 MRアプリに変更する

## パススルーを有効化して外部を表示

- 「Hierarchy」タブに追加した `OVRCameraRig` を選択
- 「Inspector」タブの 「OVR Manager」部分で下記を設定
    - 「Quest Features」部分の「General」内の「Passthrough Support」 を `Supported`に変更
    - 「Insight Passthrough」 のチェックボックスを `ON`
- 「Project」タブのツリーで `Packages > Meta XR Core SDK > Scripts` を選択
    - `OVRPassthroughLayer` を 「Hierarchy」タブの 「OVRCameraRig」にドラッグ&ドロップして追加
    - 「Inspector」タブの「OVRPassthroughLayer」部分で下記を設定
        - 「Placement」 を `Underlay` に変更
- 「Hierarchy」タブで `OVRCameraRig > TrackingSpace > CenterEyeAnchor` を選択
    - 「Inspector」タブの「Camera」部分で下記を設定
        - 「Clear Flag」 を `Solid Color` に変更
        - 「Background」 を `(0, 0, 0, 0)` の黒色に変更
- 「Build And Run」して実機で確認
    - `Ctrl + B` がショートカットなのでコレを使うのが楽

## Building Blocksでハンドトラッキングを追加

- Unityのメニューから「Oculus > Tools > Building Blocks」 を選択
    - 「Hierarchy」タブに `Hand Tracking` をドラッグ&ドロップで追加
    - BuildingBlocksのCameraRigが使われるようなので、自前で追加したOVRCameraRigを削除
    - 「Hierarchy」タブに `Passthrough` をドラッグ&ドロップで追加

# さいごに

本当はハンドトラッキングでCudeを触れるようにしたかったのですが、まだ理解が進んでおらずそこまで実装できませんでした。

Quest3はライブラリ等も揃っているようなので、ちゃんと使いこなせればそれほど労力を掛けずにVR/MRアプリが作れそうかな?というのが現時点での印象です。
個人的な趣味としてVR/MRは興味があるので、じっくりと学習してなにかちゃんとしたアプリを作ってみたいところです。

来年にはAppleのVison　Proも発売されるので、VR/MRの流れがそろそろで本格的に来てくれると良いなと願っています。