Behandeln von Ausnahmebedingungen
In den meisten Fällen kann WLT Tracking-Fehler selbstständig erkennen und beheben, ohne dass die Anwendung eingreifen muss.
Einige Ausnahmebedingungen führen jedoch zu Fehlern, bei denen sich die Anwendung möglicherweise anpassen muss.
Ein Tracking-Verlust ist ein Beispiel für einen solchen Zustand.
Das Tracking kann jederzeit und aus den verschiedensten Gründen unterbrochen werden. Möglicherweise sind die Sensoren verdeckt, die Beleuchtung ist unzureichend oder es gibt keine sichtbaren Merkmale in der Umgebung der Kamera, die erfasst werden können.
Eine ausführlichere Erörterung dieser Ausnahmebedingungen auf konzeptioneller Ebene, einschließlich der WLT-Feature zu deren Entschärfung, finden Sie an anderer Stelle in dieser Dokumentation.
Im Folgenden wird erläutert, wie der Anwendungsentwickler (optional) die Vorteile dieser Features nutzen kann, um das Verhalten der Anwendung bei Auftreten dieser Ausnahmebedingungen anzupassen.
AttachmentPoints
Wie hier ausführlicher dargelegt, repräsentiert ein Anfügepunkt einen Vertrag zwischen dem WLT und der Anwendung, der eine Benachrichtigung über das Auftreten außergewöhnlicher Bedingungen zusammen mit geeigneten Daten vorsieht, die die Anwendung zur Reaktion auf diese Bedingungen nutzen kann.
Adjuster-Komponenten
Eine Möglichkeit zur Umsetzung solcher Anwendungsmaßnahmen bieten die Adjuster-Komponenten. Die wichtigste dieser Komponenten AdjusterFixed.
„AdjusterFixed“ kann zwar unverändert eingesetzt werden, aber das Verständnis seiner Funktionsweise kann sehr aufschlussreich sein, insbesondere für Entwickler, die das Verhalten der Komponente weiter anpassen möchten.
Es ist wichtig zu wissen, dass die Adjuster-Komponenten zwei Funktionen erfüllen:
- Sie verwalten den zugrunde liegenden Anfügepunkt (AttachmentPoint).
- Sie stellen Implementierungen für die Reaktion der Anwendung auf Ausnahmebedingungen bereit.
AttachmentPoint-Verwaltung
Die Untersuchung der Start()
- und OnDestroy()
-Member macht den größten Teil der erforderlichen AttachmentPoint -Verwaltung aus.
Bei Start()
wird der zugrunde liegende AttachmentPoint erstellt, wobei die Memberfunktionen von AdjusterFixed als Rückrufe übergeben werden (siehe unten).
In OnDestroy()
werden diese Rückrufverbindungen getrennt und der AttachmentPoint freigegeben.
Rückrufe zum Behandeln von Ausnahmebedingungen
Die beiden Rückrufe implementieren das von der Anwendung angeforderte Verhalten bei Auftreten von Ausnahmebedingungen.
Behandeln des Tracking-Status
In HandleStateAdjust()
deaktiviert die AdjusterFixed-Komponente in einem Fragment enthaltene Objekte, die zurzeit nicht verfolgt werden.
protected virtual void HandleAdjustState(AttachmentPointStateType state)
{
bool visible = state == AttachmentPointStateType.Normal;
if (visible != gameObject.activeSelf)
{
gameObject.SetActive(visible);
}
}
Wenngleich dieses einfache Verhalten für viele Anwendungen perfekt geeignet ist, sind Fälle denkbar, in denen dieses Verhalten nicht genügt.
- Das Objekt soll ausgeblendet, aber nicht deaktiviert werden (es soll weiterhin aktualisiert werden).
- Es soll eine andere Methode zum Ausblenden des Objekts gewählt werden (z. B. eine Verschiebung über die hintere Clippingebene hinaus).
- Anstatt das Objekt auszublenden, soll es mit einem anderen Material (z. B. Röntgenstrahlmaterial) gerendert werden.
- Anstatt das Objekt auszublenden, soll ein anderes Objekt gerendert werden.
- usw.
Glücklicherweise steht es dem Anwendungsentwickler frei, eine beliebige dieser Verhaltensweisen oder auch andere Verhaltensweisen zu implementieren. Ihrer Kreativität sind dabei keine Grenzen gesetzt.
Die einfachste Möglichkeit zur Festlegung eines benutzerdefinierten Verhaltens besteht darin, eine benutzerdefinierte Komponente zu implementieren, die von „AdjusterFixed“ abgeleitet ist. Die AttachmentPoint-Verwaltung kann dann vererbt und die Handler können überschrieben werden, um das benutzerdefinierte Verhalten zu erstellen.
Behandeln der Neupositionierung
Wie in der konzeptionellen Dokumentation beschrieben, kann das WLT-System entscheiden, dass ein Objekt am besten in seiner Position in der physischen Welt gehalten wird, indem es im Frozen Space neu positioniert wird. Die Anwendung wird mithilfe des AttachmentPoint-Mechanismus über diese Situation informiert.
Es steht der Anwendung natürlich frei, solche Anpassungen zu ignorieren. Das Verhalten der AdjusterFixed-Komponente (und der AdjusterMoving-Komponente) besteht jedoch darin, diese Transformation zur Neupositionierung sofort anzuwenden.
protected virtual void HandleAdjustLocation(Pose adjustment)
{
Pose pose = gameObject.transform.GetGlobalPose();
pose = adjustment.Multiply(pose);
gameObject.transform.SetGlobalPose(pose);
}
Das entspricht fast immer den Anforderungen der Anwendung. Man könnte sich also die Frage stellen, warum die AdjusterFixed-Funktion HandlePositionAdjust()
überhaupt überschrieben werden sollte.
Die Antwort lautet natürlich, dass die Anwendung neben der Positionskorrektur möglicherweise noch weitere Aktionen ausführen möchte. Ein temporärer Materialeffekt kann dazu beitragen, den Benutzer über durchgeführte Änderungen zu benachrichtigen. Die Neupositionierung kann sich über einige Sekunden hinziehen. Oder, wenn eine Neupositionierung zu einschneidend ist, könnte die Anwendung das Objekt lieber verwerfen, als es zu verschieben.
„AdjusterFixed“ und „AdjusterMoving“ im Vergleich
Ein genauerer Blick auf die Komponente AdjusterMoving zeigt, dass sie fast identisch mit der Komponente AdjusterFixed ist, von der sie abgeleitet ist.
Der Unterschied zwischen den beiden besteht darin, dass die AdjusterMoving-Komponente annimmt, dass ihr Ziel sich fortlaufend in der Umgebung bewegt. Daher informiert die Komponente das WLT-System bei jeder Aktualisierung über die neue Position.
Die Kosten für AdjusterMoving ergeben sich hauptsächlich aus der Hinzufügung einer Update()-Funktion und nicht aus der Arbeit, die innerhalb der Funktion geleistet wird. Bei einem überwiegend stationären Objekt, das nur selten per Skript bewegt wird, kann es jedoch von Vorteil sein, eine AdjusterFixed-Komponente zu verwenden und AdjusterFixed.UpdatePosition() nach jeder Bewegung des Objekts aufzurufen.
Anpassen des Verhaltens, aber nur auf Wunsch
Nochmal: Das Muster hier ist hoffentlich im gesamten World Locking Tools-System konsistent. WLT bietet ein einfaches, aber im Allgemeinen nützliches Baselineverhalten. Es wird davon ausgegangen, dass diese Implementierung eine der folgenden Aufgaben übernimmt:
- Erfüllung der Anforderungen Ihrer Anwendung
- Bereitstellung einer Baseline-Implementierung für die Erweiterung
- Bereitstellung einer Beispielimplementierung, auf deren Grundlage Sie kreativ werden können