Настройка анимаций передвижения в юнити
Предисловие:
Приветствую, дорогие читатели. Сегодня мы научимся приводить модельку персонажа игры в движение. Познакомимся с сервисом mixamo, а также детально рассмотрим настройки самих анимаций, работу с анимационными стейтами и переходы между ними. Все это поможет в будущем создать классно движущегося персонажа, без рывков, бега на месте и прочих неприятных глазу мелочей.
Mixamo:
Начнём с того что выберем сами анимации. Для создания базового движения нам потребуется как минимум 3 анимации:
● Idle - анимация когда персонаж стоит на месте и совершает небольшие движения, например дышит;
● Walk - анимация ходьбы;
● Run - анимация бега.
Где же нам безболезненно найти эти анимации? Существует бесплатный сервис, который предоставляет доступ к сотням самых различных анимаций и моделей персонажей, он называется Adobe Mixamo. После несложной регистрации мы можем загрузить туда нашу модель персонажа или выбрать из представленных на сайте. В случае если на нашей модели не было рига, mixamo имеет встроенный auto rigger и автоматически предложит им воспользоваться, там нужно просто указать на нашей модели ключевые точки такие как: локти, колени, подбородок и пах. После этого мы вводим в поиске поочерёдно название интересующих нас анимаций и скачиваем понравившиеся.
Первичная настройка в Unity:
Итак, мы скачали и экспортировали анимации в Unity, теперь нам необходимо их настроить.
- Выбрав саму анимацию в окне инспектор, необходимо перейти в раздел rig. Далее в пункте animation type надо выбрать humanoid. Чаще всего встречаются гуманоидные персонажи, это те которые похожи на людей, две руки, две ноги. И если мы установим animation type humanoid, то сможем использовать эту анимацию на любом гуманоидном персонаже в нашей игре, как правило это удобно. Для персонажей, которые отличаются строением тела от людей принято использовать animation type generic, но об этом в другой раз. Следующий пункт - avatar definition. Аватар это образ модели, позволяющий понять анимации к какому персонажу она относится. В нашем случае, так как мы используем humanoid, оставляем этот пункт на create from this model. На этом с разделом rig заканчиваем, жмем apply и переходим в раздел animation.
- В этом разделе мы можем назначить имя анимации, так как скорее всего дефолтное нас не устроит. В этом же разделе представлены пункты поведения самой анимации. Рассмотрим основные из них:
○ Loop time - отвечает за автоматическое зацикливание анимации, если например мы используем анимацию смерти, которая должна проиграться только единожды, то эту галочку нужно снять. В нашем случае наши анимации должны быть зациклены, поэтому отмечаем галочку. Также loop time имеет подпункты loop pose и cycle offset. Первый отвечает за зацикливание именно движения персонажа, второй за то с какого места анимация будет воспроизводиться. Нам будет достаточно просто отметить loop time.
○ Root transform rotation - этот пункт регулирует то насколько анимация будет влиять на поворот родительского объекта в оси Y. Для простых персонажей, не использующих root motion,в этом и последующих пунктах всегда лучше блокировать анимациям любые возможности повлиять на сам объект персонажа. Для этого отмечаем галочку bake into pose, а Based Upon ставим original
○ Root transform position Y - отвечает за сдвиг персонажа по оси Y. Отмечаем все пункты по аналогии с предыдущим.
○ Root transform position XZ -отвечает за сдвиг персонажа по осям X и Z. Также как и в предыдущих пунктах блокируем любой возможный сдвиг.
После этого первичная настройка анимаций завершена и мы готовы перейти к следующему пункту. Нажимаем apply.
Подготовка к работе с аниматором:
Итак, вот настройки анимаций завершены и нам уже не терпится примерить их на персонажа в самой игре. Для этого на нашу модель персонажа, которая является чайлдом рутового объекта самого персонажа, необходимо добавить компонент аниматор. У него тоже есть несколько пунктов:
● Culling mode - определяет, то будет ли работать аниматор, когда наш персонаж не попадает в кадр. Ставим cool completely, это будет отключать анимацию, на персонажах за кадром, что даст прирост производительности.
● Update mode - определяет то будет ли влиять на наши анимации замедление или ускорение времени. Normal - будет, Unscaled time - не будет.
● Apply root motion - определяет будет ли применено движение из анимаций (если таковое предусмотрено) к объекту нашего аниматора. Нам в данном случае это ни к чему, так что галочку оставляем пустой.
● Avatar - здесь нам необходимо указать аватара нашей модели. Для того чтобы его создать надо перейти в нашу модель, через иерархию проекта, в инспекторе выбрать rig и там в avatar definition выбрать create from this model и нажать apply. После чего аватар создастся чайлдом нашей модели и мы сможем перетащить его в аниматор.
● Animator controller - то самое анимационное дерево хранящее в себе то как именно анимации будут проигрываться и в какой последовательности. Для того чтобы его создать нужно кликнуть правой кнопкой мыши в иерархии проекта, create, animator controller. После этого перетянуть созданный контроллер в наш компонент аниматора на сцене.
Animator controller:
И вот мы подошли к последнему, но не по важности, пункту нашего урока.
Контроллер представляет собой граф в котором мы можем создавать различные анимационные стейты, переходы между ними, а также задавать различные параметры такие как : float, bool, trigger. Если float и bool - понятно что такое, то trigger это что-то новое, на деле он просто вызывает то или иное событие (как правило переход между стейтами) при активации.
Сами стейты бывают нескольких видов:
● Empty - пустой стейт, при переходе в него персонаж займет свою исходную т-позу.
● Обычный анимационный стейт - содержит анимационный клип, который будет проигран при переходе в данный стейт.
● Сабстейт - позволяет сделать аниматор контроллер внутри другого аниматор контроллера (где-то здесь торчат уши xzibit'a)
● Blend tree - идеально подходит для создания плавного смешивания анимаций персонажа, рассмотрим его подробнее.
Для того чтобы создать новый blend tree, нужно кликнуть правой кнопкой мыши в пустом месте графа, create, from new blend tree. После этого можно дважды щелкнуть по создавшемуся стейту, чтобы перейти внутрь него. Здесь уже есть стейт blend tree. Выбрав его, в инспекторе откроется его меню, оно содержит несколько пунктов:
● Blend type - определяет тип смешивания, зачастую в простых играх используется 1D. Он позволяет смешивать анимации с помощью одной оси. Есть еще 2D freedom directional, он позволяет реализовывать такие вещи как стрейф. Когда ваш персонаж может и бежать вперёд и вбок и по диагонали, но о нём в другой раз. Сейчас выбираем 1D.
● Parametr - определяет float параметр, который будет управлять смешиванием. Его очень удобно в последствиии привязать к инпуту из кода. Например к магнитуде виртуального джойстика или к input.Axis
● Лист motion - список самих анимаций. Нажав на плюсик мы создадим новый пустой элемент этого списка. Теперь нам надо перетянуть в него наши анимации так чтобы они располагались по порядку - idle, walk, run. Возле каждого элемента есть два числовых значения - threshold отвечает за то на каком именно значении parameter эта анимация будет проигрываться на 100%. И скорость проигрывания анимации.
Также по мере добавления новых элементов мы будем видеть изменения на графической схеме в верхней части окна. На ней тоже можно изменить параметр threshold для каждой анимации, но как по мне числами это делать удобнее.
На этом всё. После этого персонаж готов к тому чтобы плавно и красиво перемещаться по игровому пространству, осталось только написать код для этого. Благо он совсем не сложный, так что обязательно рассмотрим его в следующий раз.
Заключение:
Что ж, мои поздравления, сегодня мы усвоили:
- Как работать с mixamo
- Как настраивать анимации после экспорта в Unity
- Как создавать и настраивать animator component и animator controller
- Как создавать и настраивать blend tree
Конечно тема анимаций слишком широка, чтобы уместить ее в одну статью. Мы могли бы поговорить еще о переходах, сабстейтах, параметрах, скриптах, анимационных ивентах и много еще о чем. Но я думаю, мы обязательно рассмотрим эти темы в будущем, а пока предлагаю полюбоваться результатом своей работы и похвалить себя за проделанный труд!