Meta Quest (Horizon OS) 開発環境・実装ルール
1. 開発環境・グラフィックス
- エンジン: Unity 6.0 (6000.x系)
- ターゲット: Meta Questプラットフォーム(Platform Browserから選択)
※汎用Androidビルドへの切り替えや提案は一貫して「NG」とする - XRプラグイン: Unity OpenXR Plugin + Unity OpenXR: Meta パッケージ
※Oculus XR Pluginは非推奨のため一切使用しない - レンダリング: URP (Universal Render Pipeline) + Vulkan API
※パススルー動作にVulkanが必須。OpenGL ESは使用不可
2. シーン構築基盤(Meta Building Blocks)
- 基本方針: カメラリグやパススルーなどの主要なXR機能は、Meta公式の Building Blocks(
Window > Meta XR > Building Blocks)を使用してシーンに配置・構築すること - 使用する主なブロック:
- [Camera Rig] : OVRCameraRig ベースのカメラ基盤
- [Passthrough] : URP/Vulkan環境用のパススルー自動設定
3. パススルー機能(MR合成)& デバッグ制限
- 実装の必須要件:
① メインカメラ(CenterEyeAnchor)の設定: Clear Flags = Solid Color、Background alpha = 0(完全透明)にすること
② AR Camera Manager コンポーネントをメインカメラに必ずアタッチすること
③ パススルーのON/OFF切り替えは、AR Camera Manager.enabled の true/false で制御すること - デバッグ制限: 開発PCがLink非対応であるため、Unity Editor上(Playモード)ではパススルー映像は表示されない(背景は透過用カラーで描画される)。位置合わせや実像との合成確認は、必ずAndroidビルド(.apk)を実機に転送して行うこと
4. 車内MR空間の階層設計(追随 vs 通り抜け)
車に乗って移動するユースケースに対応するため、オブジェクトの性質に応じてヒエラルキーを厳密に分離すること。
- ヘッドに追随するオブジェクト(車内環境・UI・インテリアなど):
Building Blocksで生成された Camera Rig 内の TrackingSpace の子要素として配置する。これにより、車の移動や頭の動きに自動的に完全追随させる - 通りぬけるオブジェクト(車外環境・仮想障害物・パイプなど):
Camera Rig の外側(ルート階層)に配置する。車の進行(擬似前進ロジック等)に合わせて、これらのオブジェクト、あるいはプレイヤー側の位置を相対的に移動させることで「通り抜け」を表現する
5. 入力システム(OVRInput & キーボードデバッグ)
- 基本方針: 現在プロジェクトで安定動作している OVRInput をベースに実装を維持する(Building Blocks環境下でも OVRInput をそのまま使用)
- Editorデバッグ対応: Link非対応PCでのEditor実行時(Application.isEditor)でも主要機能(移動・通り抜け、ログ開始、パススルー切替等)のテストができるよう、キーボード入力を割り当てたエミュレートロジックを共存させること
- 例外処理: ヌル参照やXR初期化タイミングのバグを防ぐため、Editor実行時には OVRInput の生データ(コントローラー接続チェック等)を安全にバイパスする防御的コードを徹底すること
6. 曲面スクリーン(動画・テクスチャ表示)
- 実装アプローチ: Thin-Cube(薄いCube)をベースに、MeshFilter + MeshRenderer を使用し、コードから頂点を円弧状に変形して曲面Meshを生成すること
※XR Composition Layersの Cylinder Layer は使用NG(動作しなかった実績あり) - 制御パラメータ: 頂点計算は Mathf.Sin / Mathf.Cos で円弧を近似し、セグメント数・曲率半径・UV座標を引数で動的に制御できる設計にすること。動画テクスチャの歪みを防ぐため、UV座標(u値)は円弧の弧長に対して等間隔にマッピングすること
- 描画方法: 動画やテクスチャは VideoPlayer + RenderTexture を経由して、対象Materialに割り当てること
7. ProBuilder製のPIPE(パイプ)操作
- 実装方法: シーン内のパイプオブジェクト(車外に配置され、通り抜ける対象など)の変形や操作には、ProBuilderMesh API を用いたスクリプト実装を提案・使用すること
8. CSVログ書き込み(データ蓄積 & スコープドストレージ対策)
- 保存パス: Android 10以降のScoped Storage制約を回避するため、必ず Application.persistentDataPath を使用すること
※ /sdcard/ 直下などのカスタムパスへの保存提案は「一貫してNG」(書き込み不可エラーとなるため)。AndroidManifest.xmlへの WRITE_EXTERNAL_STORAGE 追加も不要
※実機パス例: /sdcard/Android/data/<パッケージ名>/files/log_yyyyMMdd_HHmmss.csv - ファイル管理: DateTime.Now を使用し、日付・時刻を含めたユニークなファイル名にすることで、セッションごとに別ファイルとして蓄積させること
- 書き込み負荷対策: 毎フレームのI/Oによる処理落ち(スパイク)を防ぐため、メモリ(List や StringBuilder)にバッファリングし、セッション終了時や一定時間ごとに一括・非同期書き込みを行うこと
- PCへの取り出し: PCとUSB接続し、以下のADBコマンドを用いて抽出すること
adb pull /sdcard/Android/data/<パッケージ名>/files/ ./logs
9. コード規約・情報の鮮度
- 言語・API: C#(Unity 6対応名前空間を使用)。コメントはすべて日本語で記述すること
- 情報の鮮度: 2025年以降の情報・ドキュメントを最優先とする(Meta XR SDKは v74以降 を前提)。古い情報やレガシーAPIを提示する場合は「旧バージョン向け」と明記して警告を入れること
10. 回答フォーマット
- 目的の説明
- 実装手順(箇条書き)
- コード例
- 参考ドキュメントURL(存在する場合)
不確かな情報は「要確認」と明記し、古い可能性がある内容には警告を付けること。