Mixed Reality (ローカルマルチプレイヤー)

Level
INTERMEDIATE

概要

このサンプルは、以下のようなプロジェクトのセットアップ方法を示します。

  • Meta shared spatial anchorsインテグレーションで共存するマルチプレイヤー
  • ハンドトラッキングの同期と、コントローラーベースのハンドトラッキングからフィンガートラッキングへの切り替え

技術情報

  • サンプルは共有モード(Shared Mode)を使用
  • 開発環境は、Unity 2022.3、Fusion 2、Photon Voice 2.53

事前準備

サンプルを実行するには、

  • ダッシュボードからFusionのAppIdを作成して、Realtime Settings(Fusionメニューから選択可能)のApp Id Fusionフィールドに貼り付けてください。

  • ダッシュボードからVoiceのAppIdを作成して、Realtime SettingsのApp Id Voiceフィールドに貼り付けてください。

  • それから、SampleSceneWithNetworkRigシーンをロードして、Playを押してください。

ダウンロード

VersionRelease DateDownload
2.0.53月 04, 2025Fusion mixedreality 2.0.5

テスト

コロカライゼーションをテストするには、Metaリリースチャネルでアプリケーションを配布する必要があります。

アプリケーションのテストでお困りでしたら、Discordでお尋ねください。

操作方法

Meta Quest (コントローラートラッキング)

  • 掴む: オブジェクトに手を置いて、コントローラーのグラブボタンを使用して掴む
  • 描く: 掴めるオブジェクトに手を置いていなければ、コントローラーのトリガーボタンを使用して描き始める(描き終わった数秒後に、線描をアンカーで掴めるようになる)

Meta Quest (ハンドトラッキング)

  • 掴む: 指でつまんでいる間オブジェクトを掴む
  • 描く: 掴めるオブジェクトに手を置いていなければ、指をつまんで描き始める(描き終わった数秒後に、線描をアンカーで掴めるようになる)

フォルダー構造

サンプルに関するファイルは、メインフォルダーの/MixedReality以下にすべて含まれます。

/IndustriesComponentsには、他のIndustries Samples(Fusion Meetingサンプルや、Fusion Metaverseサンプルなど)と共有されるコンポーネントが含まれます。

/Photonフォルダーには、FusionとPhoton Voice SDKが含まれます。

/Photon/FusionXRSharedフォルダーには、リグとグラブのロジックが含まれます。これはVR Sharedサンプルを元にしており、その軽量なFusionXRShared SDKは他のプロジェクトでも共有されています。

/Photon/FusionAddonsフォルダーには、このサンプルで使用されるIndustriesアドオンが含まれます。

/XRフォルダーには、VRの設定ファイルが含まれます。

アーキテクチャ概要

Mixed Realityサンプルは、VR Sharedと同じコードベースに依存しています(特にリグの同期)。

ここで使われるグラブシステムは、VR Shared - Local rig grabbingページの実装の改変版です。

コロカライゼーション(Shared Spatial Anchors)

複合現実では、ユーザーが同じルームにいるなら、互いのアバターや現実世界の位置が見られるとより快適です。そのために、ルームに接続中のユーザーが既に存在していたら、新しいユーザーはそのUnityのルームにテレポートさせることで、現実世界で見えているものとネットワーク上のルームの位置を一致させることができます。

これにはshared spatial anchorsが使用されています。
現実世界のルームの点群の共有、Metaバックエンド上での同期と共有に基づいており、開発者のIDが利用可能です。
全体のプロセスは以下の通りです。

  1. ルームに接続した時に、アンカーを作成し、Metaバックエンドに保存し、IDはFusionで同期されます
  2. 接続した他のユーザーは、FusionからアンカーIDを受信します
  3. それから、ルームにそのIDが存在するかをMeta SDKに問い合わせます(シーンの裏で、MetaバックエンドにIDをリクエストし、ローカルのルックアップが実行されます)
  4. アンカーが見つかったら、新しいユーザーのテレポートが実行されます

これはこのサンプルでは、SSAManagerOculusUserInfoReferenceAnchorコンポーネントで行われます。

ネットワークデータ

OculusUserInfoNetworkBehaviourで、ユーザーのリグに置かれ、ユーザーのMeta IDやコロカライゼーションの状態を同期します。

ReferenceAnchorNetworkBehaviourで、各Shared Spatial Anchorで作成され、アンカーID(UUID)と共有されているユーザーIDのリストを同期します。そこに配置されるゲームオブジェクトはNetworkTransformを含み、位置が同期されます。

SSAManagerは、Shared Spatial Anchorsを制御するすべての操作を実装し、作成・ルックアップかMetaバックエンドの同期を行います。また、すべてのアンカーとユーザーを追跡し、コロカライゼーション時にローカルユーザーにテレポートを適用します。

共有アンカー同期プロセスの詳細

Shared Spatial Anchor制御の基本的なプロセスは、ドキュメントの"big picture" about SSA chapterで説明されています。

このサンプルのSSAを実装する3つのクラスのロジックとタスクの区分の理解を深めるための、Shared Spatial Anchors制御に使用される完全なプロセスは以下の通りで、それぞれのクラスが各ステップを制御します。

すべてのユーザー上:

  1. [OculusUserInfo] Oculus Platform Core SDKの初期化を待つ
  2. [OculusUserInfo] ユーザーにアプリケーションの使用権があるかチェックする
  3. [OculusUserInfo] ログインしたユーザーのOculus User IDを取得する
  4. [OculusUserInfo] Fusion networking: Oculus IDをネットワーク変数に保存して、他のユーザーがアクセスできるようにする

