Table of Contents

Determinación de disponibilidad de session y compatibilidad de dispositivos

Antes de iniciar AR, generalmente es necesario determinar si la session está disponible y si el dispositivo actual admite las funciones AR requeridas. Este artículo describe cómo realizar estas comprobaciones.

Antes de comenzar

Obtención del informe durante el flujo de inicio

Si se inicia la session inmediatamente después del ensamblaje, se puede obtener el informe de session a través del evento StateChanged.

Es necesario suscribirse al evento StateChanged antes de iniciar la session, y generalmente es seguro completar la suscripción en Awake():

void Awake()
{
    Session.StateChanged += HandleSessionStateChange;
}

Los estados de session que requieren atención en el manejo de eventos incluyen: Ready y Broken. El estado Ready indica que la session se ha iniciado correctamente, lo que también significa que la session está disponible en el dispositivo actual. El estado Broken indica que la session no se pudo iniciar, lo que significa que la session no está disponible en el dispositivo actual.

El estado Broken no siempre ocurre cuando el dispositivo no es compatible. Por lo tanto, también es necesario usar SessionReport.BrokenReason para obtener la razón específica del fallo.

void HandleSessionStateChange(ARSession.SessionState status)
{
    if (status == ARSession.SessionState.Ready)
    {
        // session está disponible en el dispositivo actual
    }
    else if (status == ARSession.SessionState.Broken)
    {
        // session no está disponible en el dispositivo actual
        if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
            Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
        {
            // los componentes seleccionados no son compatibles con el dispositivo actual
        }
        else
        {
            // razones no relacionadas con el dispositivo
        }
    }
}

Las razones SessionReport.SessionBrokenReason.NoAvailabileFrameSource y SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indican que los componentes de session no están disponibles en el dispositivo actual; otras razones generalmente no están relacionadas con el dispositivo. Estrictamente hablando, estas dos razones significan que la función AR bajo la configuración actual (y solo esta configuración) no puede ejecutarse en este dispositivo. La configuración se refiere a las funciones y configuraciones seleccionadas en el objeto session. Se puede obtener un informe detallado de disponibilidad desde Report.

En el caso de SessionReport.SessionBrokenReason.NoAvailabileFrameSource, si se descubre que el dispositivo es compatible durante la actualización de la lista de dispositivos al iniciar la session, es posible que la session se recupere automáticamente.

Obtención del informe antes del inicio

Si se desea determinar antes de iniciar la session y decidir si iniciarla según la situación específica, se puede llamar manualmente a Assemble() y usar el evento AssembleUpdate para obtener el informe de disponibilidad de componentes.

Es necesario suscribirse al evento AssembleUpdate antes de ensamblar la session:

Session.AssembleUpdate += OnAssembleUpdate;

En la primera fase de ensamblaje, aún se puede usar ARSession.SessionState y Report para determinar la compatibilidad de session. Pero el informe de la segunda fase no se actualizará en la session.

Por lo tanto, al llamar manualmente a Assemble(), generalmente es necesario procesar el informe de disponibilidad de componentes en el evento AssembleUpdate para determinar si la session está disponible en el dispositivo actual.

Es importante centrarse en la disponibilidad de los componentes en la lista SessionReport.AvailabilityReport.FrameSources. Si cualquiera de los componentes de frame source está disponible, entonces la parte SessionReport.AvailabilityReport.FrameSources está disponible en el dispositivo actual.

También es necesario prestar atención a la disponibilidad de los componentes en la lista SessionReport.AvailabilityReport.FrameFilters del informe. Sin embargo, los criterios de juicio varían según las opciones de ensamblaje, requiriendo que todos los frame filter estén disponibles o que cualquier número de frame filter esté disponible. En la opción predeterminada, se requiere que todos los frame filter estén disponibles.

En la configuración predeterminada, se puede usar el siguiente código para determinar si los componentes de session están disponibles en el dispositivo actual:

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;
        // los componentes de session están disponibles en el dispositivo actual, se puede iniciar la session
        Session.StartSession();
    }
    else
    {
        // los componentes de session no están disponibles en el dispositivo actual
    }
    if (report.PendingDeviceList.Count <= 0)
    {
        Session.AssembleUpdate -= OnAssembleUpdate;
    }
}

Tenga en cuenta que el evento AssembleUpdate puede activarse dos veces. En el ejemplo de código anterior, se cancela la suscripción al evento después de confirmar que los componentes están disponibles.

Este método de juicio no puede determinar otros errores que puedan ocurrir durante el inicio de session, pero estos errores generalmente no están relacionados con el dispositivo. Si es necesario, se puede realizar una verificación adicional después de iniciar la session a través del evento StateChanged.

Opciones cuando los componentes de session no están disponibles

En el desarrollo de aplicaciones, generalmente se desea brindar compatibilidad con la mayor cantidad de dispositivos posible. Por lo tanto, cuando los componentes de session no están disponibles en el dispositivo actual, se pueden considerar las siguientes opciones:

  • Degradar a otras funciones AR
    Modificando la configuración de componentes de session, seleccionando funciones AR compatibles con el dispositivo actual. Se puede consultar crear session para comprender cómo modificar la configuración de componentes de session.

  • Proporcionar una experiencia no AR
    Cuando los componentes de session no están disponibles, proporcionar una experiencia no AR. Por ejemplo, en escenarios de navegación, si la navegación AR no se puede implementar, proporcionar navegación 2D tradicional es muy útil.

  • Sugerir al usuario cambiar de dispositivo
    En algunos escenarios de aplicación, los usuarios pueden usar dispositivos que no admiten funciones AR. En este caso, se puede sugerir al usuario cambiar de dispositivo para obtener una mejor experiencia.

Al elegir estas soluciones, se puede sopesar según las necesidades específicas de la aplicación y el grupo de usuarios. En aplicaciones AR, si algunos dispositivos realmente no pueden proporcionar AR o soluciones degradadas, aún es necesario proporcionar un buen mensaje de información al usuario para que comprenda las limitaciones del dispositivo actual.

Pasos siguientes