開発

共有空間アンカー

更新日時: 2026/10/07

概要

共有空間アンカー(SSA)機能を使えば、同じ物理スペースにいるプレイヤーが同じゲームをする間、コンテンツを共有することができます。SSAにより、多くのユーザーが参照するための共有ワールドロックフレームを作ることができます。例えば、2人以上で同じテーブルに座って、その上でバーチャルボードゲームをプレイすることができます。現在SSAでは、単一ルームでのローカルマルチプレイヤーゲームがサポートされています。
空間アンカーを作成して共有するにはMeta XR Core SDK⁠を使いますが、共有を有効にするには、サードパーティのネットワークソリューションを使います。Unity用のドキュメントとサンプルでは、Photon Unity Networking⁠を利用できます。Meta VRデバイス向けのマルチプレイヤーエクスペリエンス作成についてのベストプラクティスや参考文献については、マルチプレイヤーの有効化をご覧ください。
後出のSSAのしくみのセクションでは、SSAがマルチプレイヤー対応アプリにどうフィットするかについて説明しています。
このページを読むと、以下のことができるようになります。
  • マルチプレイヤー環境における共有空間アンカーの機能について説明する。
  • 共有空間アンカー用にアプリを設定する手順について説明する。
  • OVRSpatialAnchorのメソッドを使った空間アンカーの作成、保存、共有、読み込みの処理を定義する。
空間アンカーサンプルをビルドできるなら、SSAを使ってアプリをビルドできます。共有空間アンカーの作業をする前に、空間アンカーを使う練習として、空間アンカー基本チュートリアルと共有空間アンカーサンプルを使用する必要があります。

グループベースとユーザーベースでの空間アンカーの共有と読み込み

現在のv71では、空間アンカーの共有と読み込みはユーザーではなくグループに基づいて行われます。
アンカーの共有と読み込みに関するグループベースとユーザーベースの主な違いをいくつか紹介します。

グループベースのアンカーの共有と読み込み

  • 任意のグループUUIDを使ってアンカーの共有と読み込みを行う方法
  • ユーザーベースの共有と比べて前提条件が少ない
  • v71以降でサポート
  • アンカーの共有と読み込みに関して推奨されるアプローチ

ユーザーベースのアンカーの共有と読み込み

  • OculusユーザーIDを使用して、特定のユーザーとアンカーを共有し、読み込む方法
  • ユーザーIDへのアクセスとユーザープロフィールのデータアクセス許可をリクエストするため、Questストアアプリを作成することが必要
  • グループベースのバージョンに比べて前提条件が多い
Unityの開発の場合、どちらのアプローチでも、OVRSpatialAnchor.SaveAnchorAsync()を通じて空間アンカーを保存した後、それを共有するためにOVRSpatialAnchor.ShareAsync()のバリエーションを利用しています。
グループIDまたは一連のユーザーとの共有に成功したアンカーは、OVRSpatialAnchor.LoadUnboundSharedAnchorsAsync()のバリエーションを呼び出すことにより、各共有相手が読み込めるようになります。
SSAが別のユーザーによって読み込まれると、そのユーザーのデバイス上にダウンロードされます。その時点では、元の空間アンカーのローカルコピーのように動作します。アンカーインスタンスを破棄しても、共有されているアンカーに影響はなく、将来もう一度アクセスする際のユーザーのアクセス許可が変更されることもありません。

グループベースの関数

public static OVRTask<OVRResult<OVRAnchor.ShareResult>> ShareAsync(IEnumerable<OVRSpatialAnchor> anchors, Guid groupUuid);

public static OVRTask<OVRResult<OVRAnchor.ShareResult>> ShareAsync(IEnumerable<OVRSpatialAnchor> anchors, IEnumerable<Guid> groupUuids);

public static OVRTask<OVRResult<List<UnboundAnchor>, OperationResult>> LoadUnboundSharedAnchorsAsync(Guid groupUuid, List<UnboundAnchor> unboundAnchors)

