В этой статье продолжим делать управление 3d-персонажем в среде Unity. В прошлый раз мы остановились на портировании анимаций, они добавились без материалов (текстур). Чтобы отобразить текстуры из исходной blender-модели, кликнем на одну из анимаций, например, idle.fbx, в правом окне выберем вкладку Materials. В комбобоксе Material Creation Mode выберем Standard (Legacy), Location - Use External Materials (Legacy), остальные поля оставим неизменными, нажмем кнопку Apply. Теперь наша анимация отображает исходный skin модели.
![Параметры импортирования skin'а персонажа Параметры импортирования skin'а персонажа](https://habrastorage.org/getpro/habr/upload_files/053/46c/9e4/05346c9e47e42fdd40245ba4490aae99.png)
Кроме этого, перейдем во вкладку Rig и изменим значение комбобокса Animation Type с Generic на Humanoid, применим это, нажав Apply. Кнопка Configure… позволяет проверить и настроить соответствие костей скелета в blender-модели и в Unity, это достаточно подробно рассмотрено в этом посте. Эти действия надо повторить для всех трех анимаций.
![Новая система "гуманоидной" анимации Новая система "гуманоидной" анимации](https://habrastorage.org/getpro/habr/upload_files/d0b/86d/9ec/d0b86d9eca4b99d47d4e21a641471fd1.png)
После изменения типа анимации с 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](https://habrastorage.org/getpro/habr/upload_files/071/1e4/152/0711e415293a398ef97716287ee65338.png)
Перенесем анимацию idle в Hierarchy, переименуем новый GameObject в Player.
![Новый Player Новый Player](https://habrastorage.org/getpro/habr/upload_files/cd1/bed/576/cd1bed5766bad59211bb567371dc821c.png)
Теперь создадим менеджер анимаций Animator Controller, который будет управлять переходами между нашими анимациями, переходами между состояниями конечного автомата (FSM) персонажа. Конечный автомат - это математическая модель, представляющая “процесс работы” определенного сложного механизма в виде переходов между конечным множеством состояний.
![Состояния нашего конечного автомата Состояния нашего конечного автомата](https://habrastorage.org/getpro/habr/upload_files/e18/9ee/26f/e189ee26fb2dbdc837a0d119c5adf895.png)
Создадим Animator Controller в папке с анимациями (Assets/Animations): нажмем правую кнопку мыши, выберем Create->Animator Controller, переименуем его в manager. Дважды кликнем по нашему менеджеру анимаций, перетащим три наши анимации в редактор связей, по пути дописав названия.
![idle, walk, run idle, walk, run](https://habrastorage.org/getpro/habr/upload_files/431/0a1/540/4310a154085222476d19d10599274cb0.png)
Оранжевым цветом помечена дефолтная анимация, в которую наш персонаж попадает после старта. Чтобы сделать другую анимацию стартовой, надо правой кнопкой мыши нажать на соответствующую анимацию и из выпадающего меню выбрать 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](https://habrastorage.org/getpro/habr/upload_files/ef2/9be/6e8/ef29be6e8117c515d55853d176888590.png)
Добавим обратный переход из состояния walk в idle, если параметр speed становится меньше 0.1. Для перехода из состояния idle в состояние run добавим параметр running типа bool. Если флаг running становится true, переключаемся в состояние run, и наоборот. Добавим два соответствующих перехода. Со всеми описанными переходами схема анимаций должна выглядеть примерно следующим образом.
![Состояния конечного автомата в Unity Состояния конечного автомата в Unity](https://habrastorage.org/getpro/habr/upload_files/a4d/f84/55d/a4df8455d2b22148d6db52e5cedba60e.png)
Состояния конечного автомата с переходами описаны в следующей таблице.
Переход | Условие |
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](https://habrastorage.org/getpro/habr/upload_files/f99/1c8/ba0/f991c8ba0ba8afd192fbe43e29c8c9c3.png)
Расположим вкладку Animator в среде так, чтобы можно было изменять параметры анимаций и видеть, как это влияет на персонажа. Камеру я подвинул так, чтобы мы видели персонажа со спины, в стиле third person shooter. Запустим игру, нажав кнопку play.
![Визуальное управление состояниями Визуальное управление состояниями](https://habrastorage.org/getpro/habr/upload_files/d24/64a/93b/d2464a93b35aae9a799632b8e3df2c1f.gif)
Остановимся сегодня на этом. В следующей статье будет про управление персонажем и камерой при помощи проприетарного плагина Playmaker. В последующих - без Playmaker.