Contents
開発環境の構築とバージョン互換性
このセクションでは、Unity と Figmin XR SDK の推奨組み合わせ、インストール手順、Quest 3 デバイスの開発者モード設定を網羅的に説明します。正しいバージョンを選択すれば、ビルドエラーやデバイス接続不具合を未然に防げます。
Unity と Figmin XR SDK の推奨組み合わせ
Figmin XR は Unity 2022.3 LTS(2022‑12‑06 以降のリビジョン)と Figmin XR SDK v2.1.0 以上で公式にテストされ、以下のドキュメントに互換性が明記されています。
| 項目 | 公式根拠 |
|---|---|
| Unity LTS のサポート範囲 | https://unity.com/releases/editor/qa/lts-releases(2022.3 が最新 LTS) |
| Figmin XR SDK 対応 Unity バージョン | https://docs.figminxr.com/sdk/requirements/(「Supported Unity versions: 2021.3‑2022.3」) |
| XR Plug‑in Management の互換性 | https://docs.unity3d.com/Packages/com.unity.xr.management@4.4/manual/index.html |
上記を満たす環境は、Meta が推奨する「安定構成」として広く採用されています。
Unity のインストール手順
- Unity Hub を公式サイト(https://unity.com/download)からダウンロードし起動。
- 「Installs」タブで Add → 2022.3 LTS を選択し、
2022.3.26f1など最新リビジョンをインストール。 - インストール完了後、プロジェクト作成画面で 3D (URP) テンプレートを選び、XR Plug‑in Management パッケージは Package Manager から有効化する。
※「Add package from git URL」や「Add package from disk」は Unity 2022.3 の標準機能です。
Figmin XR SDK の導入方法
- Figmin XR の公式リポジトリ(https://github.com/figminxr/figmin-xr-sdk)から v2.1.0 以上の
.unitypackageをダウンロード。 - Unity エディタで
Assets > Import Package > Custom Packageを選択し、FigminXR.unitypackageをインポート。 - インポート完了後、
Edit > Project Settings > XR Plug‑in Managementで Oculus にチェックを入れ、Passthrough と Hand Tracking が有効になることを確認する。
Figmin XR SDK のリリースノート(https://github.com/figminxr/figmin-xr-sdk/releases/tag/v2.1.0)では、Oculus プラグインの自動設定がサポートされた旨が記載されています。
Quest 3 デバイス設定と ADB 環境
| 手順 | 内容 |
|---|---|
| 1 | Meta Developer Dashboard(https://developer.oculus.com/)で開発者アカウントを作成し、Quest 3 の 開発者モード を有効化。 |
| 2 | PC に Android SDK Platform‑Tools(公式ダウンロード https://developer.android.com/studio/releases/platform-tools)をインストール。 |
| 3 | コマンドプロンプトで adb devices を実行し、デバイスが device 状態で表示されることを確認する。 |
|
1 2 3 4 5 |
:: Windows の例 curl -O https://dl.google.com/android/repository/platform-tools-latest-windows.zip powershell -Command "Expand-Archive platform-tools-latest-windows.zip -DestinationPath C:\adb" C:\adb\adb.exe devices :: Quest‑3 が一覧に出れば成功 |
正しく接続できたら、Unity の Build Settings > Android に切り替えてビルドを行えるようになります。
Figmin XR スクリプト API の概要と主要クラス
Figmin XR は Passthrough 映像取得、点群メッシュ生成、物理シミュレーションという 3 つのコア機能を統一インターフェイスで提供します。本節では主要クラスと非同期処理の基本パターンを解説し、実装サンプルに MeshSerializer の役割も併せて説明します。
主要クラス一覧
以下は Figmin XR SDK が公開している代表的なクラスです。各メソッドはすべて 非同期(Task)ベース で設計され、Unity メインスレッドのブロックを防ぎます。
| クラス | 主なプロパティ・メソッド | 用途 |
|---|---|---|
FigminXR.Passthrough |
EnableAsync(bool), IsEnabled |
Passthrough 映像のオン/オフ制御 |
FigminXR.MeshProvider |
GetCurrentMeshAsync() : Task<Mesh> |
現在フレームの点群メッシュ取得 |
FigminXR.PhysicsEngine |
RaycastAsync(Ray) : Task<RaycastHit?> |
メッシュ上での衝突判定(非同期) |
FigminXR.CullingMask |
SetLayerMask(int) |
表示レイヤー制御 |
公式 API リファレンスは https://docs.figminxr.com/api/ に掲載されています。
非同期メッシュ取得の実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using FigminXR; using UnityEngine; public class PassthroughController : MonoBehaviour { // Start は非同期で呼び出すことが推奨されます private async void Start() { await Passthrough.EnableAsync(true); // Passthrough を有効化 Mesh mesh = await MeshProvider.GetCurrentMeshAsync(); // メッシュ取得 if (mesh != null) { GetComponent<MeshFilter>().sharedMesh = mesh; // 表示に反映 } var hit = await PhysicsEngine.RaycastAsync( new Ray(transform.position, Vector3.forward)); if (hit.HasValue) { Debug.Log($"Hit point: {hit.Value.point}"); } } } |
MeshSerializer クラスの解説
MeshSerializer は Figmin XR が提供する カスタムシリアライザ で、以下の機能を持ちます。
| メソッド | 概要 |
|---|---|
static byte[] Serialize(Mesh mesh) |
頂点座標・インデックス・UV を 16‑bit 固定小数に変換し、LZ4 圧縮したバイト配列を返す。 |
static Mesh Deserialize(byte[] data) |
圧縮データを復元し、Unity の Mesh オブジェクトへ再構築する。 |
実装は Figmin XR SDK の
Runtime/Utilities/MeshSerializer.csにあり、約 70 % の帯域削減効果が公式ベンチマーク(https://github.com/figminxr/figmin-xr-sdk/blob/main/docs/performance.md)で報告されています。
Shared Spatial Anchors は、複数の Quest 3 デバイス間で同一空間原点を共有できる Meta のクラウドサービスです。本節ではアンカー生成からデバイス間同期までのフローと、実装上の注意点を示します。
アンカー生成とクラウド保存手順
- ローカルスキャン:
FigminXR.MeshProviderで取得した点群メッシュを基に環境マッピングを行う。 - アンカー作成:
SpatialAnchor.CreateAsync(position, rotation)を呼び出すと、Meta Cloud にアンカーが保存されanchor.Idが返ります。
|
1 2 3 4 5 6 7 8 9 10 11 |
using FigminXR; using UnityEngine; public async void CreateAndShareAnchor() { var anchor = await SpatialAnchor.CreateAsync( Camera.main.transform.position, Camera.main.transform.rotation); string anchorId = anchor.Id; // クラウド上の識別子 SendAnchorIdToRemotePeers(anchorId); // ネットワークで共有 } |
デバイス間でのアンカー同期フロー
| フェーズ | 処理内容 |
|---|---|
| 送信側 (端末 A) | アンカー ID を Photon/Fusion の RPC または Unity Netcode の ServerRpc で全クライアントへ配信。 |
| 受信側 (端末 B) | SpatialAnchor.ResolveAsync(anchorId) でクラウドからアンカー情報を取得し、ローカル座標系に変換してオブジェクト配置。 |
|
1 2 3 4 5 6 7 |
// 受信側の例(Fusion 用) [Rpc(RpcSources.All, RpcTargets.All)] async void RpcReceiveAnchor(string anchorId) { var remoteAnchor = await SpatialAnchor.ResolveAsync(anchorId); Instantiate(prefab, remoteAnchor.Position, remoteAnchor.Rotation); } |
アンカー解決はネットワーク遅延の影響を受けやすいため、タイムアウト処理(例: 10 秒以内に取得できなければ再要求)を実装することが推奨されます。
マルチプレイヤー向けネットワークスタック選択と統合
リアルタイム同期の要件に合わせて Photon Fusion と Unity Netcode for GameObjects のどちらを採用すべきか比較し、Figmin XR の非同期メッシュ取得を組み込む具体例を示します。
Photon Fusion と Unity Netcode の比較
| 項目 | Photon Fusion | Unity Netcode |
|---|---|---|
| 同期方式 | Snapshot + Delta Compression(高頻度更新に最適) | NetworkTransform による自動補間 |
| カスタム RPC 実装 | Fusion.RpcInvoke(低レイテンシ) |
ServerRpc / ClientRpc(標準的) |
| Tick Rate 調整 | Runner.Simulation.TickRate で 5‑120 Hz の柔軟設定可能 |
固定 30 Hz(カスタマイズは困難) |
| Figmin XR 連携のしやすさ | 非同期タスクを FixedUpdateNetwork 内で呼び出せるため、メッシュ取得と同時送信が容易 |
タスク結果を OnNetworkSpawn 後にキューイングする必要あり |
公式ドキュメントは以下から参照できます。
- Photon Fusion: https://doc.photonengine.com/fusion/current/
- Unity Netcode: https://docs-multiplayer.unity3d.com/netcode/current/
Figmin XR と Photon Fusion の統合例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using Fusion; using FigminXR; using UnityEngine; public class MRNetworkSync : NetworkBehaviour { [SerializeField] GameObject mrPrefab; // 30 Hz に合わせて Mesh データを送信(サーバ側のみ実行) public override void FixedUpdateNetwork() { if (Runner.IsServer && GetInput(out var _)) { _ = SendCurrentMeshAsync(); } } private async System.Threading.Tasks.Task SendCurrentMeshAsync() { Mesh mesh = await MeshProvider.GetCurrentMeshAsync(); // 非同期取得 byte[] payload = MeshSerializer.Serialize(mesh); // 圧縮シリアライズ RpcBroadcastMesh(payload); } [Rpc(RpcSources.All, RpcTargets.All)] private void RpcBroadcastMesh(byte[] data) { Mesh mesh = MeshSerializer.Deserialize(data); var go = Instantiate(mrPrefab); go.GetComponent<MeshFilter>().sharedMesh = mesh; } } |
データ圧縮と帯域幅対策(MeshSerializer)
- 座標量子化:頂点を 16‑bit 固定小数に変換し、1 MB のメッシュが約 300 KB に削減。
- LZ4 圧縮:Unity が標準で提供する高速圧縮アルゴリズムを利用し、CPU 負荷は 0.8 ms 以下(Figmin XR ベンチマーク参照)。
圧縮・復元のオーバーヘッドは非同期タスクとして実行できるため、フレームレートへの影響はほぼ無視できます。
開発・テストフローとベストプラクティス
本章ではエディタシミュレーションから実機デバッグ、リリース前の最終チェックまでを段階的に紹介します。安定したマルチプレイヤー MR アプリを提供するためには、自動化テストと手動検証の併用 が不可欠です。
エディタシミュレーション手順
- Unity の Play Mode で
NetworkRunnerを Host モード起動し、ローカルだけでアンカー生成・RPC 流れを確認。 - コンソールに
FigminXR.Passthrough.IsEnabledとSpatialAnchor.Idが正しく出力されるかチェックする。 - Unity Test Framework(UTest)を用いて、
MeshProvider.GetCurrentMeshAsync()の戻り値がnullでないことを自動テストに組み込む。
実機デバッグのポイント
| 項目 | 確認内容 |
|---|---|
| ADB ログ | adb logcat -s Unity,FigminXR で Passthrough、MeshProvider、SpatialAnchor のステータスコードを監視。 |
| フレームタイミング | Oculus Developer Dashboard → Performance タブで 90 fps を維持できているか確認(特に MeshSerializer が UI スレッドを占有しないこと)。 |
| ネットワーク品質 | Runner.Statistics から RTT とパケットロス率を取得し、1 % 未満を目安に調整。 |
リリース前チェックリスト
- AndroidManifest.xml に以下が必須
xml
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="com.oculus.permission.USE_XR_FEATURES"/> - パフォーマンス測定:Oculus Profiler の GPU Time が 11 ms 以下、CPU 主スレッドが 10 ms 未満であること。
- マルチデバイステスト:最低 2 台の Quest 3 で同時接続し、アンカー位置が 5 cm 以内に一致するか確認。
- ビルドサイズ最適化:未使用の Unity パッケージ(例: Analytics)は
Project Settings > Playerから除外。
まとめ
| 項目 | 要点 |
|---|---|
| 開発環境 | Unity 2022.3 LTS + Figmin XR SDK v2.1+、Quest 3 の開発者モードと ADB が必須。 |
| API 基礎 | Passthrough, MeshProvider, PhysicsEngine を非同期で扱い、MeshSerializer で帯域削減。 |
| 空間共有 | Shared Spatial Anchors によりアンカー ID だけで複数デバイスが同一座標系を利用可能。 |
| ネットワーク選択 | 高頻度更新が必要なら Photon Fusion、シンプルさと公式サポート重視なら Unity Netcode。 |
| ベストプラクティス | エディタシミュレーション → 実機デバッグ → リリース前の性能・安定性チェックを順守する。 |
本ガイドに沿って環境構築からマルチプレイヤー実装、テストまでを体系的に進めれば、Quest 3 向け Figmin XR MR アプリを高品質かつ安定してリリースできるでしょう。ぜひプロジェクトに取り入れてみてください。