Zustandsvisualisierer — MRTK3

Eine Grafik, die das State Visualizer-Skript im Unity Inspector-Fenster zeigt.

StateVisualizer ist eine entwicklerfreundliche Low-Code-Schnittstelle zum Erstellen visueller Rückmeldungen als Reaktion auf Interaktionszustände. Sie ermöglicht sowohl komplexe animationsbasierte Effekte als auch gängige vorgefertigte Effekte.

Philosophie

In MRTK3 setzen wir die Trennung von Zustand und visuellem Element durch. Interaktionsfähige Objekte sind für ihre Interaktionslogik und ihren Zustand verantwortlich, sie sind aber nicht dafür ausgelegt, auf der Grundlage ihres Zustands ihre eigenen visuellen Elemente oder Effekte zu rendern. Die Motivation für diese Trennung besteht darin, dass Zustands- und Interaktionslogik in mehreren visuellen Kontexten wiederverwendet werden kann und dass das visuelle Feedback und die Ausstattung einer Interaktion angepasst werden können, ohne mit dem zugrunde liegenden Zustand oder der Interaktion in Berührung zu kommen. Darüber hinaus kann das Vermischen von Zustand und Visualisierung zu kaum verwaltbarem Code mit komplexen, schwer verständlichen Beziehungen zwischen visuellen Effekten und den Interaktionen führen, für die sie stehen.

StateVisualizer ist daher weitgehend statusfrei. Es lauscht einem zugeordneten StatefulInteractable und führt einen Graph von IEffects aus, basierend auf dem aktuellen Interaktionszustand. Ein komplexer Zustand wie Selectedness und passive/aktive Draufzeige-Absicht wird für die Verwendung in StateVisualizer verfügbar gemacht. Einige Effekte können auf den Bruchauswahlwert reagieren, um ansprechende „analoge“ Effekte zu steuern, die auf die Bewegung, das Zusammenführen oder das Drücken des Benutzers reagieren.

StateVisualizer basiert teilweise auf der Unity Playables-API.

Verwendung

Fügen Sie StateVisualizer zusammen mit einem Animator Ihren interaktionsfähigen Objekten hinzu. Wählen Sie einen Zustand aus, und fügen Sie Ihre gewünschten Effekte hinzu. Stellen Sie sicher, dass die Interactable Eigenschaft festgelegt wird, wenn der StateVisualizer Ihr interaktionsfähiges Objekt zur Laufzeit nicht finden kann.

Wichtig

Sie benötigen keinen Animatorcontroller für den Animator, außer beim Erstellen von Effekten. StateVisualizer steuert den Animator direkt über die Playables-API. StateVisualizer meidet AnimatorController für eine bessere Leistung und Wartungsfreundlichkeit.

Hinzufügen eines Effekts

Erstellen von Animationen mit StateVisualizer

StateVisualizer verwendet keinen AnimatorController, wodurch Animationen zum Bearbeitungszeitpunkt standardmäßig keine Vorschau anzeigen. Sie können dies beheben, indem Sie einen vorübergehenden AnimatorController erstellen, der die relevanten Animationen enthält, an denen Sie arbeiten, und im Animator auf ihn verweisen. Denken Sie jedoch daran, dass sie zur Laufzeit nicht erforderlich sind und möglicherweise unerwünschten Einfluss auf die Leistung haben, wenn sie nicht entfernt werden.

MRTK wird mit einem Beispiel für „AuthoringControllers“ geliefert, die wir verwenden, um unsere Animationseffekte für unsere Komponenten zu erstellen. Sie dürfen unser Beispiel gern für Ihre eigenen Zwecke kopieren.

Leistung

StateVisualizer wurde für optimale Leistung gebaut, trotz der Verwendung von Animatoren und Unity-Animationen, die in anderen Kontexten in großem Maßstab kostspielig sein können. Zum Lösen dieser Probleme führt StateVisualizer ein intelligentes Culling (Ausschluss nicht sichtbarer Flächen) des Animators durch und minimiert die Ausführungszeit des Animators. Darüber hinaus weist die Playables-API deutlich bessere Leistung als AnimatorController-Zustandscomputer auf. Das Fehlen von AnimatorControllers trägt erheblich sowohl zur Einfachheit des StateVisualizer-Systems als auch zu seiner Leistung im großen Maßstab bei.

