Знакомство с Mecanim, настройка анимации

У Unity довольно обширные возможности по анимации объекта и его компонентов. В предыдущих уроках мы затрагивали эту тему, создавая простую анимацию. Если кто-то занимался монтажом видео в профессиональных редакторах, то сразу заметит сходство. Тем не менее, анимировать вручную персонажа для какого-нибудь шутера, будет несколько затруднительно, да и незачем. Достаточно воспользоваться технологией захвата движений (motion capture), точнее заранее записанной и подготовленной анимацией, осталось только нацепить на нее 3D модель персонажа и готово. Поэтому сегодня рассмотрим основы, как совместить модель с анимацией, и чтобы работало как надо.


Заглянем в ассет стор (Window -> Asset Store), находим там Soldier Character Pack (наша модель) и Mobility Free (набор движений). Эти ассеты распространяются бесплатно, скачиваем и импортируем в проект. Далее, ищем файлы FBX там пара солдат и папка с анимациями. На всех этих файлах, на вкладке Rig установить Animation Type -> Humanoid, так как мы будем работать с человекоподобной моделью.

Знакомство с Mecanim, настройка анимации

Отредактируем анимацию, идем в папку и выбираем движения: ожидание, ходьба, бег. По именам: MOB1_M1_Jog_F, MOB1_M1_Run_F, MOB1_M1_Stand_Relaxed_Idle, MOB1_M1_Walk_F, MOB1_M1_Crouch_Idle, MOB1_M1_CrouchWalk_F. Их надо зациклить:


С подготовкой завершили. Займемся персонажем.

Перетаскиваем одного из солдат на сцену, добавим компоненты к нему: Capsule Collider чтобы герой не проходил сквозь объекты, Rigidbody для физики (массу поставить на 100), и еще добавим С# скрипт Control:


using UnityEngine;
using System.Collections;

public class Control : MonoBehaviour {
	
	private Rigidbody body;
	private Animator anim;
	private float h;
	private float v;

	void Start () 
	{
		anim = GetComponent<Animator>();
		body = GetComponent<Rigidbody>();
		body.freezeRotation = true;
	}

	void FixedUpdate()
	{
		anim.SetFloat("Vertical", v, 0.1f, Time.fixedDeltaTime);
		if(Input.GetKey(KeyCode.LeftShift)) anim.SetFloat("Run", 1, 0.1f, Time.fixedDeltaTime); else anim.SetFloat("Run", 0, 0.1f, Time.fixedDeltaTime);
		if(Input.GetKey(KeyCode.Space)) anim.SetFloat("Jump", 1); else anim.SetFloat("Jump", 0);
	}

	void Update () 
	{
		h = Input.GetAxis("Horizontal");
		v = Input.GetAxis("Vertical");

		transform.Rotate(0, h, 0);
	}
}

Тут мы будем переключать анимацию и вращать персонажа по оси Y. Левый шифт - бег, Пробел - прыжок. WASD - движение.

Теперь в одной из папок проекта создаем контроллер анимации ЛКМ - > Create -> Animator Controller и кидаем его на персонажа. Переходим на вкладку Animator, добавим параметры типа float для переключения анимации вперед/назад (Vertical), бег (Run) и прыжок (Jump).


Правый клик в окне аниматора и в выпадающем меню выбираем Create State -> From New Blend Tree и сразу переименуем в Locomotion (тут будут основные движения). Создаем еще один Blend Tree и назовем его Jump (варианты прыжков). Нужно сделать переключение анимаций из Locomotion в Jump и обратно, правый клик по Locomotion -> Make Transition - указываем Jump, потом делаем обратное. Выделяем первое направление и устанавливаем условие перехода, как показано на скриншоте:


На обратном переходе, ничего менять не нужно, там должно быть включено Has Exit Time.

Двойной клик по Locomotion и делаем вот так:


Обычная логическая цепочка, где идет переключение между анимациями в зависимости от значения переменных. Нажав на крестик, как показано на скриншоте, можно добавить Add Motion Field куда кидается файл анимации, либо New Blend Tree. Здесь как видно идет переключение между двумя Blend Tree, которые содержат анимацию ходьбы/ожидания и бег/ожидание. При нажатии клавиши шифт Run = 1 и происходит переключение на соответствующий Blend Tree, в ином случаи работает Walk. А Vertical может иметь три значения: -1,0,1 то есть - назад, ожидание, вперед.

Редактируем Jump:


Принцип действия тот-же.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика