Überprüfung der session-verfügbarkeit und geräteunterstützung
Vor dem Start von AR ist es in der Regel erforderlich, zu überprüfen, ob die session verfügbar ist und ob das aktuelle Gerät die erforderlichen AR-funktionen unterstützt. Dieser Artikel beschreibt, wie diese Überprüfungen durchgeführt werden.
Voraussetzungen
- Grundlegendes Verständnis der session-konzepte, Komponenten und Arbeitsabläufe durch Einführung in ARSession
- Grundkenntnisse über Geräteunterstützung und session-berichte in Unity durch Geräteunterstützung und Berichterstattung
- Wissen, wie man eine session erstellt
Berichte im startprozess abrufen
Wenn die session direkt nach der Zusammenstellung gestartet wird, kann der session-bericht über das StateChanged-ereignis abgerufen werden.
Das Abonnieren des StateChanged-ereignisses muss vor dem session-start erfolgen, normalerweise ist es sicher, dies in Awake() zu tun:
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
Die relevanten session-zustände im Ereignishandler sind: Ready und Broken. Der Zustand Ready zeigt an, dass die session erfolgreich gestartet wurde, was bedeutet, dass die session auf dem aktuellen Gerät verfügbar ist. Der Zustand Broken zeigt an, dass der session-start fehlgeschlagen ist, was bedeutet, dass die session auf dem aktuellen Gerät nicht verfügbar ist.
Der Zustand Broken tritt nicht immer auf, wenn das Gerät nicht unterstützt wird. Daher muss SessionReport.BrokenReason verwendet werden, um den genauen Fehlergrund zu ermitteln.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// session ist auf dem aktuellen Gerät verfügbar
}
else if (status == ARSession.SessionState.Broken)
{
// session ist auf dem aktuellen Gerät nicht verfügbar
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// Ausgewählte Komponenten werden vom aktuellen Gerät nicht unterstützt
}
else
{
// Geräteunabhängige Gründe
}
}
}
Die Gründe SessionReport.SessionBrokenReason.NoAvailabileFrameSource und SessionReport.SessionBrokenReason.FrameFilterNotAvailabile zeigen an, dass die session-komponenten auf dem aktuellen Gerät nicht verfügbar sind; Andere Gründe sind in der Regel geräteunabhängig. Streng genommen bedeuten diese beiden Gründe, dass die AR-funktionalität unter der aktuellen Konfiguration (und nur dieser) auf diesem Gerät nicht funktioniert. Die Konfiguration bezieht sich auf die im session-objekt ausgewählten Funktionen und Einstellungen. Detaillierte Verfügbarkeitsberichte können aus Report abgerufen werden.
Im Fall von SessionReport.SessionBrokenReason.NoAvailabileFrameSource kann sich die session möglicherweise automatisch erholen, wenn während des session-starts festgestellt wird, dass das Gerät während der Online-Aktualisierung der Geräteliste unterstützt wird.
Berichte vor dem start abrufen
Wenn eine Überprüfung vor dem session-start durchgeführt werden soll, um basierend auf den Ergebnissen zu entscheiden, ob die session gestartet wird, kann Assemble() manuell aufgerufen und das AssembleUpdate-ereignis verwendet werden, um Komponentenverfügbarkeitsberichte zu erhalten.
Das AssembleUpdate-ereignis muss vor dem session-zusammenbau abonniert werden:
Session.AssembleUpdate += OnAssembleUpdate;
In der ersten Phase der Zusammenstellung können ARSession.SessionState und Report weiterhin verwendet werden, um die Unterstützung der session zu überprüfen. Berichte der zweiten Phase werden jedoch nicht in der session aktualisiert.
Daher muss bei manuellem Aufruf von Assemble() der Komponentenverfügbarkeitsbericht im AssembleUpdate-ereignis verarbeitet werden, um festzustellen, ob die session auf dem aktuellen Gerät verfügbar ist.
Die Verfügbarkeit der Komponenten in der Liste SessionReport.AvailabilityReport.FrameSources ist besonders wichtig. Wenn eine der frame-source-komponenten verfügbar ist, ist der Teil SessionReport.AvailabilityReport.FrameSources auf dem aktuellen Gerät verfügbar.
Außerdem ist die Verfügbarkeit der Komponenten in der Liste SessionReport.AvailabilityReport.FrameFilters zu beachten. Die Bewertungskriterien variieren jedoch je nach Zusammenbauoptionen und erfordern entweder, dass alle frame-filter verfügbar sind, oder dass eine beliebige Anzahl von frame-filtern verfügbar ist. Standardmäßig müssen alle frame-filter verfügbar sein.
Unter der Standardkonfiguration kann der folgende Code verwendet werden, um festzustellen, ob die session-komponenten auf dem aktuellen Gerät verfügbar sind:
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;
// Session-komponenten sind auf dem aktuellen Gerät verfügbar, session kann gestartet werden
Session.StartSession();
}
else
{
// Session-komponenten sind auf dem aktuellen Gerät nicht verfügbar
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
Beachten Sie, dass das AssembleUpdate-ereignis möglicherweise zweimal ausgelöst wird. Im obigen Codebeispiel wird das Abonnement gekündigt, sobald die Komponentenverfügbarkeit bestätigt ist.
Diese Methode kann andere Fehler, die während des session-starts auftreten können, nicht erkennen, aber diese Fehler sind in der Regel geräteunabhängig. Bei Bedarf kann nach dem Start der session eine zusätzliche Überprüfung über das StateChanged-ereignis durchgeführt werden.
Optionen bei nicht verfügbaren session-komponenten
In der Anwendungsentwicklung ist es im Allgemeinen wünschenswert, möglichst viele Geräte zu unterstützen. Wenn die session-komponenten auf dem aktuellen Gerät nicht verfügbar sind, können folgende Optionen in Betracht gezogen werden:
Degradierte Nutzung anderer AR-funktionen
Ändern Sie die session-komponentenkonfiguration, um AR-funktionen auszuwählen, die vom aktuellen Gerät unterstützt werden. Unter session erstellen erfahren Sie, wie die session-komponentenkonfiguration geändert werden kann.Bereitstellung einer nicht-AR-erfahrung
Bieten Sie eine nicht-AR-erfahrung an, wenn die session-komponenten nicht verfügbar sind. Zum Beispiel ist in Navigationsszenarien die Bereitstellung einer traditionellen 2D-navigation sehr nützlich, wenn AR-navigation nicht möglich ist.Benutzer auffordern, das Gerät zu wechseln
In einigen Anwendungsszenarien verwenden Benutzer möglicherweise Geräte, die keine AR-funktionen unterstützen. In diesem Fall können Benutzer aufgefordert werden, das Gerät für ein besseres Erlebnis zu wechseln.
Bei der Auswahl dieser Optionen sollten die spezifischen Anforderungen der Anwendung und die Benutzergruppe abgewogen werden. In AR-anwendungen sollte eine gute Benutzerhinweismeldung bereitgestellt werden, wenn auf einigen Geräten keine AR- oder downgrade-lösung möglich ist, damit Benutzer die Einschränkungen des aktuellen Geräts verstehen.
Nächste schritte
- Erfahren Sie, wie Sie die session-ausführung steuern
- Erfahren Sie mehr über Bilddatenquellen und Laufzeitauswahl
- Zusätzlich können Sie sich anhand der folgenden Beispiele über Anwendungsszenarien nach dem Erhalt von Berichten informieren:
- Das Beispiel Workflow_ARSession verwendet das StateChanged-ereignis und bietet eine UI-meldung für den Zustand Broken, während es gleichzeitig das AssembleUpdate-ereignis verwendet, um die Verfügbarkeit jeder Komponente in der UI anzuzeigen
- Das Beispiel SpatialMap_Sparse_AllInOne verwendet das AssembleUpdate-ereignis zur Vorabprüfung der Geräteunterstützung und zur Anzeige von Nichtverfügbarkeitsmeldungen
- Das Beispiel MotionTracking_DeviceMotionAndPlaneDetection verwendet das StateChanged-ereignis und bietet eine UI-meldung für den Zustand Broken
- Das Beispiel MegaBlock_Basic verwendet das StateChanged-ereignis und bietet eine UI-meldung für den Zustand Broken