Искать

5 советов: чистый код для контроллеров аниматоров

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.

Упрощайте сложную структуру с помощью смешивания

Смешивание — это отличный способ упростить сложную систему. Дерево смешивания не имеет состояний и не делает обратных вызовов к коду; оно просто смешивает различные клипы по заданным параметрам.

Важность такого подхода заключается в том, что вы можете проводить итерацию анимационных деревьев, не оказывая влияния на остальные компоненты игры. Так можно упростить сложную сеть состояний, предотвратить появление ошибок, поскольку привязать поведение к большинству анимаций в дереве невозможно.

unity-tidy-animators-locomotion-blend-tree

Выглядит сложно, но это дерево на самом деле позволяет держать все под контролем.

Говоря о слоях, думайте о скриптовых классах

Этот подход позволяет проводить приближенную аналогию между слоями и классами в скрипте. Слои нужны для объединения объектов с похожей логической или поведенческой функцией, поскольку каждый слой управляет тем, какой слой он перекрывает, какие скелеты он затрагивает, накладываются ли его эффекты на другие слои и так далее.

unity-tidy-animators-states

All of the states for Henry’s left hand. Each layer has a purpose and a clear hierarchy. It makes it easy to control and easy to find state.

Используйте шаблоны

Доступные для повторного использования логичные шаблоны в первичных и вторичных машинах состояний ускоряют разработку похожих объектов, облегчают поиск ошибок и могут уменьшить общее возможное количество ошибок.

Шаблоны, которые хороши для структурирования слоев:

  • Звездообразная модель: этот шаблон упрощает отладку, поскольку в этом случае видно, как переходы исходят из пустого состояния и возвращаются обратно. Каждый луч звезды должен сбрасывать состояние, к которому он приходит. Лучи хорошо подходят для создания вторичной машины состояния с использованием описанных ниже шаблонов.

    unity-tidy-animators-hub-and-spoke

    Звездообразная модель анимации правой руки Генри.

  • Шаблон общих входов и выходов: группируя состояния в шаблон «вход — выполнение/цикл — выход», входному и выходному состоянию можно легко назначить любое событие анимации или поведение машины состояний. Как и в случае с деревьями, промежуточные состояния выполнения или цикла можно изменить без риска нарушить работу игры.

    unity-tidy-animators-entry-to-exit

    От входа к выходу: все состояния правой руки Генри, удерживающей книгу; в подсостояниях находятся дополнительные детали.

  • Шаблон «критическая секция — покой»: клипы в прерываемой анимации, особенно такой, которая управляется игроком, следует разбивать на две части. Первая часть будет содержать все изменения состояния, эффекты, получение урона и так далее — они должны проигрываться до конца. Вторая часть будет содержать плавную анимацию перехода в состояние покоя, которую игрок будет прерывать.

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

    Когда анимация заработает и станет выглядеть так, как вам нужно, необходимо будет передать информацию о состоянии аниматоров в игру. Ниже приводится несколько рекомендаций по реализации этого механизма.

Не усложняйте код поведения машины состояний

State machine behaviors are bits of code that you can attach to any animation state. You use them to tie behavior directly to the state of the animator itself.

Avoid writing complex gameplay code inside of them because it can get difficult to track down where your changes in the state are coming from. If you are using state machine behavior to drive gameplay code, use a messaging system; talk to a manager class, or trigger your code off of parameters at a higher level.

Finally, my favorite state machine behavior: Debug.Break();. It’s the most useful state machine behavior; you can attach anywhere in your animation setup, and you’ll have a breakpoint, similar to that of a visual scripting system.

Don’t be afraid to use C# code where appropriate. Rather than have hundreds or thousands of transitions, or hooking up AnyState transitions all over the place, use Animator.Play or Animator.CrossFade to dynamically cause direct transitions from code. If that still isn’t enough control, you can look into our PlayablesAPI for even more ways to animate using code. Examples can be found at https://docs.unity3d.com/Manual/Playables-Examples.html.

Используйте машину состояний для стопроцентного срабатывания анимационного события

Анимационные события привязывают конкретный момент анимационного клипа к конкретной смене состояния в игре. Их можно использовать для воспроизведения визуальных и звуковых эффектов. Но если переход от нужного клипа к следующему произошел до срабатывания события, то оно не сработает никогда. Эту проблему можно решить, добавив машину состояний, которая гарантирует срабатывание события по достижении определенного момента времени вне зависимости от того, что еще происходит или не происходит в игре.

unity-tidy-animators-state-machine

Дополнительные ресурсы

Мы очень хотим знать, нравится ли вам наш контент.

Да, хочу больше Нет, могло быть и лучше
Согласен

Мы используем cookie-файлы, чтобы вам было удобнее работать с нашим веб-сайтом. Подробные сведения смотрите на странице политики обработки cookie-файлов.