Vérifier la disponibilité de la session et la prise en charge de l'appareil
Avant de lancer l'AR, il faut généralement d'abord vérifier si la session est disponible et si l'appareil courant prend en charge les fonctions AR nécessaires. Cet article explique comment effectuer ces vérifications.
Avant de commencer
- Consultez Introduction à ARSession pour comprendre les concepts de base, la composition et le flux de travail d'une session.
- Consultez Prise en charge des appareils et rapports pour comprendre les bases de la prise en charge des appareils et des rapports de session dans Unity.
- Apprenez comment créer une session.
Obtenir le rapport pendant le démarrage
Si la session est lancée directement après l'assemble, vous pouvez obtenir le rapport de session via l'événement StateChanged.
Il faut s'abonner à l'événement StateChanged avant le démarrage de la session ; en général, s'abonner dans Awake() est une approche sûre :
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
Les états de session à surveiller dans le traitement de l'événement sont Ready et Broken. L'état Ready signifie que la session a démarré avec succès, donc qu'elle est disponible sur l'appareil courant. L'état Broken signifie que le démarrage a échoué, donc que la session n'est pas disponible sur l'appareil courant.
L'état Broken n'apparaît pas toujours lorsque l'appareil n'est pas pris en charge. Il faut donc aussi utiliser SessionReport.BrokenReason pour obtenir la raison précise de l'échec.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// session disponible sur l'appareil courant
}
else if (status == ARSession.SessionState.Broken)
{
// session indisponible sur l'appareil courant
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// le composant choisi n'est pas pris en charge par l'appareil courant
}
else
{
// raison indépendante de l'appareil
}
}
}
Les raisons SessionReport.SessionBrokenReason.NoAvailabileFrameSource et SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indiquent que les composants de la session ne sont pas disponibles sur l'appareil courant ; les autres raisons sont généralement indépendantes de l'appareil. En pratique, ces deux raisons signifient que la configuration actuelle, et seulement cette configuration, ne peut pas exécuter les fonctions AR sur cet appareil. La configuration désigne les fonctions et paramètres choisis dans l'objet session. Vous pouvez obtenir un rapport détaillé de disponibilité via Report.
Dans le cas de SessionReport.SessionBrokenReason.NoAvailabileFrameSource, si l'appareil est découvert comme pris en charge lors de la mise à jour en ligne de la liste des appareils au démarrage de la session, la session peut se rétablir automatiquement.
Obtenir le rapport avant le démarrage
Si vous souhaitez décider avant le démarrage de la session et lancer ou non la session selon le cas, vous pouvez appeler manuellement Assemble() et utiliser l'événement AssembleUpdate pour obtenir le rapport de disponibilité des composants.
Il faut s'abonner à l'événement AssembleUpdate avant l'assemble de la session.
Session.AssembleUpdate += OnAssembleUpdate;
Dans la première phase de l'assemble, on peut encore utiliser ARSession.SessionState et Report pour juger si la session est prise en charge. Mais le rapport de la deuxième phase n'est pas répercuté dans la session.
Ainsi, lorsqu'on appelle manuellement Assemble(), il faut généralement traiter le rapport de disponibilité dans l'événement AssembleUpdate afin de déterminer si la session est disponible sur l'appareil courant.
Il faut surtout surveiller la disponibilité des composants dans la liste SessionReport.AvailabilityReport.FrameSources. Si au moins un composant frame source est disponible, la partie SessionReport.AvailabilityReport.FrameSources est disponible sur l'appareil courant.
Il faut aussi surveiller la disponibilité des composants dans la liste SessionReport.AvailabilityReport.FrameFilters. Mais le critère varie selon les options d'assemble : toutes les frame filters peuvent être requises, ou seulement un certain nombre. Avec les options par défaut, toutes les frame filters doivent être disponibles.
Avec la configuration par défaut, on peut utiliser le code suivant pour vérifier si les composants de session sont disponibles sur l'appareil courant :
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 la session sont disponibles sur l'appareil courant, on peut démarrer la session
Session.StartSession();
}
else
{
// les composants de la session ne sont pas disponibles sur l'appareil courant
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
Attention, l'événement AssembleUpdate peut être déclenché deux fois. Dans l'exemple ci-dessus, on se désabonne après avoir confirmé que les composants sont disponibles.
Cette méthode ne permet pas de détecter d'autres erreurs possibles pendant le démarrage de la session, mais ces erreurs sont généralement indépendantes de l'appareil. Si nécessaire, vous pouvez compléter la vérification après le démarrage via l'événement StateChanged.
Que faire si les composants de la session ne sont pas disponibles
Dans le développement d'applications, on souhaite généralement prendre en charge le plus grand nombre possible d'appareils. Lorsque les composants de la session ne sont pas disponibles sur l'appareil courant, on peut envisager les options suivantes :
Dégrader vers d'autres fonctions AR
En modifiant la configuration des composants de la session, choisissez des fonctions AR prises en charge par l'appareil courant. Consultez créer une session pour savoir comment modifier la configuration.Fournir une expérience non AR
Lorsque les composants de la session ne sont pas disponibles, proposez une expérience sans AR. Par exemple, dans un scénario de navigation, si la navigation AR n'est pas possible, une navigation 2D classique est très utile.Inviter l'utilisateur à changer d'appareil
Dans certains cas, l'utilisateur peut utiliser un appareil qui ne prend pas en charge les fonctions AR. Vous pouvez alors lui demander de changer d'appareil pour une meilleure expérience.
Lorsque vous choisissez ces solutions, évaluez-les selon les besoins de l'application et le public visé. Dans une application AR, si certains appareils ne peuvent pas fournir l'AR ou une solution de repli, il faut malgré tout fournir un bon message à l'utilisateur pour expliquer les limites de l'appareil.
Étapes suivantes
- Apprenez comment contrôler l'exécution de la session
- Apprenez source de trames et sélection à l’exécution
- Vous pouvez aussi consulter ces exemples pour voir des cas d'utilisation après réception du rapport :
- exemple Workflow_ARSession utilise l'événement StateChanged et affiche une UI pour l'état Broken, tout en utilisant aussi AssembleUpdate pour afficher la disponibilité de chaque composant dans l'UI
- L'exemple SpatialMap_Sparse_AllInOne utilise l'événement AssembleUpdate pour vérifier à l'avance la prise en charge de l'appareil et afficher un avertissement si elle est indisponible
- L'exemple MotionTracking_DeviceMotionAndPlaneDetection utilise l'événement StateChanged et affiche une UI pour l'état Broken
- L'exemple MegaBlock_Basic utilise l'événement StateChanged et affiche une UI pour l'état Broken