Table of Contents

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

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