グループベースの空間アンカーの共有と読み込みを開始する

Use the Colocation building block for Colocation Discovery
v74以降では、[Use Colocation Session (コロケーションセッションを使う)]オプションを指定してコロケーションビルディングブロックを使用することで、コロケーション発見を有効にできます。この方法では、Colocation Discovery APIやGroup Sharing APIを使って、マッチメイクやアンカー共有など、プレイヤー間のネットワーク通信を容易にします。

デバイスの要件

  • Meta Quest 2、Quest Pro、Quest 3、Quest 3S、またはMeta VR Glasses
  • Meta XR Core SDK⁠ v71以降が実行されていること

拡張空間サービス

Meta Questデバイスで拡張空間サービスをオンにするには、[Settings (設定)] > [Privacy and Safety (プライバシーと安全性)] > [Device Permissions (デバイスアクセス許可)]に進み、[Enhanced Spatial Services (拡張空間サービス)]を選択してください。
アプリでは、この設定が無効にされていることを検出し、ユーザーに有効にするよう通知することができます。ユーザーが拡張空間サービスを有効にしていない場合は、データを共有したり(ShareAsync)、他のユーザーが読み込もうとしたりすると(LoadSharedAnchorsAsync)、アプリはエラーコードOVRSpatialAnchor.OperationResult.Failure_SpaceCloudStorageDisabledを受け取ります。

共有空間アンカーを有効にする

OVRManagerアクセス許可を追加する

OVRCameraRigで[Unity Inspector (Unityインスペクター)]に移動し、[OVRManager’s Quest Features (OVRManagerのQuest機能)]セクションで、[Shared Spatial Anchors (共有空間アンカー)]と[Passthrough (パススルー)]を有効にします。
Set up the OVRCameraRig for shared spatial anchors

別の方法: Androidマニフェストを使ってアクセス許可を追加する

OVRManagerを使ってアクセス許可を有効にする代わりに、Androidマニフェストを通じてアクセス許可を追加することにより、共有空間アンカーを有効にすることもできます。
Unity EditorでSSAをサポートするようにプロジェクトマニフェストを更新するには、[Window (ウィンドウ)] > [Meta] > [Tools (ツール)]に移動し、[Create store-compatible AndroidManifest.xml (ストア互換のAndroidManifest.xmlを作成)]を選択します。
SSAとパススルーが機能するには、以下のアクセス許可が必要です。
<uses-permission android:name="com.oculus.permission.USE_ANCHOR_API" /><uses-permission android:name="com.oculus.permission.IMPORT_EXPORT_IOT_MAP_DATA" android:required="false" /><uses-feature android:name="com.oculus.feature.PASSTHROUGH" android:required="true" />

グループベースの共有と読み込みについての説明

グループベースの共有では、以下の2つの点でアプリのロジックが簡略化されます。
  1. 空間アンカーを共有するプレイヤーは、共有相手のユーザーIDをトラッキングする必要がありません。代わりに、すべてのクライアントが参照できる固有のグループIDを通じて共有できます。
  2. グループIDを使って、グループに共有されているすべてのアンカーについて問い合わせることができるため、読み込むアンカーIDのリストを維持する必要がありません。
SSAをグループと共有する前に、参加者のうちの1人が、グループを表す単一のUUIDを作成し、他の参加者に伝える必要があります。そのための通信手段としては、アプリで管理するネットワーク接続か、コロケーション発見のいずれかが可能です。後者を使えば、コロケーションエクスペリエンスの設定に関係したエンドユーザーの面倒な作業を大幅に軽減できます。グループIDが作成されて伝播された後、プレイヤーが以前に保存した空間アンカーを共有したい場合、次の呼び出しを行います。
// Share multiple anchors with a group
public static OVRTask<OperationResult> ShareAsync(
    IEnumerable<OVRSpatialAnchor> anchors,
    Guid groupUuid);
