Verificare la disponibilità della session e il supporto del dispositivo
Prima di avviare l'AR, di solito bisogna prima verificare se la session è disponibile e se il dispositivo corrente supporta le funzioni AR necessarie. Questo articolo spiega come eseguire questi controlli.
Prima di iniziare
- Consulta Introduzione ad ARSession per capire i concetti di base, la composizione e il flusso di lavoro di una session.
- Consulta Supporto del dispositivo e report per capire le basi del supporto dei dispositivi e dei report della session in Unity.
- Impara come creare una session.
Ottenere il report durante il flusso di avvio
Se la session viene avviata direttamente dopo l'assemble, puoi ottenere il report della session tramite l'evento StateChanged.
Bisogna iscriversi all'evento StateChanged prima di avviare la session; di solito è sicuro farlo in Awake():
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
Gli stati della session da monitorare nel gestore dell'evento sono Ready e Broken. Lo stato Ready indica che la session è stata avviata correttamente, quindi che è disponibile sul dispositivo corrente. Lo stato Broken indica che l'avvio è fallito, quindi che la session non è disponibile sul dispositivo corrente.
Lo stato Broken non compare sempre quando il dispositivo non è supportato. Per questo serve anche SessionReport.BrokenReason per ottenere la causa esatta del fallimento.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// session disponibile sul dispositivo corrente
}
else if (status == ARSession.SessionState.Broken)
{
// session non disponibile sul dispositivo corrente
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// il componente scelto non è supportato dal dispositivo corrente
}
else
{
// causa non legata al dispositivo
}
}
}
Le cause SessionReport.SessionBrokenReason.NoAvailabileFrameSource e SessionReport.SessionBrokenReason.FrameFilterNotAvailabile indicano che i componenti della session non sono disponibili sul dispositivo corrente; le altre cause sono in genere indipendenti dal dispositivo. In senso stretto, queste due cause significano che la configurazione attuale, e solo quella configurazione, non può eseguire le funzioni AR su quel dispositivo. La configurazione si riferisce alle funzioni e alle impostazioni scelte nell'oggetto session. Puoi ottenere un report di disponibilità dettagliato da Report.
Nel caso di SessionReport.SessionBrokenReason.NoAvailabileFrameSource, se durante l'avvio della session un aggiornamento online dell'elenco dei dispositivi rileva che il dispositivo è già supportato, la session può riprendersi automaticamente.
Ottenere il report prima dell'avvio
Se vuoi decidere prima che la session parta e stabilire se avviarla o no a seconda del caso, puoi chiamare manualmente Assemble() e usare l'evento AssembleUpdate per ottenere il report di disponibilità dei componenti.
Bisogna iscriversi all'evento AssembleUpdate prima dell'assemble della session.
Session.AssembleUpdate += OnAssembleUpdate;
Nella prima fase dell'assemble puoi ancora usare ARSession.SessionState e Report per valutare se la session è supportata. Ma il report della seconda fase non viene aggiornato nella session.
Perciò, quando si chiama manualmente Assemble(), di solito bisogna gestire il report di disponibilità nell'evento AssembleUpdate per capire se la session è disponibile sul dispositivo corrente.
Bisogna prestare particolare attenzione alla disponibilità dei componenti nella lista SessionReport.AvailabilityReport.FrameSources. Se almeno un componente frame source è disponibile, la parte SessionReport.AvailabilityReport.FrameSources è disponibile sul dispositivo corrente.
Bisogna anche osservare la disponibilità dei componenti nella lista SessionReport.AvailabilityReport.FrameFilters. Il criterio però dipende dalle opzioni di assemble: può essere richiesto che tutte le frame filter siano disponibili, oppure solo una parte di esse. Con le opzioni predefinite, tutte le frame filter devono essere disponibili.
Con la configurazione predefinita, puoi usare il seguente codice per verificare se i componenti della session 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 session sono disponibili sul dispositivo corrente, si può avviare la session
Session.StartSession();
}
else
{
// i componenti della session non sono disponibili sul dispositivo corrente
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
Nota che l'evento AssembleUpdate può essere attivato due volte. Nell'esempio sopra, l'evento viene annullato dopo aver confermato che i componenti sono disponibili.
Questo metodo non può rilevare altri errori possibili durante l'avvio della session, ma tali errori sono di solito indipendenti dal dispositivo. Se serve, puoi integrare il controllo dopo l'avvio usando l'evento StateChanged.
Cosa fare quando i componenti della session non sono disponibili
Nello sviluppo di applicazioni, di solito si vuole supportare il maggior numero possibile di dispositivi. Quando i componenti della session non sono disponibili sul dispositivo corrente, puoi valutare queste opzioni:
Passare ad altre funzioni AR
Modificando la configurazione dei componenti della session, scegli le funzioni AR supportate dal dispositivo corrente. Consulta creare una session per vedere come modificare la configurazione.Offrire un'esperienza non AR
Quando i componenti della session non sono disponibili, offri un'esperienza senza AR. Per esempio, in uno scenario di navigazione, se la navigazione AR non è possibile, una navigazione 2D tradizionale è molto utile.Invitare l'utente a cambiare dispositivo
In alcuni scenari, l'utente può usare un dispositivo che non supporta le funzioni AR. In quel caso, puoi suggerire di cambiare dispositivo per ottenere una migliore esperienza.
Quando scegli queste opzioni, puoi valutarle in base ai requisiti dell'app e al pubblico di riferimento. In un'app AR, se alcuni dispositivi non possono davvero offrire AR o una soluzione degradante, è comunque importante mostrare un buon messaggio all'utente per fargli capire i limiti del dispositivo.
Passi successivi
- Impara come controllare l'esecuzione della session
- Impara sorgente frame e selezione runtime
- Puoi anche consultare questi esempi per vedere i casi d'uso dopo aver ottenuto il report:
- esempio Workflow_ARSession usa l'evento StateChanged e mostra una UI per lo stato Broken, oltre a usare AssembleUpdate per mostrare nella UI la disponibilità di ogni componente
- L'esempio SpatialMap_Sparse_AllInOne usa l'evento AssembleUpdate per controllare in anticipo il supporto del dispositivo e mostrare un avviso se non è disponibile
- L'esempio MotionTracking_DeviceMotionAndPlaneDetection usa l'evento StateChanged e mostra una UI per lo stato Broken
- L'esempio MegaBlock_Basic usa l'evento StateChanged e mostra una UI per lo stato Broken