Verifica della disponibilità della sessione e supporto del dispositivo
Prima di avviare AR, è solitamente necessario verificare se la sessione è disponibile e se il dispositivo corrente supporta le funzionalità AR richieste. Questo articolo spiega come eseguire questi controlli.
Prima di iniziare
- Comprendere i concetti di base, i componenti e il flusso di lavoro della sessione attraverso Introduzione a ARSession
- Comprendere le basi del supporto del dispositivo e dei report di sessione in Unity attraverso Supporto del dispositivo e report
- Comprendere come creare una sessione
Ottenere il report durante il flusso di avvio
Se la sessione viene avviata immediatamente dopo l'assemblaggio, è possibile ottenere il report della sessione tramite l'evento StateChanged.
È necessario sottoscrivere l'evento StateChanged prima dell'avvio della sessione. La sottoscrizione in Awake() è solitamente sicura:
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
Gli stati della sessione su cui concentrarsi nell'handler dell'evento includono: Ready e Broken. Lo stato Ready indica che la sessione è stata avviata con successo, il che significa che la sessione è disponibile sul dispositivo corrente. Lo stato Broken indica che l'avvio della sessione è fallito, il che significa che la sessione non è disponibile sul dispositivo corrente.
Lo stato Broken non si verifica sempre quando il dispositivo non è supportato. Pertanto, è necessario utilizzare SessionReport.BrokenReason per ottenere la ragione specifica del fallimento.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// la sessione è disponibile sul dispositivo corrente
}
else if (status == ARSession.SessionState.Broken)
{
// la sessione non è disponibile sul dispositivo corrente
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// i componenti selezionati non sono supportati dal dispositivo corrente
}
else
{
// ragioni indipendenti dal dispositivo
}
}
}
Le ragioni SessionReport.SessionBrokenReason.NoAvailabileFrameSource e SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indicano che i componenti della sessione non sono disponibili sul dispositivo corrente; altre ragioni sono solitamente indipendenti dal dispositivo. Tecnicamente, queste due ragioni significano che la funzionalità AR con questa configurazione (e solo questa) non può funzionare su questo dispositivo. La configurazione si riferisce alle funzionalità e impostazioni selezionate nell'oggetto sessione. È possibile ottenere un report dettagliato della disponibilità da Report.
Nel caso di SessionReport.SessionBrokenReason.NoAvailabileFrameSource, la sessione potrebbe riprendersi automaticamente se durante l'avvio, durante l'aggiornamento online della lista dei dispositivi, viene rilevato che il dispositivo è ora supportato.
Ottenere il report prima dell'avvio
Se si desidera determinare prima di avviare la sessione e decidere se avviare la sessione in base alla situazione specifica, è possibile chiamare manualmente Assemble() e utilizzare l'evento AssembleUpdate per ottenere il report sulla disponibilità dei componenti.
È necessario sottoscrivere l'evento AssembleUpdate prima di assemblare la sessione,
Session.AssembleUpdate += OnAssembleUpdate;
Nella prima fase dell'assemblaggio, è ancora possibile utilizzare ARSession.SessionState e Report per determinare il supporto della sessione. Tuttavia, i report della seconda fase non verranno aggiornati nella sessione.
Pertanto, quando si chiama manualmente Assemble(), è necessario gestire il report sulla disponibilità dei componenti nell'evento AssembleUpdate per determinare se la sessione è disponibile sul dispositivo corrente.
È importante concentrarsi sulla disponibilità dei componenti nella lista SessionReport.AvailabilityReport.FrameSources. Se almeno un componente frame source è disponibile, allora SessionReport.AvailabilityReport.FrameSources è disponibile sul dispositivo corrente.
Allo stesso tempo, è necessario controllare la disponibilità dei componenti nella lista SessionReport.AvailabilityReport.FrameFilters. Tuttavia, lo standard di valutazione varia in base alle opzioni di assemblaggio, richiedendo che tutti i frame filter siano disponibili o che sia disponibile un numero qualsiasi di frame filter. Con le opzioni predefinite, tutti i frame filter devono essere disponibili.
Nella configurazione predefinita, è possibile utilizzare il seguente codice per determinare se i componenti della sessione sono disponibili sul dispositivo corrente:
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;
// i componenti della sessione sono disponibili sul dispositivo corrente, è possibile avviare la sessione
Session.StartSession();
}
else
{
// i componenti della sessione non sono disponibili sul dispositivo corrente
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
Notare che l'evento AssembleUpdate potrebbe essere attivato due volte. Nell'esempio di codice sopra, l'iscrizione all'evento viene annullata dopo aver confermato che i componenti sono disponibili.
Questo metodo di valutazione non può rilevare altri errori che potrebbero verificarsi durante l'avvio della sessione, ma questi errori sono solitamente indipendenti dal dispositivo. Se necessario, è possibile integrare la valutazione tramite l'evento StateChanged dopo aver avviato la sessione.
Opzioni quando i componenti della sessione non sono disponibili
Nello sviluppo di applicazioni, generalmente si desidera fornire supporto di compatibilità per il maggior numero possibile di dispositivi. Pertanto, quando i componenti della sessione non sono disponibili sul dispositivo corrente, è possibile considerare le seguenti opzioni:
Utilizzare altre funzionalità AR di livello inferiore
Modificando la configurazione dei componenti della sessione per selezionare funzionalità AR supportate dal dispositivo corrente. Fare riferimento a Creare una sessione per informazioni su come modificare la configurazione dei componenti della sessione.Fornire un'esperienza non AR
Fornire un'esperienza non AR quando i componenti della sessione non sono disponibili. Ad esempio, in uno scenario di navigazione, se la navigazione AR non è possibile, fornire una navigazione 2D tradizionale è molto utile.Suggerire all'utente di cambiare dispositivo
In alcuni scenari applicativi, gli utenti potrebbero utilizzare dispositivi che non supportano le funzionalità AR. In questo caso, è possibile suggerire all'utente di cambiare dispositivo per ottenere un'esperienza migliore.
Quando si scelgono queste soluzioni, è possibile bilanciarle in base alle esigenze specifiche dell'applicazione e alla base utente. Nelle applicazioni AR, se alcuni dispositivi non possono effettivamente fornire soluzioni AR o di livello inferiore, è comunque necessario fornire un buon messaggio di notifica all'utente, in modo che possa comprendere le limitazioni del dispositivo corrente.
Passaggi successivi
- Scopri i metodi per Controllare l'esecuzione della sessione
- Scopri Le sorgenti dei dati del frame e la selezione in tempo di esecuzione
- Inoltre, puoi comprendere gli scenari applicativi dopo aver ottenuto il report attraverso i seguenti esempi:
- L'esempio Workflow_ARSession utilizza l'evento StateChanged e fornisce una UI per lo stato Broken, mostrando anche la disponibilità di ciascun componente nell'UI tramite l'evento AssembleUpdate
- L'esempio SpatialMap_Sparse_AllInOne utilizza l'evento AssembleUpdate per valutare in anticipo il supporto del dispositivo e fornire una notifica di indisponibilità
- L'esempio MotionTracking_DeviceMotionAndPlaneDetection utilizza l'evento StateChanged e fornisce una UI per lo stato Broken
- L'esempio MegaBlock_Basic utilizza l'evento StateChanged e fornisce una UI per lo stato Broken