次に共有相手が以下のメソッドを呼び出すことによって、このグループで共有されているすべての空間アンカーを読み込みます。
public static OVRTask<OVRResult<List<UnboundAnchor>, OperationResult>> LoadUnboundSharedAnchorsAsync(
    Guid groupUuid,
    List<UnboundAnchor> unboundAnchors)
こちらで説明されているように、未バインドの各アンカーを利用する前にローカライズする必要があります。
グループを使ってさらに多くのアンカーが共有された場合、アプリは、グループのアンカーを再読み込みする必要があることを各クライアントに伝える必要があります。ただし、個々のアンカーのIDを各クライアントに伝える必要はありません。

ユーザーベースの関数

public OVRTask<OperationResult> ShareAsync(OVRSpaceUser user);

public OVRTask<OperationResult> ShareAsync(OVRSpaceUser user1, OVRSpaceUser user2);

public OVRTask<OperationResult> ShareAsync(OVRSpaceUser user1, OVRSpaceUser user2, OVRSpaceUser user3);

public OVRTask<OperationResult> ShareAsync(OVRSpaceUser user1, OVRSpaceUser user2, OVRSpaceUser user3, OVRSpaceUser user4);

public OVRTask<OperationResult> ShareAsync(IEnumerable<OVRSpaceUser> users);

public static OVRTask<OperationResult> ShareAsync(IEnumerable<OVRSpatialAnchor> anchors, IEnumerable<OVRSpaceUser> users);

public static OVRTask<OVRResult<List<UnboundAnchor>, OVRAnchor.FetchResult>> LoadUnboundAnchorsAsync(IEnumerable<Guid> uuids, List<UnboundAnchor> unboundAnchors, Action<List<UnboundAnchor>, int> onIncrementalResultsAvailable = null);

public static OVRTask<OVRResult<List<UnboundAnchor>, OperationResult>> LoadUnboundSharedAnchorsAsync(IEnumerable<Guid> uuids, List<UnboundAnchor> unboundAnchors)

共有空間アンカーを有効にする

拡張空間サービスを有効にする

Unity Editorで拡張空間サービスをオンにするには、[Settings (設定)] > [Privacy and Safety (プライバシーと安全性)] > [Device Permissions (デバイスアクセス許可)]に移動し、[Enhanced Spatial Services (拡張空間サービス)]を選択します。
アプリでは、この設定が無効にされていることを検出し、ユーザーに有効にするよう通知することができます。ユーザーが拡張空間サービスを有効にしていない場合は、データを共有したり(ShareAsync)、他のユーザーが読み込もうとしたりすると(LoadSharedAnchorsAsync)、アプリはエラーコードOVRSpatialAnchor.OperationResult.Failure_SpaceCloudStorageDisabledを受け取ります。

OVRManagerアクセス許可を追加する

Unity Editorの[Hierarchy (階層)]で該当するOVRCameraRigを選択した後、[Unity Inspector (Unityインスペクター)]に移動し、OVRManagerの[Quest Features (Quest機能)]セクションの下で[Shared Spatial Anchors (共有空間アンカー)]と[Passthrough (パススルー)]を有効にします。
Set up the OVRCameraRig for shared spatial anchors

別の方法: Androidマニフェストを使ってアクセス許可を追加する

OVRManagerを使ってアクセス許可を有効にする代わりに、Androidマニフェストを通じてアクセス許可を追加することにより、共有空間アンカーを有効にすることもできます。
Unity EditorでSSAをサポートするようにプロジェクトマニフェストを更新するには、[Window (ウィンドウ)] > [Meta] > [Tools (ツール)]に移動し、[Create store-compatible AndroidManifest.xml (ストア互換のAndroidManifest.xmlを作成)]を選択します。
SSAとパススルーが機能するには、以下のアクセス許可が必要です。
<uses-permission android:name="com.oculus.permission.USE_ANCHOR_API" /><uses-permission android:name="com.oculus.permission.IMPORT_EXPORT_IOT_MAP_DATA" android:required="false" /><uses-feature android:name="com.oculus.feature.PASSTHROUGH" android:required="true" />

