Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 02.01.2013, 16: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 в 08:40.
(Offline)
 
Ответить с цитированием
Эти 16 пользователя(ей) сказали Спасибо pie за это полезное сообщение:
Amatsu (24.02.2013), Andvrok (02.01.2013), Dream (03.01.2013), Elcord (13.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)
Старый 03.01.2013, 08:45   #2
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Ответ: Mecanim

Что должно получиться в итоге: Онлайн
(Offline)
 
Ответить с цитированием
Старый 03.01.2013, 11:17   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: Mecanim

Сообщение от pie Посмотреть сообщение
Что должно получиться в итоге: Онлайн
Глючит, часто не бижит в нужную сторону (особенно в бок), а иногда бежит и не выключается анимация
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 03.01.2013, 11:34   #4
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Ответ: Mecanim

Сообщение от pax Посмотреть сообщение
Глючит, часто не бижит в нужную сторону (особенно в бок), а иногда бежит и не выключается анимация
Ты прав. Не было одной связи. Исправил, пере залил.
(Offline)
 
Ответить с цитированием
Старый 08.01.2013, 05:14   #5
Fatalix3d
Разработчик
 
Аватар для Fatalix3d
 
Регистрация: 28.12.2008
Адрес: Алматы
Сообщений: 486
Написано 252 полезных сообщений
(для 1,160 пользователей)
Ответ: Mecanim

Откуда скрипт берет что нажата W,A,S,D??? В листинге не вижу.
За тутор спасибо большое.
(Offline)
 
Ответить с цитированием
Старый 08.01.2013, 08:21   #6
is.SarCasm
Бывалый
 
Аватар для is.SarCasm
 
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений
(для 427 пользователей)
Ответ: Mecanim


float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");

anim.SetFloat("Speed", v);
anim.SetFloat("Direction", h);
anim.speed = animSpeed;
Вот же
(Offline)
 
Ответить с цитированием
Старый 24.02.2013, 17:19   #7
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Mecanim

Хороший урок, но не нравится мне, что переход с одного направления в противоположное происходит через idle анимацию.
pie, можешь это исправит?
(Offline)
 
Ответить с цитированием
Старый 26.02.2013, 19:51   #8
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Ответ: Mecanim

WISHMASTER35, А мне кажется что это правильно. Ты попробуй в жизни двигаясь в одну сторону резко начать двигаться в противоположную. У тебя все равно будет отрезок где ты остановишься.
(Offline)
 
Ответить с цитированием
Старый 26.02.2013, 20:20   #9
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Mecanim

pie, остановлюсь, но руки поднимать не буду. Меня поднятие рук раздражало.
Можешь помочь с парой вопросов.
1) я читал это http://docs.unity3d.com/Documentatio...ationClip.html но не очень понимаю как работает импорт. и что то за цветные кружки. Можешь рассказать что там к чему?
И не понятно почему с одной анимацией работает гравитация, а с другой нет.
2) Для чего в графе этот Any State? И почему в него нельзя добавить анимацию, ведь это такой же State как и те, что с анимациями?
(Offline)
 
Ответить с цитированием
Старый 26.02.2013, 20:32   #10
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Ответ: Mecanim

Я сам до конца не разобрался с этой системой. Только поверхностно по зарубежным урокам.
1) Как я понял зеленая обозначает что анимация поддерживает тот или иной вариант. Например Loop Pose: видимо система сравнивает начальное и конечное положение костей и если они одинаковы значит анимация зацикленная.
2) На этот вопрос я не могу ответить ибо не знаю ответа.
(Offline)
 
Ответить с цитированием
Старый 02.03.2013, 15:06   #11
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Mecanim

Any State символизирует любое состояние. Т.е. если в какое-то состояние можно прийти из любого другого, то можно просто провести одну стрелку из AnyState. Наделе я так не смог сделать т.к. начинались проигрываться сразу несколько анимаций.

Direction возможно лучше сглаживать так
animator.SetFloat("Direction", direction, 0.25f, Time.deltaTime);
(Offline)
 
Ответить с цитированием
Старый 05.03.2013, 11:36   #12
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: Mecanim

Этот граф можно упростить до такого:




и просто передаем direction от -180 до 180
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
WISHMASTER35 (06.03.2013)
Старый 09.03.2013, 21:57   #13
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Mecanim

pax, попробовал твой граф. Не уверен, что Blend Tree тут вообще уместен.
Переходы с одной анимации на другую очень резкие, заметны рывки.
Обычная смена анимаций происходит со сглаживанием.
А тут если между Forward-Right еще можно сделать сглаживание путем плавного изменения Direction, то между Forward-Backward, Right-Left уже никак.
Или я чего-то не знаю?
(Offline)
 
Ответить с цитированием
Старый 09.03.2013, 21:59   #14
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: Mecanim

Посмотри пример управления роботом в примерах меканима.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 09.03.2013, 23:21   #15
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Mecanim

Ты про MineBot? Глянул, ничего особенного там не вижу. Да и в такой модели не заметишь каких-то подергиваний. Он, кстати, по диагонали бегает быстрее))
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 22:58.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com