Unity durchsuchen

Fünf Tipps für ordentliche und übersichtliche Animator-Controller

Last updated: December 2018

What you will get from this page: Will Armstrong’s five awesome tips for animator controllers. You’ll get tips for building animator controllers for your characters like you would a script: so they’re efficient to reuse, extend, support and debug, all the way through the development cycle.
All of the screenshots are from animation for the character Henry in Firewatch.

Verbergen Sie Komplexität in Blend Trees

In Blend Trees lässt sich Komplexität gut verbergen. Ein Blend Tree hat keinen Zustand; er ruft keinen Code auf. Er stellt einfach Verbindungen zwischen verschiedenen Clips her, basierend auf den von Ihnen definierten Parametern.

Der wichtige Punkt dabei ist, dass Sie auf Blend Trees iterieren können, ohne Auswirkungen auf den Rest Ihres Spiels befürchten zu müssen. Sie können ein komplexes Netz aus Zuständen verbergen und zukünftige Bugs vermeiden, da Sie die meisten Animationen in einem Blend Tree nicht mit Verhalten verknüpfen können.

unity-tidy-animators-locomotion-blend-tree

Es sieht kompliziert aus, aber dieser Bewegungs-Blend-Tree hat dafür gesorgt, die Dinge einfach zu halten.

Wenn Sie "Layer" denken, denken Sie "eine Script-Klasse"

Zum besseren Verständnis hilft es, sich Layer in etwa wie eine Klasse in einem Script vorzustellen. Sie möchten, dass alles in einem Layer sowohl der gleichen logischen Funktion als auch der gleichen Verhaltensfunktion dient. Das liegt daran, dass jedes Layer die ihm untergeordneten Layer kontrolliert. Dabei kommt es nicht darauf an, ob es bestimmte Knochen beeinflusst, dieses Layer additiv ist und so weiter.

unity-tidy-animators-states

Alle Zustände für Henrys linke Hand. Jeder Layer hat einen Zweck und eine klare Hierarchie. Das erleichtert die Kontrolle und das Finden eines Zustands.

Nutzen Sie Muster

Wiederverwendbare logische Strukturen in State- und Sub-State-Machines beschleunigen die Entwicklung, ermöglichen mehreren Personen, ähnliche Inhalte zu erstellen, erleichtern das Debugging und können außerdem Bugs insgesamt reduzieren.

Einige Muster zur Strukturierung Ihrer Layer:

  • Hub and Spoke: Diese Struktur vereinfacht das Debugging, da Sie klar erkennen können, wie die Veränderungen den Empty-State verlassen und zurückkehren. Jede "Speiche" (Spoke) des Zentralknotens sollte jeden Zustand zurücksetzen, den sie berührt. Spokes eignen sich mit den Mustern unten gut als Sub-State-Machines.

    unity-tidy-animators-hub-and-spoke

    Eine Hub-and-Spoke-Struktur für die Animation von Henrys rechtem Arm.

  • Die "Shared Entering/Shared Exiting"-Struktur: Indem Sie Zustände in einer Struktur mit "Intro" - "Ausführung / Loop" - "Outro" gruppieren, können Sie die Zustände "Intro" und "Outro" mit jedem Animationsevent oder State-Machine-Behaviors sauber verbinden. Wie in einem Blend Tree können Sie dann die inneren "Ausführung / Loop"-Zustände iterieren und ändern, ohne negative Auswirkungen auf Ihr Spiel befürchten zu müssen.

    unity-tidy-animators-entry-to-exit

    "Entry" zu "Exit": Alle Zustände für Henrys rechte Hand zum Halten eines Buchs; weitere Substates mit verborgenen Details.

  • Die "Critical Section and Settle"-Struktur: Teilen Sie Ihren Clip für unterbrechbare Animationen, insbesondere für durch Spielereingaben auszulösende Animationen, in zwei Teile. Der erste Teil ist dabei die "Critical Section" mit allen Zustandsänderungen, Effekten, Schaden usw., der immer vollständig ablaufen muss. Der zweite Teil ist die "Settle"-Animation, die in den Idle-Zustand zurückführt und durch eine neue Eingabe unterbrochen werden kann.

    unity-tidy-animators-critical-section-and-settle

    Sobald Ihre Animationen funktionieren und so aussehen, wie Sie es möchten, müssen Sie den Zustand Ihrer Animatoren in den Zustand Ihres Spiels zurückführen. Hier sind einige Punkte, die Sie dabei beachten sollten.

Schreiben Sie keinen komplexen Code in State-Machine-Behaviors

State-Machine-Behaviors sind Codeschnipsel, die Sie an jeden Animationszustand anfügen können. Man nutzt sie, um Verhalten direkt mit dem Zustand des Animators zu verbinden.

Vermeiden Sie es, komplexen Gameplay-Code in State-Machine-Behaviors zu schreiben – das macht es oft schwierig nachzuverfolgen, woher Ihre Zustandsänderungen kommen. Wenn Sie State-Machine-Behavior zum Ansteuern von Gameplay-Code verwenden, nutzen Sie ein Messaging-System, verwenden Sie eine Managerklasse oder lösen Sie Ihren Code mit Parametern auf einem höheren Level aus.

Und schließlich mein bevorzugtes State-Machine-Behavior: Debug.Break();. Debug.Break(); ist unglaublich nützlich; Sie können es überall in Ihrem Animations-Setup anfügen und Sie haben einen Breakpoint, ähnlich wie bei einem visuellen Scripting-System.

Scheuen Sie sich nicht, nach Möglichkeit C#-Code zu verwenden. Anstatt Hunderte oder Tausende von Übergängen zu haben oder überall AnyState-Übergänge zu verbinden, können Sie Animator.Play oder Animator.CrossFade verwenden, um dynamisch direkte Übergänge aus dem Code herbeizuführen. Wenn Ihnen dieses Maß an Kontrolle noch nicht reicht, können Sie sich auch mit unserer Playables-API befassen, um noch mehr Möglichkeiten für die Animation unter Verwendung von Code zu entdecken. Beispiele finden Sie unter https://docs.unity3d.com/Manual/Playables-Examples.html.

Stellen Sie mit State-Machine-Behavior sicher, dass ein Animations-Event zuverlässig auslöst

Animations-Events verbinden einen bestimmten Moment Ihres Animationsclips mit einer bestimmten Zustandsveränderung in Ihrem Spiel; man kann sie nutzen, um beispielsweise visuelle Effekte oder Soundeffekte auszulösen. Wenn Sie aber einen Clip verlassen, bevor das Event in Gang gesetzt wird, findet es nie statt. Eine mögliche Gegenmaßnahme ist, ein State-Machine-Behavior hinzuzufügen, das das Auslösen des Events sicherstellt, sobald ein bestimmter Zeitpunkt erreicht ist – unabhängig davon, was im Spiel außerdem passiert oder nicht passiert.

unity-tidy-animators-state-machine

Weitere Ressourcen

Wir wollen es wissen! Haben Ihnen diese Inhalte gefallen?

Ja, weiter so. Na ja. Könnte besser sein.