設定

さらに、開発中に共有空間アンカーが動作するようにするには、次のいずれかの条件を満たしている必要があります。

[Data Use Checkup (データの使用状況の確認)]で[User ID (ユーザーID)]と[User Profile (ユーザープロフィール)]を有効にする

注: このセクションが必要になるのは、Oculus IDを使って空間アンカーを共有する場合だけです。グループUUIDを使って空間アンカーを共有する場合、このセクションは不要です。
アプリを作成する際、Meta Horizonストアを選択します。Linkを使ってPCからアプリを実行する場合は、これらの手順を繰り返してPCVRアプリも作成してください。
各アプリでデータ使用状況の確認を完了する必要があります。空間アンカーを永続的なものにするためには、次のようにします。
  1. アプリに対する管理者アクセス権をまだ取得していない場合は取得します。
  2. Meta Horizon開発者ダッシュボード⁠にログインします。
  3. アプリを選択します。
  4. 左側のナビゲーションで[Requirements (要件)] > [Data Use Checkup (データの使用状況の確認)]の順にクリックします。
  5. [User ID (ユーザーID)]と[User Profile (ユーザープロフィール)]のプラットフォーム機能を追加してから、リクエストを送信します。
アプリの作成方法について、詳しくはアプリの作成と管理のページをご覧ください。

ユーザーベースの共有と読み込みについての説明

空間アンカーを共有しようとするSSAクライアントにユーザーベースのアプローチを適用する場合は、特定のユーザーのapp-scoped user IDを指定します。このIDは、OculusPlatform.Users.GetLoggedInUserID()を通じて各クライアントに対して利用可能になります。さらに、共有する全アンカーの固有のIDを、すべての共有相手に伝える必要があります。アプリコードは、これらのユーザーIDとアンカーIDをすべての位置共有クライアントに伝える役割をします。
すべてのユーザーIDが共有元に伝えられたら、以下の呼び出しにより、以前に保存した空間アンカーを共有することができます。
// Share multiple anchors with a group
public static OVRTask<OperationResult> ShareAsync(
    IEnumerable<OVRSpatialAnchor> anchors,
    IEnumerable<OVRSpaceUser> users);
次に共有相手が以下のメソッドを呼び出すことによって、このグループで共有されているすべての空間アンカーを読み込みます。
public static OVRTask<OVRResult<List<UnboundAnchor>, OperationResult>> LoadUnboundSharedAnchorsAsync(
    IEnumerable<Guid> uuids,
    List<UnboundAnchor> unboundAnchors)
こちらで説明されているように、未バインドの各アンカーを利用する前にローカライズする必要があります。
さらに多くのユーザーが参加したり退出したりして多くのアンカーが共有された場合、アプリはこれらの変更についてすべてのクライアントに伝える必要があり、新しいアンカーが共有されたら各クライアントに通知する必要があります。

実装

プレイヤー間で空間アンカーを共有するということは、マルチプレイヤー環境であるということでもあります。詳しくは、Photon Unity Networking⁠をご覧ください。Metaの共有空間アンカーのUnityサンプル⁠では、Photon Unity Networkingが使われています。
アプリにSSAを統合する処理の概要は、以下のとおりです。
  1. ユーザーを相互につなぐため、ネットワークソリューションを使ってルームを作成します。メンバーシップ、アクティビティボード、または招待のいずれかによって、複数のユーザーが同じルームに参加するようにします。例えば、これを達成するには、Photonのマッチメイクとロビーの機能が役立ちます。
  2. OVRSpatialAnchorコンポーネントが含まれるオブジェクトをインスタンス化することにより、アンカーを作成します。
  3. OVRSpatialAnchor.SaveAnchorAsync()を使ってアンカーを保存します。この呼び出しが完了するのを待ってから、アンカーを共有します。
  4. ルームの全プレイヤーに対してOVRSpatialAnchor.ShareAsync()を使うことにより、アンカーを一連のユーザーと共有します。この呼び出しが完了するとすぐに、他のプレイヤーがSSAを読み込むことができるようになります。
  5. アンカーのUUIDを一斉送信します。例えば、ネットワーキングソリューションを使って、ルーム内のすべてのプレイヤーにSSAのUUIDを一斉送信します。
  6. アンカーを読み込みます。これで各プレイヤーは、OVRSpatialAnchor.LoadUnboundSharedAnchorsAsync()を使って、上記ステップのUUIDによってアンカーを読み込むことができるようになります
  7. これで全プレイヤーが、アンカーを共有座標フレームまたは原点として使うことができるようになります。

