В этой статье продолжим делать управление 3d-персонажем в среде Unity. В прошлый раз мы остановились на портировании анимаций, они добавились без материалов (текстур). Чтобы отобразить текстуры из исходной blender-модели, кликнем на одну из анимаций, например, idle.fbx, в правом окне выберем вкладку Materials. В комбобоксе Material Creation Mode выберем Standard (Legacy), Location - Use External Materials (Legacy), остальные поля оставим неизменными, нажмем кнопку Apply. Теперь наша анимация отображает исходный 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 говорит о соответствии начального и последнего кадра анимации.
Перенесем анимацию idle в Hierarchy, переименуем новый GameObject в Player.
Теперь создадим менеджер анимаций Animator Controller, который будет управлять переходами между нашими анимациями, переходами между состояниями конечного автомата (FSM) персонажа. Конечный автомат - это математическая модель, представляющая “процесс работы” определенного сложного механизма в виде переходов между конечным множеством состояний.
Создадим Animator Controller в папке с анимациями (Assets/Animations): нажмем правую кнопку мыши, выберем Create->Animator Controller, переименуем его в manager. Дважды кликнем по нашему менеджеру анимаций, перетащим три наши анимации в редактор связей, по пути дописав названия.
Оранжевым цветом помечена дефолтная анимация, в которую наш персонаж попадает после старта. Чтобы сделать другую анимацию стартовой, надо правой кнопкой мыши нажать на соответствующую анимацию и из выпадающего меню выбрать 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 будет появляться пауза из-за того, что контроллер будет доводить цикл анимации до конца и только после этого переключать состояние. Снимем этого чекбокс, чтобы переключения происходили сразу после изменения параметра, позже, сразу после нажатия соответствующей управляющей клавиши.
Добавим обратный переход из состояния walk в idle, если параметр speed становится меньше 0.1. Для перехода из состояния idle в состояние run добавим параметр running типа bool. Если флаг running становится true, переключаемся в состояние run, и наоборот. Добавим два соответствующих перехода. Со всеми описанными переходами схема анимаций должна выглядеть примерно следующим образом.
Состояния конечного автомата с переходами описаны в следующей таблице.
Переход | Условие |
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 без изменений выделенным, так как мы будем использовать передвижение игрового объекта по сцене с проигрыванием анимаций.
Расположим вкладку Animator в среде так, чтобы можно было изменять параметры анимаций и видеть, как это влияет на персонажа. Камеру я подвинул так, чтобы мы видели персонажа со спины, в стиле third person shooter. Запустим игру, нажав кнопку play.
Остановимся сегодня на этом. В следующей статье будет про управление персонажем и камерой при помощи проприетарного плагина Playmaker. В последующих - без Playmaker.