![Hero background image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F882f2ca5e47c85ada765828f02847249f3b6eb74-1920x1080.jpg&w=3840&q=100)
Создавайте контроллеры-аниматоры для своих персонажей так же, как если бы вы создавали сценарий, чтобы их было достаточно просто использовать, поддерживать и отлаживать на протяжении всего цикла разработки.
Все скриншоты ниже взяты из анимации персонажа Генри из Firewatch от Campo Santo.
![Смешать изображение дерева](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2Fc9c28616a882707b5f5889bc0dbdfbdc36ea61a6-1018x728.jpg&w=3840&q=75)
Деревья смешивания отлично подходят для сокрытия сложности. Дерево смешивания не имеет состояния, поскольку оно не вызывает обратного вызова в код. Он смешивает разные клипы на основе заданных вами параметров.
Значение этого в том, что вы можете перебирать деревья смешивания, не беспокоясь о том, что сломаете остальную часть вашей игры. Вы можете скрыть сложную сеть состояний и предотвратить ошибки в будущем, поскольку вы не можете связать поведение с большинством анимаций в дереве смешивания.
![Аниматор утверждает](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2Fc0896eec390db1c42ad0d4027e20ebad7dfd0262-1293x565.jpg&w=3840&q=75)
Полезно думать о слоях как о классе в скрипте. Вы хотите, чтобы все в слое выполняло одну и ту же логическую и поведенческую функцию. Это связано с тем, что каждый отдельный слой контролирует, какие другие слои он переопределяет – влияет ли он на определенные кости, является ли этот слой аддитивным и так далее.
Повторно используемые логические шаблоны в машинах состояний и подсостояний ускоряют разработку, облегчают отладку и могут уменьшить количество ошибок, при этом позволяя нескольким людям создавать одинаковый контент.
В следующих разделах представлены шаблоны, полезные для структурирования слоев.
![Ступица и спицы аниматоров](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2Ffcdf7a33ccf792fcfdca12e7a2e057efd3d25215-1233x621.jpg&w=3840&q=75)
Этот шаблон упрощает отладку, поскольку вы можете четко видеть, как переходы гаснут и возвращаются в пустое состояние. Каждый луч концентратора должен сбрасывать любое состояние, которого он касается.
Спицы являются надежными кандидатами для создания подгосударственных машин с использованием следующих шаблонов.
![Вход на выход аниматоров](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F6a2cc04ce877e0f89469b4f0e0c1366ac2fd372f-1306x447.jpg&w=3840&q=75)
Группируя состояния по шаблону «вступление» — выполнение/цикл — «завершение», вы можете четко прикрепить любые анимационные события или поведение конечного автомата к вступительному и завершающему состояниям. Как и в случае с деревом смешивания, вы можете перебирать и изменять внутренние состояния выполнения/цикла, не беспокоясь о том, что игра сломается.
![Разделение и расчет шаблона](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2Fdc5f101ce03c32975c4685abe597d0340eec9403-1109x271.jpg&w=3840&q=75)
Для прерываемой анимации, особенно анимации, управляемой игроком, разбейте клип на две части. Во-первых, поддерживайте критический раздел, содержащий все изменения состояния, эффекты и повреждения, которые всегда должны воспроизводиться до завершения. Во-вторых, придумайте анимацию стабилизации, которая будет хорошо выглядеть, возвращая вас в режим ожидания и которая может быть прервана новым вводом.
Как только ваша анимация будет вести себя и выглядеть так, как хотелось, вам нужно будет передать состояние ваших аниматоров в состояние вашей игры. В следующих разделах приведены некоторые ключевые моменты, которые следует учитывать.
Поведения конечного автомата — это фрагменты кода, которые можно прикрепить к любому состоянию анимации. Используйте их, чтобы связать поведение непосредственно с состоянием самого аниматора.
Избегайте написания внутри них сложного игрового кода, потому что может быть сложно отследить, откуда берутся изменения в состоянии. Если вы используете поведение конечного автомата для управления кодом игрового процесса, используйте систему обмена сообщениями; поговорите с классом менеджера или запустите свой код из параметров на более высоком уровне.
Debug.Break() — одно из наиболее эффективных вариантов поведения конечного автомата, которые вы можете использовать. Прикрепите его в любом месте настройки анимации, и вы получите точку останова, аналогичную системе визуальных сценариев.
При необходимости используйте код C#. Вместо управления сотнями или тысячами переходов или повсеместного подключения переходов AnyState используйте Animator.Play или Animator.CrossFade для динамического создания прямых переходов из кода. Если вам все еще недостаточно контроля, загляните в Unity’s Playables API, чтобы узнать больше о способах анимации с помощью кода. Некоторые примеры можно найти здесь.
![Поведение конечного автомата](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F617be2198f00416cc4e68c1c515f6abdf5215a5b-666x635.jpg&w=3840&q=75)
Анимационные события связывают конкретный момент вашего анимационного клипа с конкретным изменением состояния в вашей игре. Их можно использовать для выделения таких элементов, как визуальные и звуковые эффекты. Однако если вы выйдете из клипа до того, как он был запущен, он никогда не сработает. Один из способов решения этой проблемы — добавить поведение конечного автомата, которое гарантирует, что событие всегда срабатывает при достижении определенного момента времени, независимо от того, что еще происходит (или не происходит) в игре.