Vérifier la disponibilité de la session et la prise en charge par l'appareil
Avant de démarrer la RA, il est généralement nécessaire de vérifier si la session est disponible et si l'appareil actuel prend en charge les fonctionnalités RA requises. Cet article explique comment effectuer ces vérifications.
Avant de commencer
- Comprendre les concepts de base, la composition et le flux de travail d'une session via Introduction à ARSession
- Comprendre les bases de la prise en charge des appareils et des rapports de session dans Unity via Prise en charge des appareils et rapports
- Savoir comment créer une session
Obtenir le rapport pendant le processus de démarrage
Si la session est démarrée immédiatement après l'assemblage, vous pouvez obtenir le rapport de session via l'événement StateChanged.
Il est nécessaire de s'abonner à l'événement StateChanged avant le démarrage de la session. Généralement, il est sûr de s'abonner dans Awake() :
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
Les états de session à surveiller dans le gestionnaire d'événements incluent : Ready et Broken. L'état Ready indique que la session a démarré avec succès, ce qui signifie que la session est disponible sur l'appareil actuel. L'état Broken indique que le démarrage de la session a échoué, ce qui signifie que la session n'est pas disponible sur l'appareil actuel.
L'état Broken n'apparaît pas toujours lorsque l'appareil n'est pas pris en charge. Il est donc également nécessaire d'utiliser SessionReport.BrokenReason pour obtenir la raison spécifique de l'échec.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// la session est disponible sur l'appareil actuel
}
else if (status == ARSession.SessionState.Broken)
{
// la session n'est pas disponible sur l'appareil actuel
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// les composants sélectionnés ne sont pas pris en charge par l'appareil actuel
}
else
{
// raisons indépendantes de l'appareil
}
}
}
Les raisons SessionReport.SessionBrokenReason.NoAvailabileFrameSource et SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indiquent que les composants de session ne sont pas disponibles sur l'appareil actuel ; tandis que d'autres raisons sont généralement indépendantes de l'appareil. Strictement parlant, ces deux raisons signifient que la fonctionnalité RA (et uniquement cette configuration) ne peut pas fonctionner sur cet appareil. La configuration fait référence aux fonctionnalités et paramètres sélectionnés dans l'objet session. Vous pouvez obtenir un rapport de disponibilité détaillé à partir de Report.
Dans le cas de SessionReport.SessionBrokenReason.NoAvailabileFrameSource, la session peut récupérer automatiquement si l'appareil est pris en charge lors de la mise à jour de la liste des appareils pendant le démarrage de la session.
Obtenir le rapport avant le démarrage
Si vous souhaitez effectuer une vérification avant de démarrer la session et décider de démarrer ou non la session en fonction de la situation, vous pouvez appeler manuellement Assemble() et utiliser l'événement AssembleUpdate pour obtenir le rapport de disponibilité des composants.
Il est nécessaire de s'abonner à l'événement AssembleUpdate avant l'assemblage de la session :
Session.AssembleUpdate += OnAssembleUpdate;
Lors de la première phase d'assemblage, vous pouvez toujours utiliser ARSession.SessionState et Report pour évaluer la prise en charge de la session. Cependant, le rapport de la deuxième phase ne sera pas mis à jour dans la session.
Par conséquent, lors d'un appel manuel à Assemble(), il est généralement nécessaire de traiter le rapport de disponibilité des composants dans l'événement AssembleUpdate pour déterminer si la session est disponible sur l'appareil actuel.
Il est important de surveiller la disponibilité des composants dans la liste SessionReport.AvailabilityReport.FrameSources. Si au moins un composant frame source est disponible, alors la partie SessionReport.AvailabilityReport.FrameSources est disponible sur l'appareil actuel.
Il est également nécessaire de surveiller la disponibilité des composants dans la liste SessionReport.AvailabilityReport.FrameFilters du rapport. Cependant, les critères de jugement varient selon les options d'assemblage : ils peuvent exiger que tous les frame filters soient disponibles, ou qu'un nombre quelconque de frame filters soit disponible. Par défaut, tous les frame filters doivent être disponibles.
Avec la configuration par défaut, vous pouvez utiliser le code suivant pour déterminer si les composants de session sont disponibles sur l'appareil actuel :
void OnAssembleUpdate(SessionReport.AvailabilityReport report)
{
if (report.FrameSources.Any(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available) &&
report.FrameFilters.All(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available))
{
Session.AssembleUpdate -= OnAssembleUpdate;
// les composants de session sont disponibles sur l'appareil actuel, vous pouvez démarrer la session
Session.StartSession();
}
else
{
// les composants de session ne sont pas disponibles sur l'appareil actuel
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
Notez que l'événement AssembleUpdate peut se déclencher deux fois. Dans l'exemple de code ci-dessus, l'abonnement à l'événement est annulé une fois la disponibilité des composants confirmée.
Cette méthode ne permet pas de détecter d'autres erreurs pouvant survenir pendant le démarrage de la session, mais ces erreurs sont généralement indépendantes de l'appareil. Si nécessaire, vous pouvez effectuer une vérification supplémentaire via l'événement StateChanged après le démarrage de la session.
Options lorsque les composants de session ne sont pas disponibles
Dans le développement d'applications, il est généralement souhaitable de garantir une compatibilité avec autant d'appareils que possible. Par conséquent, lorsque les composants de session ne sont pas disponibles sur l'appareil actuel, vous pouvez envisager les options suivantes :
Utiliser une fonctionnalité RA alternative de niveau inférieur
Modifiez la configuration des composants de session pour sélectionner des fonctionnalités RA prises en charge par l'appareil actuel. Consultez Création d'une session pour savoir comment modifier la configuration des composants de session.Fournir une expérience non RA
Lorsque les composants de session ne sont pas disponibles, fournissez une expérience non RA. Par exemple, dans un scénario de navigation, si la navigation RA n'est pas possible, fournir une navigation 2D traditionnelle est très utile.Inviter l'utilisateur à changer d'appareil
Dans certains scénarios d'application, l'utilisateur peut utiliser un appareil qui ne prend pas en charge les fonctionnalités RA. Dans ce cas, vous pouvez inviter l'utilisateur à changer d'appareil pour une meilleure expérience.
Lorsque vous choisissez entre ces options, il est important de trouver un équilibre entre les besoins spécifiques de l'application et la base d'utilisateurs. Dans les applications RA, si certains appareils ne peuvent vraiment pas fournir de RA ou une solution alternative, il est toujours nécessaire de fournir un bon message d'information à l'utilisateur pour l'informer des limitations de l'appareil actuel.
Étapes suivantes
- Découvrir comment contrôler l'exécution d'une session
- Comprendre les sources de données d'image et la sélection en temps d'exécution
- De plus, vous pouvez consulter les exemples suivants pour comprendre les cas d'utilisation après l'obtention du rapport :
- L'exemple Workflow_ARSession utilise l'événement StateChanged et fournit une indication UI pour l'état Broken, tout en utilisant l'événement AssembleUpdate pour afficher la disponibilité de chaque composant dans l'UI
- L'exemple SpatialMap_Sparse_AllInOne utilise l'événement AssembleUpdate pour évaluer à l'avance la prise en charge de l'appareil et afficher une notification en cas d'indisponibilité
- L'exemple MotionTracking_DeviceMotionAndPlaneDetection utilise l'événement StateChanged et fournit une indication UI pour l'état Broken
- L'exemple MegaBlock_Basic utilise l'événement StateChanged et fournit une indication UI pour l'état Broken