La fonctionnalité d’ancrages spatiaux partagés (SSA) permet aux joueurs et joueuses situé·es dans le même espace physique de partager du contenu tout en jouant au même jeu. Avec la fonctionnalité SSA, vous pouvez créer un cadre de référence partagé et ancré dans le monde réel pour un grand nombre d’utilisateurs et utilisatrices. Par exemple, plusieurs personnes peuvent s’asseoir autour de la même table et jouer à un jeu de plateau virtuel posé dessus. Actuellement, la fonctionnalité SSA prend en charge les jeux multijoueurs dans une même pièce.
Même si vous créez et partagez des ancrages spatiaux avec le SDK Meta XR Core, vous activez le partage à l’aide d’une solution réseau tierce. Dans notre documentation et nos exemples pour Unity, vous pouvez utiliser Photon Unity Networking. Consultez Activation du mode multijoueur pour plus d’informations sur les recommandations et les références en matière de création d’expériences multijoueurs pour Meta Quest.
La section Fonctionnement des ancrages SSA ci-dessous décrit comment les ancrages SSA s’intègrent dans une application multijoueur.
Après avoir lu cette page, vous saurez :
Décrire la fonctionnalité des ancrages spatiaux partagés dans un environnement multijoueur.
Expliquer la procédure de configuration d’une application pour le partage des ancrages spatiaux.
Définir le processus de création, d’enregistrement, de partage et de chargement d’un ancrage spatial à l’aide des méthodes OVRSpatialAnchor.
Présentation du partage et du chargement des ancrages spatiaux basés sur le groupe par rapport à ceux basés sur l’utilisateur ou l’utilisatrice
À partir de la version 71, le partage et le chargement des ancrages spatiaux sont basés sur les groupes plutôt que sur les utilisateur·ices.
Voici quelques différences clés entre le partage et le chargement des ancrages basés sur le groupe et basés sur l’utilisateur ou l’utilisatrice :
Partage et chargement des ancrages basés sur le groupe
Un moyen de partager et de charger des ancrages en utilisant un UUID de groupe arbitraire
Moins de conditions requises que pour le partage basé sur l’utilisateur ou l’utilisatrice
Prise en charge assurée dans la version 71 et les versions ultérieures
Approche recommandée pour le partage et le chargement des ancrages
Partage et chargement des ancrages basés sur l’utilisateur ou l’utilisatrice
Un moyen de partager et de charger des ancrages qui cible l’utilisateur ou l’utilisatrice en particulier en utilisant son identifiant Oculus
Nécessite la création d’une application Quest Store afin de demander des autorisations d’accès aux données d’identification et de profil utilisateur ou utilisatrice
Davantage de conditions requises que pour la version basée sur le groupe
Concernant le développement Unity, ces deux approches reposent sur des variantes d’OVRSpatialAnchor.ShareAsync() pour partager un ancrage spatial une fois qu’il a été enregistré via OVRSpatialAnchor.SaveAnchorAsync().
Une fois partagés avec succès, soit auprès d’un ID de groupe, soit auprès d’un ensemble d’utilisateurs et d’utilisatrices, les ancrages peuvent être chargés par chaque destinataire via l’appel d’une variante d’OVRSpatialAnchor.LoadUnboundSharedAnchorsAsync().
Lorsqu’un ancrage SSA est chargé par un autre utilisateur ou une autre utilisatrice, il est téléchargé sur son appareil et se comporte alors comme une copie locale de l’ancrage spatial d’origine. Si vous détruisez l’instance d’ancrage, cela n’affecte pas l’ancrage partagé, ni ne modifie l’autorisation de l’utilisateur ou de l’utilisatrice d’y accéder à nouveau à l’avenir.
Fonctions basées sur le groupe
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)
Premiers pas avec le partage et le chargement des ancrages spatiaux basés sur le groupe
Use the Colocation building block for Colocation Discovery
À partir de la version 74, vous pouvez utiliser le Bloc de création de colocalisation tout en activant l’option « Use Colocation Session » (Utiliser la session de colocalisation). Ceci utilise la Colocation Discovery API.pour faciliter la communication réseau entre les joueur·ses, telle que le matchmaking et le partage d’ancrage.
Pour activer les services spatiaux améliorés sur votre appareil Meta Quest, accédez à Settings > Privacy and Safety > Device Permissions (Paramètres > Confidentialité et sécurité > Autorisations de l’appareil), puis sélectionnez Enhanced Spatial Services (Services spatiaux améliorés).
Votre application peut détecter si ce paramètre est désactivé et demander aux utilisateurs et utilisatrices de l’activer. Si l’utilisateur ou l’utilisatrice n’a pas activé les services spatiaux améliorés, votre application recevra le code d’erreur OVRSpatialAnchor.OperationResult.Failure_SpaceCloudStorageDisabled si vous le partagez (ShareAsync) et si d’autres utilisateurs et utilisatrices essaient de le charger (LoadSharedAnchorsAsync).
Activation des ancrages spatiaux partagés
Ajout de l’autorisation OVRManager
Dans votre OVRCameraRig, ouvrez l’inspecteur Unity, puis activez Shared Spatial Anchors (Ancrages spatiaux partagés) et Passthrough (Caméra réelle) dans la section des fonctionnalités Quest d’OVRManager.
Méthode alternative : ajout d’une autorisation en utilisant le manifeste Android
Au lieu d’activer l’autorisation via OVRManager, vous pouvez activer les ancrages spatiaux partagés en ajoutant des autorisations via le manifeste Android.
Pour mettre à jour le manifeste de votre projet afin de prendre en charge les ancrages SSA dans l’éditeur Unity, allez dans Meta > Tools (Meta > Outils) et sélectionnez Create store-compatible AndroidManifest.xml (Créer un manifeste Android compatible avec le magasin).
Pour garantir le fonctionnement des ancrages SSA et du mode Caméra réelle, les autorisations suivantes sont requises :
Explication du partage et du chargement basés sur les groupes
Le partage basé sur les groupes simplifie la logique de l’application de deux manières :
Le joueur ou la joueuse qui partage les ancrages spatiaux n’a pas besoin de garder la trace des identifiants utilisateur ou utilisatrice avec lesquels effectuer le partage. Au lieu de cela, il est possible d’effectuer le partage via un identifiant de groupe unique auquel tous les clients peuvent faire référence.
Il n’est plus nécessaire de gérer une liste d’identifiants d’ancrage uniques à charger, car l’identifiant de groupe peut servir à rechercher l’ensemble complet des ancrages déjà partagés avec le groupe.
Avant le partage d’un ancrage SSA avec un groupe, l’une des personnes participant doit créer un UUID unique représentant le groupe et le communiquer aux autres. La communication peut se faire soit via une connexion réseau gérée par l’application, soit via Colocation Discovery, ce qui réduit considérablement les efforts engagés par les utilisateur·ices finaux·ales lors de la configuration d’expériences colocalisées. Une fois l’identifiant de groupe créé puis propagé, un joueur ou une joueuse souhaitant partager un ancrage spatial déjà enregistré doit appeler :
// Share multiple anchors with a group
public static OVRTask<OperationResult> ShareAsync(
IEnumerable<OVRSpatialAnchor> anchors,
Guid groupUuid);
Les destinataires doivent alors appeler cette méthode pour charger tous les ancrages spatiaux partagés avec le groupe :
public static OVRTask<OVRResult<List<UnboundAnchor>, OperationResult>> LoadUnboundSharedAnchorsAsync(
Guid groupUuid,
List<UnboundAnchor> unboundAnchors)
Chaque ancrage non lié devra être localisé avant de pouvoir être utilisé, comme décrit ici.
Au fur et à mesure que d’autres ancrages sont partagés avec un groupe, l’application doit signaler à chaque client la nécessité de recharger les ancrages du groupe. Néanmoins, il n’est pas nécessaire de communiquer les identifiants des ancrages individuels à chaque client.
Fonctions basées sur l’utilisateur ou l’utilisatrice
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)
Activation des ancrages spatiaux partagés
Activer les services spatiaux améliorés
Pour activer les services spatiaux améliorés dans l’éditeur Unity, accédez à Settings > Privacy and Safety > Device Permissions (Paramètres > Confidentialité et sécurité > Autorisations de l’appareil), puis sélectionnez Enhanced Spatial Services (Services spatiaux améliorés).
Votre application peut détecter si ce paramètre est désactivé et demander aux utilisateurs et utilisatrices de l’activer. Si l’utilisateur ou l’utilisatrice n’a pas activé les services spatiaux améliorés, votre application recevra le code d’erreur OVRSpatialAnchor.OperationResult.Failure_SpaceCloudStorageDisabled si vous le partagez (ShareAsync) et si d’autres utilisateurs et utilisatrices essaient de le charger (LoadSharedAnchorsAsync).
Ajout de l’autorisation OVRManager
Sélectionnez votre OVRCameraRig dans la hiérarchie de l’éditeur Unity, accédez à l’inspecteur Unity, puis dans la section Quest Features (Fonctionnalités Quest) d’OVRManager, activez Shared Spatial Anchors (Ancrages spatiaux partagés) et Passthrough (Caméra réelle).
Méthode alternative : ajout d’une autorisation en utilisant le manifeste Android
Au lieu d’activer l’autorisation via OVRManager, vous pouvez activer les ancrages spatiaux partagés en ajoutant des autorisations via le manifeste Android.
Pour mettre à jour le manifeste de votre projet afin de prendre en charge les ancrages SSA dans l’éditeur Unity, allez dans Meta > Tools (Meta > Outils) et sélectionnez Create store-compatible AndroidManifest.xml (Créer un manifeste Android compatible avec le magasin).
Pour garantir le fonctionnement des ancrages SSA et du mode Caméra réelle, les autorisations suivantes sont requises :
En outre, pour garantir le fonctionnement des ancrages spatiaux partagés durant la phase de développement, l’une des conditions suivantes doit être vraie :
Le/la développeur·se est membre d’une équipe de développeur·ses vérifiée.
Le développeur ou la développeuse reçoit l’invitation d’une équipe de développeur·ses pour rejoindre un quelconque canal de sortie autre que le canal LIVE/Production de l’application.
Activation des fonctionnalités Identifiant utilisateur·ice et Profil utilisateur·ice dans Contrôle de l’utilisation des données
Remarque : cette section n’est requise que si vous partagez un ancrage spatial en utilisant les ID Oculus. Elle ne l’est pas si vous partagez un ancrage spatial en utilisant un UUID de groupe.
Lorsque vous créez votre application, choisissez Meta Horizon Store. Si vous utilisez Link pour exécuter l’application à partir de votre PC, répétez ces étapes pour créer également une application PCVR.
Explication du partage et du chargement basés sur l’utilisateur ou l’utilisatrice
Avec l’approche basée sur l’utilisateur·ice pour le partage des ancrages spatiaux (SSA), les clients qui doivent partager des ancrages spatiaux le font avec des utilisateur·ices spécifiques en précisant leur ID utilisateur·ice spécifique à une application, lequel est mis à disposition de chaque client via OculusPlatform.Users.GetLoggedInUserID(). En outre, les identifiants uniques pour tous les ancrages partagés doivent être communiqués à tous les destinataires. Le code de l’application est chargé de communiquer ces identifiants utilisateur·ice et ces identifiants d’ancrage à tous les clients colocalisés.
Une fois que tous les identifiants utilisateur·ice sont communiqués à la personne effectuant le partage, celle-ci peut partager un ancrage spatial enregistré au préalable en appelant :
// Share multiple anchors with a group
public static OVRTask<OperationResult> ShareAsync(
IEnumerable<OVRSpatialAnchor> anchors,
IEnumerable<OVRSpaceUser> users);
Les destinataires devraient alors appeler cette méthode pour charger tous les ancrages spatiaux partagés avec le groupe :
public static OVRTask<OVRResult<List<UnboundAnchor>, OperationResult>> LoadUnboundSharedAnchorsAsync(
IEnumerable<Guid> uuids,
List<UnboundAnchor> unboundAnchors)
Chaque ancrage non lié devra être localisé avant de pouvoir être utilisé, comme décrit ici.
Au fur et à mesure que plus d’utilisateur·ices rejoignent ou quittent une expérience et que plus d’ancrages sont partagés, l’application doit communiquer ces changements à tous les clients et leur signaler lorsqu’un nouveau partage d’ancrage a lieu.
Globalement, le processus d’intégration des ancrages SSA dans votre application est le suivant :
Pour connecter les utilisateurs et utilisatrices les un·es avec les autres, créez un salon en utilisant la solution réseau. Invitez les utilisateurs et utilisatrices à rejoindre ce salon, via l’adhésion, le tableau d’activité ou une invitation. Par exemple, les fonctions de matchmaking et de lobby de Photon peuvent vous y aider.
Créez un ancrage en instanciant un objet qui contient le composant OVRSpatialAnchor.
Enregistrez l’ancrage en utilisant OVRSpatialAnchor.SaveAnchorAsync(), puis patientez le temps que l’appel prenne fin avant de partager l’ancrage.
Partagez l’ancrage avec un ensemble d’utilisateurs et d’utilisatrices en utilisant OVRSpatialAnchor.ShareAsync() pour la totalité des joueurs et joueuses du salon. Les autres joueur·ses peuvent charger l’ancrage SSA dès la fin de cet appel.
Diffusez l’UUID de l’ancrage. Par exemple, diffusez l’UUID de l’ancrage SSA à l’ensemble des joueurs et joueuses du salon en utilisant la solution réseau.
Chargez l’ancrage. Chaque joueur·se peut à présent charger l’ancrage à partir de l’UUID obtenu à l’étape ci-dessus en utilisant OVRSpatialAnchor.LoadUnboundSharedAnchorsAsync().
Tous les joueurs et toutes les joueuses peuvent désormais utiliser l’ancrage comme cadre de coordonnées partagées, ou origine.
Fonctionnement des ancrages SSA
Lorsque vous partagez un ancrage spatial, vous partagez ses données de nuage de points et spécifiez les identifiants utilisateur·ice ou l’identifiant de groupe autorisés à le charger.
Remarque : quelle que soit votre solution réseau, l’ensemble des utilisateurs et utilisatrices ou des groupes avec lesquels vous prévoyez de partager un ancrage spatial doit activer les services spatiaux améliorés dans votre application. C’est ce qui leur donne accès aux ancrages qui sont partagés avec eux.
Enregistrement d’un ancrage SSA
Avant de partager un ancrage spatial, vous devez d’abord l’enregistrer. Vous pouvez utiliser la méthode OVRSpatialAnchorSaveAnchorAsync(). Cette méthode est asynchrone.
Renvoi
ShareAsync renvoie un objet de type tâche pouvant être attendu sur lequel vous pouvez utiliser await ou un rappel à l’aide de ContinueWith. Consultez Tâches asynchrones pour plus de détails sur la programmation basée sur les tâches dans le SDK Meta XR Core.
Le résultat OperationResult de la tâche peut être utilisé pour déterminer si le partage a abouti et l’action à mener si ce n’est pas le cas.
Le paramètre users spécifie une collection d’objets OVRSpaceUser pour les utilisateurs et utilisatrices avec lesquels vous souhaitez partager des ancrages. Lorsque l’appel à ShareAsync() aboutit, les ancrages SSA sont disponibles pour les utilisateurs et utilisatrices.
Exemple
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;
}
// ...
}
}
Objet OVRSpaceUser
Vous devez indiquer l’ensemble d’utilisateur·ices avec lequel vous souhaitez partager les ancrages. Pour cela, créez un OVRSpaceUser à partir de l’ID Meta Quest de chaque utilisateur ou utilisatrice (identifiant ulong).
var users = new OVRSpaceUser[]
{
new OVRSpaceUser(userId1),
new OVRSpaceUser(userId2),
};
ShareExample(anchor, users);
Consultez la section Utilisateur·ices, ami·es et contacts pour savoir comment récupérer des informations sur l’utilisateur·ice actuel·le et ses ami·es.
Exemple
Cet extrait présente le partage d’ancrages spatiaux avec un ensemble d’utilisateurs et d’utilisatrices.
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.");
}
Problèmes connus
Certains problèmes connus empêchent la localisation correcte d’un ancrage spatial partagé. La suite de cet article aborde ces problèmes et les moyens de les atténuer.
Problème 1 :
Étapes à reproduire
Hôte : appelle ShareAsync
Hôte : quitte l’application
Hôte : ne déplace pas de manière significative son appareil Quest
Hôte : rouvre l’application
Hôte : appelle ShareAsync
Invité : appelle LoadUnboundSharedAnchorsAsync
Invité : peut observer un ancrage spatial partagé qui ne se charge pas au bon endroit
Résolution
Si l’hôte quitte l’application, il doit déplacer son appareil Quest.
Problème 2 :
Il se peut qu’un trop grand nombre d’ancrages soient stockés sur l’appareil de l’invité.
Résolution
Accédez à Paramètres > Confidentialité > Effacer l’historique de l’espace physique.
Exemple d’ancrage SSA et présentation
Deux exemples illustrant l’utilisation des ancrages SSA sont disponibles. Les deux sont disponibles dans le dépôt GitHub oculus-samples. Ces deux applications utilisent Photon Unity Networking pour partager les données des joueur·ses.
L’application de démonstration Unity-SharedSpatialAnchors est une application éprouvée qui présente l’implémentation d’ancrages spatiaux partagés et permet aux utilisateur·ices d’interagir avec des objets en réseau dans un espace en colocation. La page Exemple d’ancrages spatiaux partagés fournit une documentation sur la procédure de création et d’utilisation de l’exemple.
L’application de démonstration Unity-Discover est une application plus récente avec moins de fonctionnalités qui montre comment utiliser efficacement un seul ancrage SSA dans une application multifonction. Pour comprendre comment la fonctionnalité SSA est implémentée, consultez Présentation des ancrages spatiaux partagés (SSA)
En savoir plus
Pour en savoir plus sur les ancrages spatiaux, consultez ces pages :