Система анимации Unity позволяет создавать прекрасно анимированных персонажей со скинами. Система анимации поддерживает смешивание, микширование, аддитивную анимацию, синхронизацию времени цикла ходьбы, слои анимацииСлой анимации содержит конечный автомат анимации. который управляет анимацией модели или ее части. Например, если у вас есть слой всего тела для ходьбы или прыжков и более высокий слой для движений верхней части тела, таких как метание предмета или стрельба. Высшие слои имеют приоритет в отношении частей тела, которыми они управляют. Подробнее
Смотрите в Словарь, управляйте всеми аспектами анимации воспроизведение (время, скорость, бленд-веса), сеткаОсновной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
См. в Словарь skinningПроцесс привязки соединений костей к вершинам меша или «кожи» персонажа. Выполняется с помощью внешнего инструмента, такого как Blender или Autodesk Maya. Подробнее
См. в Словарь с 1, 2 или 4 костями на вершину, а также поддерживающими физически обоснованные тряпичные куклы и процедурная анимация. Чтобы получить наилучшие результаты, рекомендуется прочитать о передовых методах и методах создания сфальсифицированного персонажа с оптимальной производительностью в Unity на странице Моделирование оптимизированных персонажей.
Создание анимированного персонажа включает в себя две вещи. перемещение его по миру и анимация соответствующим образом. Если вы хотите узнать больше о перемещении персонажей, загляните на страницу контроллера персонажей. Эта страница посвящена анимации. Фактическая анимация персонажей выполняется через скриптовый интерфейс Unity.
Вы можете загрузить демонстрационные примеры, демонстрирующие предварительно настроенных анимированных персонажей. Изучив основы на этой странице, вы также сможете увидеть интерфейс сценария анимации.
Смешение анимации
В современных играх смешивание анимаций является важной функцией, обеспечивающей плавную анимацию персонажей. Аниматоры создают отдельные анимации, например, цикл ходьбы, цикл бега, анимацию бездействия или анимацию стрельбы. В любой момент во время игры вы должны иметь возможность перейти от анимации бездействия к циклу ходьбы и наоборот. Естественно, вы хотите, чтобы переход был плавным и чтобы в движении не было резких рывков.
Здесь вступает в действие смешивание анимаций. В Unity вы можете иметь любое количество анимаций, воспроизводимых на одном персонаже. Все анимации смешиваются или добавляются вместе для создания окончательной анимации.
Нашим первым шагом будет создание плавного перехода персонажа между анимацией бездействия и ходьбы. Чтобы упростить работу сценариста, мы сначала установим Режим переноса анимации на Цикл. Затем мы отключим Автоматическое воспроизведение, чтобы убедиться, что анимация воспроизводится только нашим скриптом.
Наш первый скрипт для анимации персонажа довольно прост; нам нужен только какой-то способ определить, насколько быстро движется наш персонаж, а затем переходить от анимации ходьбы к анимации бездействия. Для этого простого теста мы будем использовать стандартные оси ввода:-
function Update () {
if (Input.GetAxis("Vertical") > 0.2)
animation.CrossFade ("walk");
else
animation.CrossFade ("idle");
}
Чтобы использовать этот скрипт в своем проекте:-
- Создайте файл Javascript, используя Ресурсы > Создать > Javascript.
- Скопируйте и вставьте в него код
- Перетащите сценарий на персонажа (его необходимо прикрепить к GameObjectфундаментальному объекту в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и т. д. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь, где есть анимация)
Когда вы нажмете кнопку "Воспроизвести", персонаж начнет ходить на месте, если вы будете удерживать клавишу со стрелкой вверх, и вернется в исходную позу, когда вы ее отпустите.
Слои анимации
Слои – невероятно полезная концепция, позволяющая группировать анимации и расставлять приоритеты.
Система анимации Unity может смешивать столько анимационных клиповданные анимации, сколько можно использовать для анимированных персонажей или простых анимаций. Это простое «единичное» движение, такое как (один конкретный пример) «Простояние», «Ходьба» или «Бег». Подробнее
Смотрите в Словарь, как хотите. Вы можете назначить веса смешения вручную или просто использовать animation.CrossFade(), который автоматически анимирует вес.
Вес смешивания всегда нормализуется перед применением
Допустим, у вас есть цикл ходьбы и цикл бега, оба имеют вес 1 (100%). Когда Unity создаст окончательную анимацию, она нормализует веса, что означает, что цикл ходьбы будет составлять 50 % анимации, а цикл бега — 50 %.
Однако при воспроизведении двух анимаций, как правило, следует отдавать приоритет тому, какая анимация получает наибольший вес. Конечно, можно вручную добиться того, чтобы вес суммировался до 100%, но проще использовать для этой цели слои.
Пример слоев
Например, у вас может быть анимация стрельбы, бездействие и цикл ходьбы. Анимации ходьбы и бездействия будут смешаны в зависимости от скорости игрока, но когда игрок стреляет, вы захотите показать только анимацию выстрела. Таким образом, анимация стрельбы имеет более высокий приоритет.
Самый простой способ сделать это — просто продолжать проигрывать анимации ходьбы и бездействия во время стрельбы. Для этого нам нужно убедиться, что анимация выстрела находится на более высоком уровне, чем анимация бездействия и ходьбы, что означает, что анимация выстрела сначала получит смешанные веса. Анимации ходьбы и бездействия получат веса только в том случае, если анимация стрельбы не использует все 100% веса смешения. Таким образом, при кроссфейдинге анимации съемки вес будет начинаться с нуля и через короткий промежуток времени станет равным 100%. В начале слой ходьбы и бездействия по-прежнему будут получать смешанные веса, но когда анимация стрельбы полностью исчезнет, они вообще не получат весов. Это именно то, что нам нужно!
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");
}
По умолчанию animation.Play() и animation.CrossFade() останавливают или затемняют анимации, находящиеся в одном слое. Это именно то, что мы хотим в большинстве случаев. В нашем примере «стреляй, бездействуй, беги» воспроизведение бездействия и бега не повлияет на анимацию стрельбы и наоборот (вы можете изменить это поведение с помощью дополнительного параметра на animation.CrossFade, если хотите).
Сведение анимации
Смешивание анимаций позволяет сократить количество анимаций, которые необходимо создать для игры, за счет применения некоторых анимаций только к части тела. Это означает, что такие анимации можно использовать вместе с другими анимациями в различных комбинациях.
Вы добавляете преобразование микширования анимации в анимацию, вызывая AddMixingTransform() для заданного AnimationState.
Пример микширования
Примером микширования может быть что-то вроде анимации взмаха рукой. Возможно, вы захотите заставить махать рукой либо когда персонаж бездействует, либо когда он идет. Без микширования анимации вам пришлось бы создавать отдельные анимации взмахов рук для состояний бездействия и ходьбы. Однако, если вы добавите преобразование плеча в качестве преобразования микширования к анимации взмаха руки, анимация взмаха рукой будет иметь полный контроль только от плечевого суставаФизический компонент, обеспечивающий динамическую связь между компонентами Rigidbody, обычно допускающий некоторую степень движения, например шарнир. Подробнее
См. в Словарь к руке. Поскольку остальная часть тела не будет затронута взмахом руки, она продолжит воспроизводить анимацию бездействия или ходьбы. Следовательно, для взмаха рукой требуется только одна анимация, в то время как остальная часть тела использует анимацию бездействия или ходьбы.
/// Adds a mixing transform using a Transform variable
var shoulder : Transform;
animation["wave_hand"].AddMixingTransform(shoulder);
Еще один пример использования пути.
function Start () {
// Adds a mixing transform using a path instead
var mixTransform : Transform = transform.Find("root/upper_body/left_shoulder");
animation["wave_hand"].AddMixingTransform(mixTransform);
}
Аддитивная анимация
Аддитивная анимация и микширование анимаций позволяют сократить количество анимаций, которые необходимо создать для игры, и очень важны для создания лицевых анимаций.
Предположим, вы хотите создать персонажа, который наклоняется в стороны при поворотах при ходьбе и беге. Это приводит к четырем комбинациям (ходьба-наклон влево, ходьба-наклон-направо, бег-наклон налево, бег-наклон-направо), каждая из которых нуждается в анимации. Создание отдельной анимации для каждой комбинации явно требует много дополнительной работы даже в этом простом случае, но количество комбинаций резко увеличивается с каждым дополнительным действием. К счастью, аддитивная анимация и микширование избавляют от необходимости создавать отдельные анимации для комбинаций простых движений.
Пример аддитивной анимации
Аддитивные анимации позволяют накладывать эффекты одной анимации поверх любых других, которые могут воспроизводиться. При создании аддитивной анимации Unity будет вычислять разницу между первым кадром в анимационном клипе и текущим кадром. Затем эта разница будет применена поверх всех остальных анимаций воспроизведения.
Ссылаясь на предыдущий пример, вы можете сделать анимацию для наклона вправо и влево, и Unity сможет накладывать ее на ходьбу, бездействие или цикл бега. Этого можно добиться с помощью следующего кода: -
private var leanLeft : AnimationState;
private var leanRight : AnimationState;
function Start () {
leanLeft = animation["leanLeft"];
leanRight = animation["leanRight"];
// Put the leaning animation in a separate 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 animations will not stop
// automatically 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 "walk" 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;
}
Совет. При использовании аддитивных анимаций очень важно, чтобы вы также воспроизводили какую-либо другую неаддитивную анимацию при каждом преобразовании, которое также используется в аддитивной анимации, иначе анимации будут добавляться поверх результат последнего кадра. Это определенно не то, что вам нужно.
Процедурная анимация персонажей
Иногда вы хотите процедурно анимировать кости вашего персонажа. Например, вы можете захотеть, чтобы голова вашего персонажа смотрела на определенную точку в трехмерном пространстве, что лучше всего обрабатывается сценарием, который отслеживает целевую точку. К счастью, Unity делает это очень просто, поскольку кости — это просто преобразования, которые управляют скелетным мешем. Таким образом, вы можете управлять костями персонажа из скрипта так же, как преобразованиями игрового объекта.
Важно знать, что система анимации обновляет Transforms после функции Update() и до функции LateUpdate(). Таким образом, если вы хотите использовать функцию LookAt(), вы должны сделать это в LateUpdate(), чтобы убедиться, что вы действительно переопределяете анимацию.
Рэгдоллы создаются таким же образом. Вам просто нужно прикрепить Жесткие телаКомпонент, который позволяет воздействовать на игровой объект смоделированной гравитацией и другими силами. Подробнее
См. в Словарь, Символьные суставыРасширенный шаровой шарнир, который позволяет ограничить сустав по каждой оси. В основном используется для эффектов Ragdoll. Подробнее
См. в Словарь и Capsule КоллайдерыНевидимая форма, используемая для обработки физических столкновений объекта. Коллайдер не обязательно должен быть точно такой же формы, как сетка объекта — грубое приближение часто бывает более эффективным и неразличимым в игровом процессе. Подробнее
Посмотрите в Словарь различные кости. Затем это физически оживит вашего персонажа со скинами.
Воспроизведение анимации и выборка
В этом разделе объясняется, как анимация в Unity сэмплируется при воспроизведении движком.
Анимационные клипы обычно создаются с фиксированной частотой кадров. Например, вы можете создать анимацию в Autodesk® 3ds Max® или Autodesk® Maya® с частотой кадров 60 кадров в секундуЧастота, с которой отображаются последовательные кадры в запущенной игре. Подробнее
См. в Словарь (fps). При импорте анимации в Unity эта частота кадров будет считываться импортером, поэтому данные импортированной анимации также будут сэмплированы с частотой 60 fpsСм. шутер от первого лица, кадров в секунду.
См. в Словарь.
Однако игры обычно работают с переменной частотой кадров. Частота кадров может быть выше на некоторых компьютерах, чем на других, а также может варьироваться от одной секунды к другой в зависимости от сложности просмотра камерыКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
See in Словарь смотрит в любой момент. В основном это означает, что мы не можем делать никаких предположений о точной частоте кадров, с которой работает игра. Это означает, что даже если анимация создана с частотой 60 кадров в секунду, она может воспроизводиться с другой частотой кадров, например 56,72 кадра в секунду, 83,14 кадра в секунду или практически с любым другим значением.
Поэтому Unity должна сэмплировать анимацию с переменной частотой кадров и не может гарантировать частоту кадров, для которой она изначально была разработана. К счастью, анимация для трехмерной компьютерной графики состоит не из отдельных кадров, а из непрерывных кривых. Эти кривые можно сэмплировать в любой момент времени, а не только в те моменты времени, которые соответствуют кадрам исходной анимации. На самом деле, если игра работает с более высокой частотой кадров, чем была создана анимация, анимация в игре будет выглядеть более плавной и плавной, чем в программе для анимации.
Для большинства практических целей вы можете игнорировать тот факт, что Unity сэмплирует анимацию с переменной частотой кадров. Однако если у вас есть игровая логика, основанная на анимации, которая анимирует преобразования или свойства в очень специфических конфигурациях, вам нужно знать, что повторная выборка происходит за сценамиСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь. Например, если у вас есть анимация, которая поворачивает объект от 0 до 180 градусов в течение 30 кадров, и вы хотите узнать из своего кода, когда она достигла половины этого пути, вам не следует делать это с помощью условного оператора в вашем коде. который проверяет, составляет ли текущий поворот 90 градусов. Поскольку Unity сэмплирует анимацию в соответствии с переменной частотой кадров в игре, она может сэмплировать ее, когда угол поворота чуть меньше 90 градусов, а в следующий раз — сразу после достижения 90 градусов. Если вам необходимо получать уведомления о достижении определенного момента в анимации, вместо этого следует использовать AnimationEvent.
Также обратите внимание, что из-за выборки с переменной частотой кадров анимация, воспроизводимая с использованием WrapMode.Once, может не сэмплироваться в точное время последнего кадра. В одном кадре игры анимация может быть сэмплирована непосредственно перед окончанием анимации, а в следующем кадре время может превысить длину анимации, поэтому она отключена и больше не сэмплируется. Если вам абсолютно необходимо точное сэмплирование последнего кадра анимации, вы должны использовать WrapMode.ClampForever, который будет бесконечно сэмплировать последний кадр, пока вы сами не остановите анимацию.