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; |
Ответ: Mecanim
Что должно получиться в итоге: Онлайн
|
Ответ: Mecanim
Цитата:
|
Ответ: Mecanim
Цитата:
|
Ответ: Mecanim
Откуда скрипт берет что нажата W,A,S,D??? В листинге не вижу.
За тутор спасибо большое. |
Ответ: Mecanim
Цитата:
|
Ответ: Mecanim
Хороший урок, но не нравится мне, что переход с одного направления в противоположное происходит через idle анимацию.
pie, можешь это исправит? |
Ответ: Mecanim
WISHMASTER35, А мне кажется что это правильно. Ты попробуй в жизни двигаясь в одну сторону резко начать двигаться в противоположную. У тебя все равно будет отрезок где ты остановишься.
|
Ответ: Mecanim
pie, остановлюсь, но руки поднимать не буду. Меня поднятие рук раздражало.
Можешь помочь с парой вопросов. 1) я читал это http://docs.unity3d.com/Documentatio...ationClip.html но не очень понимаю как работает импорт. и что то за цветные кружки. Можешь рассказать что там к чему? И не понятно почему с одной анимацией работает гравитация, а с другой нет. 2) Для чего в графе этот Any State? И почему в него нельзя добавить анимацию, ведь это такой же State как и те, что с анимациями? |
Ответ: Mecanim
Я сам до конца не разобрался с этой системой. Только поверхностно по зарубежным урокам.
1) Как я понял зеленая обозначает что анимация поддерживает тот или иной вариант. Например Loop Pose: видимо система сравнивает начальное и конечное положение костей и если они одинаковы значит анимация зацикленная. 2) На этот вопрос я не могу ответить ибо не знаю ответа. |
Ответ: Mecanim
Any State символизирует любое состояние. Т.е. если в какое-то состояние можно прийти из любого другого, то можно просто провести одну стрелку из AnyState. Наделе я так не смог сделать т.к. начинались проигрываться сразу несколько анимаций.
Direction возможно лучше сглаживать так animator.SetFloat("Direction", direction, 0.25f, Time.deltaTime); |
Ответ: Mecanim
Этот граф можно упростить до такого:
и просто передаем direction от -180 до 180 |
Ответ: Mecanim
pax, попробовал твой граф. Не уверен, что Blend Tree тут вообще уместен.
Переходы с одной анимации на другую очень резкие, заметны рывки. Обычная смена анимаций происходит со сглаживанием. А тут если между Forward-Right еще можно сделать сглаживание путем плавного изменения Direction, то между Forward-Backward, Right-Left уже никак. Или я чего-то не знаю? |
Ответ: Mecanim
Посмотри пример управления роботом в примерах меканима.
|
Ответ: Mecanim
Ты про MineBot? Глянул, ничего особенного там не вижу. Да и в такой модели не заметишь каких-то подергиваний. Он, кстати, по диагонали бегает быстрее))
|
Часовой пояс GMT +4, время: 11:08. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot