Создавайте контроллеры-аниматоры для своих персонажей так же, как если бы вы создавали сценарий, чтобы их было достаточно просто использовать, поддерживать и отлаживать на протяжении всего цикла разработки.
Все скриншоты ниже взяты из анимации персонажа Генри из Firewatch от Campo Santo.
Деревья смешивания отлично подходят для сокрытия сложности. Дерево смешивания не имеет состояния, поскольку оно не вызывает обратного вызова в код. Он смешивает разные клипы на основе заданных вами параметров.
Значение этого в том, что вы можете перебирать деревья смешивания, не беспокоясь о том, что сломаете остальную часть вашей игры. Вы можете скрыть сложную сеть состояний и предотвратить ошибки в будущем, поскольку вы не можете связать поведение с большинством анимаций в дереве смешивания.
Полезно думать о слоях как о классе в скрипте. Вы хотите, чтобы все в слое выполняло одну и ту же логическую и поведенческую функцию. Это связано с тем, что каждый отдельный слой контролирует, какие другие слои он переопределяет – влияет ли он на определенные кости, является ли этот слой аддитивным и так далее.
Повторно используемые логические шаблоны в машинах состояний и подсостояний ускоряют разработку, облегчают отладку и могут уменьшить количество ошибок, при этом позволяя нескольким людям создавать одинаковый контент.
В следующих разделах представлены шаблоны, полезные для структурирования слоев.
Этот шаблон упрощает отладку, поскольку вы можете четко видеть, как переходы гаснут и возвращаются в пустое состояние. Каждый луч концентратора должен сбрасывать любое состояние, которого он касается.
Спицы являются надежными кандидатами для создания подгосударственных машин с использованием следующих шаблонов.
Группируя состояния по шаблону «вступление» — выполнение/цикл — «завершение», вы можете четко прикрепить любые анимационные события или поведение конечного автомата к вступительному и завершающему состояниям. Как и в случае с деревом смешивания, вы можете перебирать и изменять внутренние состояния выполнения/цикла, не беспокоясь о том, что игра сломается.
Для прерываемой анимации, особенно анимации, управляемой игроком, разбейте клип на две части. Во-первых, поддерживайте критический раздел, содержащий все изменения состояния, эффекты и повреждения, которые всегда должны воспроизводиться до завершения. Во-вторых, придумайте анимацию стабилизации, которая будет хорошо выглядеть, возвращая вас в режим ожидания и которая может быть прервана новым вводом.
Как только ваша анимация будет вести себя и выглядеть так, как хотелось, вам нужно будет передать состояние ваших аниматоров в состояние вашей игры. В следующих разделах приведены некоторые ключевые моменты, которые следует учитывать.
Поведения конечного автомата — это фрагменты кода, которые можно прикрепить к любому состоянию анимации. Используйте их, чтобы связать поведение непосредственно с состоянием самого аниматора.
Избегайте написания внутри них сложного игрового кода, потому что может быть сложно отследить, откуда берутся изменения в состоянии. Если вы используете поведение конечного автомата для управления кодом игрового процесса, используйте систему обмена сообщениями; поговорите с классом менеджера или запустите свой код из параметров на более высоком уровне.
Debug.Break() — одно из наиболее эффективных вариантов поведения конечного автомата, которые вы можете использовать. Прикрепите его в любом месте настройки анимации, и вы получите точку останова, аналогичную системе визуальных сценариев.
При необходимости используйте код C#. Вместо управления сотнями или тысячами переходов или повсеместного подключения переходов AnyState используйте Animator.Play или Animator.CrossFade для динамического создания прямых переходов из кода. Если вам все еще недостаточно контроля, загляните в Unity’s Playables API, чтобы узнать больше о способах анимации с помощью кода. Некоторые примеры можно найти здесь.
Анимационные события связывают конкретный момент вашего анимационного клипа с конкретным изменением состояния в вашей игре. Их можно использовать для выделения таких элементов, как визуальные и звуковые эффекты. Однако если вы выйдете из клипа до того, как он был запущен, он никогда не сработает. Один из способов решения этой проблемы — добавить поведение конечного автомата, которое гарантирует, что событие всегда срабатывает при достижении определенного момента времени, независимо от того, что еще происходит (или не происходит) в игре.