Здравствуйте! Решил написать небольшой туториал по систему Mecanim которая должна облегчить нам работу с анимациями в 4-ой Unity3D. Сперва я сам не мог разобраться в аспектах работы с этой системой. Уроки к сожалению были только на английском.
В этом туториале я опишу как создать движения игрока (только в плане анимации).
Скачаем эту основу для нашего урока.
Запускаем проект, открываем сцену под названием «TutorialScene».
Дальше находим нашу модель которую будем анимировать (я использовал модель из игры Half-Life 2). Она называется «combine». Выбираем его. В инспекторе переходим во вкладку «Rig». Выбираем тип анимации «Humanoid» (если будет существо у которого ног больше 2-х, то «Humanoid» не совсем подойдет). Мы создаем аватар для данной модели, поэтому в поле «Avatar Definition» осталяем «Create From This Model». Применяем эти параметры нажав кнопку «Apply».
С моделькой пока закончили. Переходим к анимациям в количестве 9-ти штук: Idle – анимация «нечегоделания», бег: N – вперед, S – назад, W – Влево, E – Вправо и еще 4 вида анимации в которых происходит скрещивание N, S, W и E анимаций.
Выбираем анимацию Idle. Так же во вкладке «Rig» выбираем тип анимации «Humanoid». А аватар мы будем использовать который висит на модели. То есть в поле «Avatar Definition» выбираем «Copy From Other Avatar». Появиться поле «Source» где необходимо указать аватар нашей модели. Его можно посмотреть в иерархии нашей модели. В этом туториале он называется «combineAvatar» - выбираем его. Нажимаем «Apply» и переходим во вкладку «Animations». В таблице «Clips» выбираем анимацию «idle». Ставим галочку на «Loop Pose» что позволит зациклить анимацию; в пункте «Root Transform Rotation» ставим галочку на «Bake into Pose» и в поле «Based Upon (at Start)» выбираем «Original» - это позволит нам задать направление «вперед» относительно модели-оригинала (так же существует вариант «Body Orientation» - он задает направление «вперед» благодаря ориентации костей); в пункте «Root Transform Position (Y)» ставим галочку на «Bake into Pose» и в поле «Based Upon (at Start)» выбираем «Original» - чтобы высота положения модели не менялась, а была как в оригинальной модели (так же существует еще два варианта: «Feet» - высота меняется по положению ног, «Body Orientation» - высота меняется из-за изменения высоты положения костей). Жмем «Apply». Проделываем тоже самое для всех остальных анимаций.
Далее переносим модель на сцену. В окне ресурсов («Project») нажимаем правую кнопку мыши и выбираем «Create – Animator Controller». Называете как хотите, я назвал «combine». Дальше переносим созданный «Animator Controller» на нашу модель в строчку «Controller» компонента «Animator».
Двойным кликом открываем созданный «Animator Controller». Открывается новая вкладка под названием «Animator». Нажимаем правой кнопкой мыши в любом месте поля и в появившемся контекстном меню выбираем пункт «Create State - Empty». В инспекторе редактируем его название и называем «Idle». В поле «Motion» необходимо перенести анимацию «idle». Можете нажать «Play».
Для управления анимациями нам понадобиться две переменные «Direction» и «Speed». В левом нижнем углу окна «Animator» нажимаем на «+» который находится правее надписи «Parameters» и выбираем тип переменной «Float» и называем её «Speed». Повторяем действие, но на это раз называем переменную «Direction».
Создадим новое дерево анимаций («Create State – From New Blend Tree») где будет движение вперед. Назовем его «RunForward». Двойным кликом по «RunForward» переходим на дерево анимаций движения вперед. Добавляем слоты для анимаций в инспекторе. Это делается нажатием пипки «+» и выбора пункта «Add Motion Field». Нам нужно три слота так как у нас 3 вида анимаций: вперед, вперед-влево, вперед-вправо. Перекидываем анимации в слоты в порядке: вперед-влево, вперед, вперед-вправо. В инспекторе в пункте «Parameters» выбираем параметр «Direction» (именно им мы будем регулировать вид ангимации). Так же в появившейся диаграмме «0» меняем на «-1». То есть если у нас «Direction» = 0, то воспроизводиться простое движение вперед, если >0, то движение вперед-вправо, если <0, то вперед-влево.
Переходим назад на базовый слой кликнув по «Base Layer» наверху окна «Animator». Создаем такое же дерево как «RunForward», но на этот раз будет использоваться анимации движения назад. Назовите дерево «RunBackward». У вас должно получиться так как показано на рисунке.
Переходим к реализации движения в бок. Создаем новый слот («Create State - Empty») и называем его «SideLeft». Перекидываем на него соответствующую анимацию. Тоже самое проделываем для движения вправо.
Проложим связи между слотами анимаций. Первой будет связь «Idle -> RunForward». Для этого нажимаем правой кнопкой по «Idle» и выбираем пункт «Make Transition». Указываем «RunForward». Появиться стрелочка. Кликаем по ней. В инспекторе появляется различные параметры. Тут мы можем задать условия воспроизведения анимации. В нашем случае анимация будет воспроизводиться если скорость больше («Greater») 0.2. Теперь делаем обратную связь, то есть «RunForward -> Idle». Кликаем правой кнопкой по «RunForward» и выбираем пункт «Make Transition». Указываем «Idle». В качестве условия указываем что если скорость будет меньше («Less») 0.1.
Далее я представлю связи и их условия: связь – прямой переход – обратный.
Idle > RunBackward – Speed Less -0.2 – Speed Greater -0.1;
Idle > SideLeft – Direction Less -0.2 – Direction Greater -0.2;
Idle > SideRight – Direction Greater 0.2 – Direction Less 0.2;
RunForward > SideLeft – Speed Less 0.2, Direction Less -0.2 – Speed Greater 0.2;
RunForward > SideRight – Speed Less 0.2, Direction Greater 0.2 – Speed Greater 0.2;
RunBackward>SideLeft – Speed Greater -0.2, Direction Less -0.2 – Speed Less -0.2;
RunBackward>SideRight – Speed Greater -0.2; Direction Greater 0.2 – Speed Less -0.2;
У Вас должно получиться что-то типо этого:
Для управления анимациями необходимо написать скрипт. Создаем скрипт С#. Назовем его «AnimationController» и переидываем его на нашего персонажа. Содержание:
using UnityEngine;
using System.Collections;
public class AnimationController : MonoBehaviour {
public float animSpeed = 1.5f;
private Animator anim;
public void Start () {
anim = GetComponent<Animator>();
}
public void FixedUpdate () {
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
anim.SetFloat("Speed", v);
anim.SetFloat("Direction", h);
anim.speed = animSpeed;
}
}