Aktuell fragt der StateVisualizer den Zustand von interaktionsfähigen Objekten ab, statt auf Ereignislistener zu vertrauen, um dann nur bei Bedarf zu reagieren. Dieser Teil von StateVisualizer befindet sich in der aktiven Entwicklung wird möglicherweise für eine noch bessere Leistung auf Ereignislistener umgestellt.

Effekte

Auswirkung Beschreibung
AnimationEffect

AnimationEffect-Inspektoransicht
Im OneShot-Modus wird eine einzelne Animation vorwärts wiedergegeben, wenn der Zustand aktiviert wird, und dieselbe Animation rückwärts, wenn der Zustand deaktiviert wird. Im PlaybackTimeMatchesValue-Modus wird die Wiedergabezeit der Animation direkt durch den Bruchwert des Zustands gesteuert (z. B. „Selectedness“ für den „Select“-Zustand).
TwoWayAnimationEffect

TwoWayAnimationEffect-Inspektoransicht
Ähnlich wie der OneShot-Modus von AnimationEffect, verwendet jedoch zwei getrennte Animationen, eine für jede „Richtung“.
GraphicTintEffect

GraphicTintEffect-Inspektoransicht
Färbt eine Liste von Graphic-Komponenten in einer bestimmten Farbe ein. Dieser Effekt bietet die gleichen PlaybackMode-Optionen wie AnimationEffect, mit ähnlichen Ergebnissen (OneShot führt einen vollständigen Übergang zur Zustandsänderung aus; PlaybackTimeMatchesValue entspricht dem Übergangsfortschritt zum Bruchwert des Zustands.)

  • Überschreiben färbt die Ziele in der spezifischen Farbe selbst ein.
  • Additiv vermischt die Farbe additiv mit der vorhandenen Farbe.
  • Multiplizieren multipliziert die neue Farbe mit der vorhandenen Farbe.

    Diese Verschmelzungsvorgänge werden auch auf alle anderen Farben oder Animationen angewendet, die aktuell auf dem StateVisualizer-Graph ausgeführt werden. Beachten Sie, dass bei unterschiedlichen Ausgangsfarben der einfärbbaren Objekte der Farbeffekt möglicherweise nicht ordnungsgemäß verschmolzen wird. Verwenden Sie separate Färbeeffekte für Elemente mit unterschiedlichen Ausgangsfarben.
  • SpriteTintEffect

    SpriteTintEffect-Inspektoransicht
    Führt genau den gleichen Vorgang wie GraphicTintEffect für SpriteRenderers aus.
    SpriteSwapEffect

    SpriteSwapEffect-Inspektoransicht
    Legt das Ziel-Image entweder auf den ActiveSprite oder InactiveSprite fest, abhängig davon, ob der Zustand derzeit aktiv oder inaktiv ist. Nützlich beim Umschalten!
    SetTargetsActiveEffect

    SetTargetsActiveEffect-Inspektoransicht
    Aktiviert oder deaktiviert die Liste der GameObjects abhängig davon, ob der Zustand aktiv oder inaktiv ist. Invert bewirkt das gegenteilige Verhalten.
    PlayableAssetEffect

    PlayableAssetEffect-Inspektoransicht
    StateVisualAsset ist ein SkriptableObject, das ein wiederverwendbares Playable-Objekt enthält. Dieser Effekt verbindet dieses Playable-Objekt mit dem StateVisualizer-Graph. (Dieses Feature ist noch experimentell und unterliegt Änderungen.)

    Benutzerdefinierte Effekte

    Die meisten Effekte, die nicht zu einem der oben behandelten maßgeschneiderten Effekttypen gehören, können in der Regel als AnimationEffect erstellt werden. Wenn Sie jedoch einen neuen maßgeschneiderten, nicht animationsbasierten Effekt schaffen möchten, können Sie die IEffect-Schnittstelle oder Unterklasse auf einen unserer vorhandenen Effekte anwenden. Mehr dazu erfahren Sie in der IEffect-API-Referenz.

    Benutzerdefinierte Zustände

    StateVisualizer soll planmäßig in Zukunft benutzerdefinierte Zustände unterstützen. Halten Sie sich auf dem Laufenden.