Как сделать анимации для unity3d


Как сделать анимации для unity3d

Как сделать анимации для unity3d

Как сделать анимации для unity3d



Система анимации Unity (Unity's Animation System) дает прекрасную возможность анимировать заскиненных (skinned) персонажей. Система анимации поддерживает смешивание анимаций ( blending), миксинг (mixing), добавочные анимации (additive animations), синхронизацию времени цикла ходьбы, слои анимации (animation layers), контроль над всеми аспектами воспроизведения анимации (время, скорость, веса смешивания (blend-weights)), меш скининг(mesh skinning) с 1, 2 или 4 костями на вершину и наконец физически обоснованый ragdolls.

There are some best practices for creating a rigged character with optimal performance in Unity. It is recommended that you read about these techniques on the page.

Создание анимированного персонажа включает в себя два вопроса: перемещение (moving) его в мире и анимацию (animating).

Эта страница сфокусирована на анимации. Если хотите побольше узнать о перемещении персонажей (для игр типа Super Mario или для шутеров от первого лица), посмотрите эту страницу — .

Если хотите, можете начать сразу с одной из интересующих вас тем:

Можно загрузить показывающий предварительную настройку анимации.

Importing The Animations

Во-первых, нам надо импортировать персонажа. Unity поддерживает импорт из Maya (.mb или .ma), Cinema 4D (.c4d), а также импорт fbx-файлов, которые можно экспортировать из наиболее известных 3D пакетов. .

Importing Animations using Animation Splitting

Аниматром удобнее иметь одну единственную модель, содержащую все анимации. Импортируя анимируемую модель, вы можете определить, какие кадры (frames) составляют каждую часть анимации. Unity автоматически порежет (split) анимацию на отдельные части, называемые клипами анимации (Animation Clips).

К примеру :

  • анимация шага в течение кадров 1 - 33
  • анимация бега в течение кадров 41 - 57
  • анимация удара в течение кадров 81 - 97

Для импорта анимации нужно просто разместить модель в папке Assets проекта. Unity автоматически импортирует её. Выделите новый ресурс в Project View и отредактируйте настройки импорта в Inspector.


Настройки импорта меша.

В таблице Split Animations вы указываете Unity, какие кадры в файле составляют каждый анимационный клип. Имена, присваиваемые им, используются в дальнейшем для их вызова (активации).

name Имя анимационного клипа. first frame Первый кадр анимационного клипа. Соответствует кадру в 3D-пакете. last frame Последний кадр анимационного клипа. loop frame Если включено, то в конце анимации будет вставлен дополнительный кадр, соответствующий первому кадру анимации. Используется в случаях, когда нужно «закольцевать» анимацию, но первый и последний кадры не совпадают.

Importing Animations using multiple model files

Другой способ импорта анимации состоит в создании отдельных файлов для каждой анимации. Файлам присваиваются имена по шаблону 'model name'@'animation name'.fbx


Четыре файла с анимациями.

Unity автоматически импортирует все четыре файла и поместит каждую анимацию в отдельный файл, без объединения в один. В примере к файлу goober.mb автоматически добавятся анимации idle, jump, walk и wallJump.

Importing Inverse Kinematics

Когда импортируется анимированный персонаж из Maya c использованием IK, нужно активировать опцию Bake IK & simulation в настройках импорта. Иначе, персонаж не анимируется корректно.

Bringing the character into the Scene

Для помещения в сцену достаточно перетащить модель из Project view в Scene View или Hierarchy.


Анимированный персонаж добавлен в сцену перетаскиванием.

У приведённого выше персонажа есть три анимации в списке анимаций и нет стандартной анимации («анимации по умолчинаю»). Вы можете добавить больше анимаций к персонажу, перетаскивая анимационные клипы из Project View на персонажа (в Hierarchy или в Scene View). Это также установит стандартную анимацию. Когда вы нажмете Play, будет вопроизводиться стандартная анимация.

TIP: Вы можете использовать простой тест для проверки правильности воспроизведения анимации. Просто используйте Wrap Mode чтобы посмотреть различные способы анимации, особенно зацикливание.

Animating the Character

Анимация персонажа реализована в Unity через интерфейс скриптинга (scripting interface).

Animation Blending

В современных играх смешивание (blending) анимаций — важная деталь, которая гарантирует, что персонажи используют плавные (smooth) анимации. Аниматоры создают отдельные анимации, например цикл ходьбы, бега, ожидания (idle), выстрела (shoot ). В любой момент в вашей игре вы должны быть в состоянии перейти от анимации ожидания к циклу ходьбы и наоборот. Конечно, вы не хотите внезапных скачков в движении, вы хотите анимацию с плавными переходами.

В Unity у вас может быть любое количество анимаций, наложеных на один персонаж. Все анимации смешаны или соединены вместе для получения заключительной анимации.

Наш первый шаг - это создание плавного смешивания (blending) между анимацией ожидания и анимациями ходьбы . Чтобы сделать скриптинг более простым, мы сначала установим Wrap Mode анимации в значение Loop. Потом отключить Play Automatically, чтобы удостовериться, что наш скрипт — только одно воспроизведения анимации.

Наш первый скрипт для анимирования персонажа очень прост; мы только нуждаемся в некотором способе обнаружения того, как быстро наш персонаж перемещается, и затем сделаем затухание между ходьбой и ожиданием. Для этого простого теста мы используем входные предустановки(pre-setup) осей.

function Update () { if (Input.GetAxis("Vertical") > 0.2) animation.CrossFade ("walk"); else animation.CrossFade ("idle"); }

Чтобы запустить этот скрипт:

  1. Создайте javascript: Assets->Create Other->Javascript.
  2. Скопируйте в него наш код.
  3. Перетащите скрипт на персонажа.

Когда вы нажмете кнопку Play, персонаж будет идти при удерживании клавиши "стрелка вверх" и возвращаеться к позе idle, когда клавиша отпущена.

Animation Layers

Слои - невероятно полезная концепция, которая позволяет группировать анимации и расставляться приоритеты.

В Unity animation system, вы можете смешаться сколько угодно анимационных клипов. Вы можете назначить веса смешивания вручную или просто использовать animation.CrossFade(), что позволит установить веса анимаций атоматически.

Blend weights are always normalized before being applied

Let's say you have a walk cycle and a run cycle, both have a weight of 1 (100%). When Unity generates the final animation it will normalize the weights, which means walk will contribute 50% to the animation, the run cycle will also contribute 50%.

This is all very nice, but often you want to prioritize which animation receives most weight when there are two animations playing. Surely you could just make sure that the weight sums up to 100% manually, but it is a lot easier to use layers for this purpose.

Layering Example

Например, у вас есть анимация выстрела (shoot), ожидания (idle) и цикл ходьбы (walk cycle). Вы хотите сделать плавный переход между ходьбой и ожиданием, основанный на скорости игрока. Но когда игрок делает выстрел, вы хотите только лишь показать анимацию стрельбы. Таким образом у анимации стрельбы по существу есть более высокий приоритет.

The easiest way to do this is to simply keep playing the walk and idle animations while shooting. Then we need to make sure that the shoot animation is in a higher layer than idle and walk. This means the shoot animation will receive blend weights first. The walk and idle animation will receive weights only if the shoot animation doesn't use all of the 100% blend weights. So when CrossFading the shoot animation in, the weight will start out at zero and over a short period become 100%. In the beginning the walk and idle layer will still receive blend weights but when the shoot animation is completely faded in, they will receive no weights at all. This is exactly what we need!

function Start () { // Set all animations to loop animation.wrapMode = WrapMode.Loop; // except shooting animation["shoot"].wrapMode = WrapMode.Once; // Put idle and walk into lower layers (The default layer is always 0) // This will do two things // - Since shoot and idle/walk are in different layers they will not affect // each other's playback when calling CrossFade. // - Since shoot is in a higher layer, the animation will replace idle/walk // animations when faded in. animation["shoot"].layer = 1; // Stop animations that are already playing //(In case user forgot to disable play automatically) animation.Stop(); } function Update () { // Based on the key that is pressed, // play the walk animation or the idle animation if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1) animation.CrossFade("walk"); else animation.CrossFade("idle"); // Shoot if (Input.GetButtonDown ("Fire1")) animation.CrossFade("shoot"); }

By default the animation.Play() and animation.CrossFade() will stop or fade out animations that are in the same layer. This is exactly what we want in most cases. In our shoot, idle, run example, playing idle and run will not affect the shoot animation and vice versa (you can change this behaviour with an optional parameter to animation.CrossFade if you like).

Additive Animations and Animation Mixing

Additive Animations and Animation mixing allow you to cut down on the number of animations you have to create for your game, and are important for creating facial animations.

Допустим, вы создаёте персонажа, который наклоняется в сторону при беге и поворачивается.

У вас уже есть циклы ходьбы и бега, теперь же надо создать отдельные анимации: walk-lean-left, walk-lean-right, run-lean-left, run-lean-right animations.

Это означает увеличения объёма работа в 4 раза! Но создание огромного количества анимаций не является обязательным. Additive animations and Mixing to the rescue!

Additive Animation Example

Additive animations allow you to overlay the effects of animation on top of any others that may be playing. When making additive animations, Unity will calculate the difference between the first frame in the animation clip and the current frame. Then it will apply this difference on top of all other playing animations.

Now you only have to make a lean-left and lean-right animation. Unity will then layer this animation on top of the walk, idle or run cycle.

Here is the code to make that happen:

private var leanLeft : AnimationState; private var leanRight : AnimationState; function Start () { leanLeft = animation["leanLeft"]; leanRight = animation["leanRight"]; // Put the leaning animation in a seperate layer // So that other calls to CrossFade won't affect it. leanLeft.layer = 10; leanRight.layer = 10; // Set the lean animation to be additive leanLeft.blendMode = AnimationBlendMode.Additive; leanRight.blendMode = AnimationBlendMode.Additive; // Set the lean animation ClampForever // With ClampForever animation's will not automatically // stop when reaching the end of the clip leanLeft.wrapMode = WrapMode.ClampForever; leanRight.wrapMode = WrapMode.ClampForever; // Enable the animation and fade it in completely // We don't use animation.Play here because we manually adjust the time // in the Update function. // Instead we just enable the animation and set it to full weight leanRight.enabled = true; leanLeft.enabled = true; leanRight.weight = 1.0; leanLeft.weight = 1.0; // For testing just play run animation and loop it animation["walk"].wrapMode = WrapMode.Loop; animation.Play("walk"); } // Every frame just set the normalized time // based on how much lean we want to apply function Update () { var lean = Input.GetAxis("Horizontal"); // normalizedTime is 0 at the first frame and 1 at the last frame in the clip leanLeft.normalizedTime = -lean; leanRight.normalizedTime = lean; }

Tip: When using Additive animations it is critical that you are also playing some other non-additive animation on every transform that is also used in the additive animation, otherwise the animations will add on top of the last frame's result. This is most certainly not what you want.

Procedurally animating characters

Иногда нужно анимировать кости персонажа процедурно. Например, нужно, чтобы голова персонажа смотрела в определенную точку в трехмерном мире. Это лучше всего сделать скриптом. К счастью, Unity делает это очень легко. In Unity all bones are just Transforms which drive the skinned mesh. Thus you can script bones of a character just like any other GameObject.

Важная вещь — знать что система анимации использует Transforms после функции Update() и перед функцией LateUpdate() . Thus if you want to do a LookAt() function you should do that in LateUpdate() to make sure that you are really overriding the animation.

Ragdolls созданы таким же образом. Вы просто должны приложить Rigidbodies, Character Joints и Capsule Colliders к различным костям. Тогда это будет ваш физически анимированный, заскиненный персонаж.

Finally

Вы можете посмотреть как сделать основные анимации персонаа в Для более глубокого изучения смотрите .


Источник: http://docs.unity3d.ru/Manual/Character-Animation.html


Как сделать анимации для unity3d фото


Как сделать анимации для unity3d

Как сделать анимации для unity3d

Как сделать анимации для unity3d

Как сделать анимации для unity3d

Как сделать анимации для unity3d

Как сделать анимации для unity3d

Как сделать анимации для unity3d

Читать топ новости: