forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Уроки (http://forum.boolean.name/forumdisplay.php?f=145)
-   -   Mecanim (http://forum.boolean.name/showthread.php?t=17708)

pie 02.01.2013 20:11

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:45

Ответ: Mecanim
 
Что должно получиться в итоге: Онлайн

pax 03.01.2013 15:17

Ответ: Mecanim
 
Цитата:

Сообщение от pie (Сообщение 248147)
Что должно получиться в итоге: Онлайн

Глючит, часто не бижит в нужную сторону (особенно в бок), а иногда бежит и не выключается анимация

pie 03.01.2013 15:34

Ответ: Mecanim
 
Цитата:

Сообщение от pax (Сообщение 248159)
Глючит, часто не бижит в нужную сторону (особенно в бок), а иногда бежит и не выключается анимация

Ты прав. Не было одной связи. Исправил, пере залил.

Fatalix3d 08.01.2013 09:14

Ответ: Mecanim
 
Откуда скрипт берет что нажата W,A,S,D??? В листинге не вижу.
За тутор спасибо большое.

is.SarCasm 08.01.2013 12:21

Ответ: Mecanim
 
Цитата:


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

anim.SetFloat("Speed", v);
anim.SetFloat("Direction", h);
anim.speed = animSpeed;
Вот же

WISHMASTER35 24.02.2013 21:19

Ответ: Mecanim
 
Хороший урок, но не нравится мне, что переход с одного направления в противоположное происходит через idle анимацию.
pie, можешь это исправит?

pie 26.02.2013 23:51

Ответ: Mecanim
 
WISHMASTER35, А мне кажется что это правильно. Ты попробуй в жизни двигаясь в одну сторону резко начать двигаться в противоположную. У тебя все равно будет отрезок где ты остановишься.

WISHMASTER35 27.02.2013 00:20

Ответ: Mecanim
 
pie, остановлюсь, но руки поднимать не буду. Меня поднятие рук раздражало.
Можешь помочь с парой вопросов.
1) я читал это http://docs.unity3d.com/Documentatio...ationClip.html но не очень понимаю как работает импорт. и что то за цветные кружки. Можешь рассказать что там к чему?
И не понятно почему с одной анимацией работает гравитация, а с другой нет.
2) Для чего в графе этот Any State? И почему в него нельзя добавить анимацию, ведь это такой же State как и те, что с анимациями?

pie 27.02.2013 00:32

Ответ: Mecanim
 
Я сам до конца не разобрался с этой системой. Только поверхностно по зарубежным урокам.
1) Как я понял зеленая обозначает что анимация поддерживает тот или иной вариант. Например Loop Pose: видимо система сравнивает начальное и конечное положение костей и если они одинаковы значит анимация зацикленная.
2) На этот вопрос я не могу ответить ибо не знаю ответа.

WISHMASTER35 02.03.2013 19:06

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

Direction возможно лучше сглаживать так
animator.SetFloat("Direction", direction, 0.25f, Time.deltaTime);

pax 05.03.2013 15:36

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




и просто передаем direction от -180 до 180

WISHMASTER35 10.03.2013 01:57

Ответ: Mecanim
 
pax, попробовал твой граф. Не уверен, что Blend Tree тут вообще уместен.
Переходы с одной анимации на другую очень резкие, заметны рывки.
Обычная смена анимаций происходит со сглаживанием.
А тут если между Forward-Right еще можно сделать сглаживание путем плавного изменения Direction, то между Forward-Backward, Right-Left уже никак.
Или я чего-то не знаю?

pax 10.03.2013 01:59

Ответ: Mecanim
 
Посмотри пример управления роботом в примерах меканима.

WISHMASTER35 10.03.2013 03:21

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


Часовой пояс GMT +4, время: 11:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot