В этой статье продолжим делать управление 3d-персонажем в среде Unity. В прошлый раз мы остановились на портировании анимаций, они добавились без материалов (текстур). Чтобы отобразить текстуры из исходной blender-модели, кликнем на одну из анимаций, например, idle.fbx, в правом окне выберем вкладку Materials. В комбобоксе Material Creation Mode выберем Standard (Legacy), Location - Use External Materials (Legacy), остальные поля оставим неизменными, нажмем кнопку Apply. Теперь наша анимация отображает исходный skin модели.

Параметры импортирования skin'а персонажа
Параметры импортирования skin'а персонажа

Кроме этого, перейдем во вкладку Rig и изменим значение комбобокса Animation Type с Generic на Humanoid, применим это, нажав Apply. Кнопка Configure… позволяет проверить и настроить соответствие костей скелета в blender-модели и в Unity, это достаточно подробно рассмотрено в этом посте. Эти действия надо повторить для всех трех анимаций.

Новая система "гуманоидной" анимации
Новая система "гуманоидной" анимации

После изменения типа анимации с Generic на Humanoid во вкладке Animation поставим зацикливание анимации (чекбокс Loop Time) и повторение позы (чекбокс Loop Pose). Оставим настройки преобразования корневых объектов по умолчанию: вращение (root transform rotation) - Body Orientation, положение по вертикали (root transform rotation(y)) - Original, положение по горизонтали (root transform rotation(xz)) - Center of Mass. Цвет соответствующих “лампочек” loop match говорит о соответствии начального и последнего кадра анимации.

Эти параметры анимации доступны только для Animation Type Humanoid
Эти параметры анимации доступны только для Animation Type Humanoid

Перенесем анимацию idle в Hierarchy, переименуем новый GameObject в Player.

Новый Player
Новый Player

Теперь создадим менеджер анимаций Animator Controller, который будет управлять переходами между нашими анимациями, переходами между состояниями конечного автомата (FSM) персонажа. Конечный автомат - это математическая модель, представляющая “процесс работы” определенного сложного механизма в виде переходов между конечным множеством состояний.

Состояния нашего конечного автомата
Состояния нашего конечного автомата

Создадим Animator Controller в папке с анимациями (Assets/Animations): нажмем правую кнопку мыши, выберем Create->Animator Controller, переименуем его в manager. Дважды кликнем по нашему менеджеру анимаций, перетащим три наши анимации в редактор связей, по пути дописав названия.

idle, walk, run
idle, walk, run

Оранжевым цветом помечена дефолтная анимация, в которую наш персонаж попадает после старта. Чтобы сделать другую анимацию стартовой, надо правой кнопкой мыши нажать на соответствующую анимацию и из выпадающего меню выбрать Set As Layer Default State. Создадим переход из анимации idle в walk. Для этого нажмем правой кнопкой мыши на состоянии idle, из выпадающего списка выберем Make Transition и доведем стрелку до состояния walk. Приближать и уменьшать схему переходов между состояниями можно, прокручивая колесико мыши, менять обзор, перемещая мышь при нажатой средней клавише.

Сделаем активной стрелку перехода (transition). Для перехода из одного состояния анимации в другое используются формализованные условия (conditions). Условия взаимодействуют с параметрами (parameters). Перейдем во вложенную вкладку Parameters окна Animator. Добавим новый параметр (нажмем на знак +) типа float с именем speed. Добавим следующее условие: если значение speed больше 0.1 переходим из состояния idle в walk. Для этого нажмем + в правой вкладке Conditions в Inspector, выберем параметр speed, условие “больше” (Greater), значение 0.1. Если оставить чекбокс Has Exit Time включенным для всех переходов, перед изменением анимации, например, с idle на walk будет появляться пауза из-за того, что контроллер будет доводить цикл анимации до конца и только после этого переключать состояние. Снимем этого чекбокс, чтобы переключения происходили сразу после изменения параметра, позже, сразу после нажатия соответствующей управляющей клавиши.

Надо не забыть снять чекбокс Has Exit Time
Надо не забыть снять чекбокс Has Exit Time

Добавим обратный переход из состояния walk в idle, если параметр speed становится меньше 0.1. Для перехода из состояния idle в состояние run добавим параметр running типа bool. Если флаг running становится true, переключаемся в состояние run, и наоборот. Добавим два соответствующих перехода. Со всеми описанными переходами схема анимаций должна выглядеть примерно следующим образом.

Состояния конечного автомата в Unity
Состояния конечного автомата в Unity

Состояния конечного автомата с переходами описаны в следующей таблице.

Переход

Условие

idle-walk

speed > 0.1

walk-idle

speed < 0.1

idle-run

running = true

run-idle

running = false

Привяжем контроллер анимаций к игровому объекту player, перетащим manager в поле Controller компонента Animator. Оставим чекбокс Apply Root Motion без изменений выделенным, так как мы будем использовать передвижение игрового объекта по сцене с проигрыванием анимаций.

player and manager
player and manager

Расположим вкладку Animator в среде так, чтобы можно было изменять параметры анимаций и видеть, как это влияет на персонажа. Камеру я подвинул так, чтобы мы видели персонажа со спины, в стиле third person shooter. Запустим игру, нажав кнопку play.

Визуальное управление состояниями
Визуальное управление состояниями

Остановимся сегодня на этом. В следующей статье будет про управление персонажем и камерой при помощи проприетарного плагина Playmaker. В последующих - без Playmaker.

Комментарии (5)


  1. JK_Glover
    11.04.2024 13:17

    Нашел предыдущий туториал только через профиль. Хороший тон - давать линк вначале статьи.


    1. adil21 Автор
      11.04.2024 13:17

      Спасибо, добавил ссылку на предыдущую статью


  1. fire64
    11.04.2024 13:17
    +1

    Хотелось бы почитать статьи про IK (хождение по лестнице например) и про блендинг анимаций, например анимация ходьбы и стрельбы разом.

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

    Нормальных подробных статей на эти темы очень мало....