SSAのしくみ

空間アンカーを共有することで、そのポイントクラウドデータを共有し、どのユーザーIDまたはどのグループIDにその読み込みを許可するかを指定することになります。
注: 利用しているネットワークソリューションに関係なく、空間アンカーの共有相手となるすべてのユーザーやグループは、アプリで拡張空間サービスを有効にしていなければなりません。それによりユーザーは、共有されるアンカーにアクセスできるようになります。

SSAを保存する

空間アンカーを共有する前に、まず保存する必要があります。OVRSpatialAnchorメソッドのSaveAnchorAsync()を使うことができます。このメソッドは非同期です。

戻り値

ShareAsyncは、awaitを実行したり、ContinueWithを使ってコールバックを使用したりできる、待機可能なタスクに似たオブジェクトを返します。Meta XR Core SDK⁠でのタスクベースのプログラミングについて詳しくは、非同期タスクをご覧ください。
タスクのOperationResultを使うことにより、共有が成功したかどうか、また失敗した場合にどんなアクションが必要かを調べることができます。
usersパラメーターにより、アンカーを共有するユーザーのOVRSpaceUserオブジェクトのコレクションを指定します。ShareAsync()の呼び出しが成功すると、指定されたユーザーはSSAを利用できるようになります。

例

public async void ShareExample(
    OVRSpatialAnchor spatialAnchor,
    IEnumerable<OVRSpaceUser> users)
{
    var result = await spatialAnchor.ShareAsync(users);
    if (result.IsSuccess())
    {
        BroadcastUuidToUsers(spatialAnchor.Uuid);
        return;
    }

    switch (result)
    {
        case OVRSpatialAnchor.OperationResult.Failure_SpaceNetworkRequestFailed:
        {
            // Unable to reach Meta servers.
            // Instruct user to check internet connection
            break;
        }
        case OVRSpatialAnchor.OperationResult.Failure_SpaceCloudStorageDisabled:
        {
            // inform user to turn on Enhanced Spatial Services
            // Settings > Privacy and Safety > Device Permissions > Turn on "Enhanced Spatial Services"
            break;
        }
        // ...
    }
}

OVRSpaceUserオブジェクト

アンカーを共有する一連のユーザーを指定する必要があります。そのためには、各ユーザーのMeta Quest ID (ulongの識別子)からOVRSpaceUserを作成します。
var users = new OVRSpaceUser[]
{
    new OVRSpaceUser(userId1),
    new OVRSpaceUser(userId2),
};

ShareExample(anchor, users);
現在のユーザーとその友達に関する情報を取得する方法については、ユーザー、友達、関係のセクションをご覧ください。

例

このスニペットは、ユーザーのコレクションに対して空間アンカーを共有する処理を示しています。
async void ShareExample(OVRSpatialAnchor anchor, OVRSpaceUser[] users)
{
    var shareResult = await anchor.ShareAsync(users);
    if (shareResult.IsError())
    {
        Debug.LogError($"Sharing failed with {shareResult}");
        return;
    }

    Debug.Log($"Anchor {anchor.Uuid} shared with {users.Length} users.");
}

共有エクスペリエンスでの健康と安全

