Тема: Mecanim
Показать сообщение отдельно
Старый 02.01.2013, 20:11   #1
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Mecanim

Здравствуйте! Решил написать небольшой туториал по систему 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;
	}
}

Последний раз редактировалось pie, 03.01.2013 в 12:40.
(Offline)
 
Ответить с цитированием
Эти 16 пользователя(ей) сказали Спасибо pie за это полезное сообщение:
Amatsu (24.02.2013), Andvrok (03.01.2013), Dream (03.01.2013), Elcord (14.06.2013), Fatalix3d (08.01.2013), Harter (04.01.2013), is.SarCasm (02.01.2013), jfkkk (13.06.2013), Lowlet (27.02.2013), Nuprahtor (03.01.2013), pax (02.01.2013), Randomize (02.01.2013), Reks888 (08.01.2013), Spy4433 (10.03.2013), St_AnGer (03.01.2013), WISHMASTER35 (24.02.2013)