アンカーを作成したユーザー上:

  1. [ReferenceAnchor] ローカルのOculus User IDが使用可能になるまで待つ
  2. [ReferenceAnchor] Shared Spatial Anchorを作成する(SSAManagerを使用)
  3. [ReferenceAnchor] 共有アンカーにUUIDが割り当てられて準備完了になるまで待つ
  4. [ReferenceAnchor] Metaバックエンドにアンカーを保存する(SSAManagerを使用)
  5. [ReferenceAnchor] Fusion networking: ネットワーク変数にアンカーのUUIDを保存する
  6. [ReferenceAnchor] Metaバックエンドのアンカー位置にアクセスするため、ルームのすべてのOculus User IDに権限を与える(SSAManagerを使用)
  7. [ReferenceAnchor] Fusion networking: アンカーにアクセスできるOculus User IDのリストをネットワーク配列で保存する

リモートのアンカーを探すユーザー上:

  1. [ReferenceAnchor] Fusion networking: アンカーのUUIDを受信する
  2. [ReferenceAnchor] Fusion networking: ローカルのOculus User IDがMetaバックエンドのアンカーのアクセス権限を得ているかを知るために、ユーザーリストをチェックする
  3. [ReferenceAnchor] 現実世界のルームのアンカーを探すためにMeta SDKに問い合わせる(SSAManagerを使用)
  4. [ReferenceAnchor] ルームでアンカーが検知されたら、Shared Spatial Anchorを作成し、検知したデータをバインドする(SSAManagerを使用)
  5. [ReferenceAnchor] Shared Spatial Anchorがローカライズされるまで待つ(SSAManagerを使用)
  6. [SSAManager] アンカーのネットワーク位置(兄弟のNetworkTransformコンポーネントから受信)と現実世界のアンカー位置を一致させるため、ユーザーのハードウェアリグを再配置する

ここで説明したコロカライゼーションプロセスの理解を助けるため、ルーム中央に情報パネルが表示されます。

Mixed Reality Debug Panel
Mixed Reality Debug Panel

Oculusダッシュボード要件

Shared Spatial Anchorを使用できるようにするためには、Oculus User IDが必要です。

IDにアクセスするには、Oculusダッシュボードでアプリケーションを作成する必要があります。

それから、User IDとユーザープロファイルへのアクセスリクエストと共にdata use checkupを記入してください。

Data use checkup
Data use checkup

最後に、Quest上で実際にOculus User IDにアクセスするには、release channelでアプリケーションを配布する必要があります。(そうしないと、User IDは常に0が返されます)

コロカライゼーションTips

SSAのアンカー基準のコロカライゼーションプロセスは非常に繊細です。各デバイスのコロカライゼーション体験に関して、最も重要なことはルームスキャンの品質です。

また、あるユーザーがルームに最初に入るとコロカライゼーションが全く動作しなくなることが時々あります。これはヘッドセットの点群データの共有設定に問題がある場合に発生します。(trueに設定されているなら、考慮は不要です)
これをQuest上で修正するには、「Parameters > Confidentiality > Device authorizations」から「Cloud Points」のチェックを外して再チェックしてください。「Parameters > Confidentiality > Authorizations > (Your App) > Spatial data」の設定も確認してください。

使われているXRアドオンとIndustriesアドオン

3D/XRプロジェクトのプロトタイピングを誰でも簡単に始められるように、無料のアドオンを提供しています。
詳細はXR Addonsをご覧ください。
また、Industries Circleメンバー向けに、再利用可能な総合的なアドオンを提供しています。
詳細はIndustries Addonsをご覧ください。

このサンプルで使用したアドオンは以下の通りです。

XRShared

XRSharedアドオンは、XR体験を作成するための、Fusionと互換性がある基本コンポーネントを提供しています。
プレイヤーのリグパーツの同期や、グラブやテレポートなどのシンプルな機能を担当します。

詳細はXRSharedをご覧ください。

Fingers synchronization for Meta's hands

フィンガートラッキングはMeta OVR hands synchronization add-onで提供されており、フィンガートラッキングデータの高水準な圧縮も提供しています。

Drawing

指で描画するため、drawing add-onDrawerクラスのサブクラスFinger Drawerを作成しています。

このバージョンでは、人差し指の位置(フィンガートラッキングのスケルトンかコントローラーのハンドトラッキングのスケルトンかに関係なく)を受け取るHandIndexTipDetectorコンポーネントを使用して、現在のモードに基づいた描画をトリガーしています。

ConnectionManager

接続処理の起動とユーザーのスポーンを管理するために、ConnectionManagerアドオンを使用しています。

詳細はConnectionManagerアドオンをご覧ください。

Dynamic audio group

快適さと帯域消費を最適化するユーザー間の距離を考慮しながら、ユーザー同士のチャットを可能にするため、Dynamic Audio groupアドオンを使用しています。

詳細はDynamic Audio group Industriesアドオンをご覧ください。s.

Avatar and RPMAvatar

現状のサンプルはアバター選択画面を提供していませんが、アバターのアドオンが含まれているので、Ready Player Meかシンプルなアバターを使用する選択画面を簡単に追加できます。

現在は、ローカルユーザー設定では単純にシーン上のRPMAvatarLibraryからランダムなアバターを選択します。

サードーパーティー製コンポーネント

Back to top