コロケーション共有空間アンカーエクスペリエンスでは、ユーザーの安全に特に注意する必要があります。複数のユーザーがMeta QuestヘッドセットやMeta VR Glassesを装着して物理スペースを共有している場合、特にデバイスの視野外では、お互いの位置や動きを完全には把握できないことがあります。
Unity-SharedSpatialAnchors⁠サンプルアプリには、ユーザーの安全を確保するためのパススルーベースの2つの手法を示す、コロケーションにおける健康と安全に関するシーンが含まれています。
  • 方向性のあるパススルーでは、ヘッドセットの視野外にいるコロケーション環境のユーザーの方向にパススルーウィンドウがレンダリングされます。これにより、ユーザーは直接見えない近くにいる人の存在と方向を知ることができます。没入型VRエクスペリエンスでは、これはパススルーカットアウトとして表示されます。パススルーベースのエクスペリエンスでは、これを調整して、方向を示す合図として色付きのバーチャルコンテンツ(赤い帯など)を表示できます。
  • セグメント型パススルーでは、コロケーション環境の各ユーザーのトラッキング対象アバターの周囲にパススルーカットアウトが適用されます。カットアウトは姿勢推定エラーを考慮してアバターよりも広く設定され、下半身も含まれるように拡張されます。このサンプルでは、オールウェイズオンのパススルー、距離トリガーのパススルー、モメンタムトリガーのパススルーという複数のトリガーモードがサポートされています。
これらのテクニックを組み合わせることで、トラッキング対象アバターの視覚上および聴覚上の位置が物理的なユーザーと完全には一致しない場合でも、他のユーザーに対する空間認識を維持しやすくなります。複合現実の安全に関する一般的なガイダンスについては、複合現実のデザインガイドラインをご覧ください。

既知の問題

共有空間アンカーが正しい位置にローカライズされない場合があるという既知の問題があります。以下では、その問題点と対処法について説明します。
問題1:
  • 再現手順
    • ホスト: ShareAsyncを呼び出す
    • ホスト: アプリを終了する
    • ホスト: デバイスを大幅に動かさない
    • ホスト: アプリを再開する
    • ホスト: ShareAsyncを呼び出す
    • ゲスト: LoadUnboundSharedAnchorsAsyncを呼び出す
    • ゲスト: 共有空間アンカーが正しい位置に読み込まれないことがある
  • 対処法
    • ホストがアプリを終了した場合、ホストはデバイスを移動する必要があります
問題 2:
ゲストがローカルに保存しているアンカーが多すぎる可能性があります
  • 対処法
    • [Settings (設定)] > [Privacy (プライバシー)] > [Clear Physical Space History (物理スペース履歴をクリア)]に移動します

SSAサンプルとウォークスルー

SSAの使用をハイライトする2つのサンプルがあります。どちらも、oculus-samples⁠ GitHubリポジトリで入手可能です。これらのアプリは、どちらもプレイヤーデータを共有するためにPhoton Unity Networking⁠を使います。
  • Unity-SharedSpatialAnchors⁠ショーケースアプリは、共有空間アンカーの実装方法を示す確立されたアプリです。このアプリのユーザーは、共存スペースの中でネットワーク接続された複数オブジェクトとのインタラクションが可能になります。共有空間アンカーサンプルのページには、このサンプルをビルドする方法や使い方に関するドキュメントがあります。
  • Unity-Discover⁠ショーケースアプリは、機能の数が少ない新しいアプリです。これは、多目的アプリの中で単一のSSAを効果的に使う方法を示しています。SSAの実装方法について、詳しくは共有空間アンカー(SSA)ウォークスルーをご覧ください

詳しくはこちら

空間アンカーについて、詳しくは以下のページをご覧ください。
Meta Questで空間アンカーを利用する方法を示すその他のサンプルについては、oculus-samplesのGitHubリポジトリをご覧ください。
UnityでMeta VRデバイス向けの開発を始めるには、Meta VRデバイス向けのUnityアプリを開発するをご覧ください。