Искать

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

Все состояния левой руки Генри. У каждого слоя — своя цель и четкая иерархия. Это упрощает управление состоянием и его поиск.

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

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

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

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

    unity-tidy-animators-hub-and-spoke

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

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

    unity-tidy-animators-entry-to-exit

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

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

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

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

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

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

Старайтесь не усложнять код поведения, поскольку это усложнит отслеживание источника изменений состояния. Если вы используете поведение машины состояний для управления кодом игрового процесса, то используйте систему передачи сообщений: обращайтесь к классу системы управления или запускайте код на основе параметров более высокого уровня.

И наконец, мое любимое поведение машины состояний: Debug.Break(); Это самое полезное поведение, его можно прикрепить к любой системе анимации, получив таким образом точку прерывания, почти как в системе визуального скриптинга.

Не бойтесь использовать код C# там, где он нужен. Вместо тысяч переходов, повсеместной привязки переходов AnyState, используйте Animator.Play или Animator.CrossFade для динамического программного управления прямыми переходами. Если вам и этого недостаточно, то изучите API Playables и освойте новые способы программной анимации. Примеры можно найти по адресу https://docs.unity3d.com/Manual/Playables-Examples.html.

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

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

unity-tidy-animators-state-machine

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

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

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