unity как анимировать персонажа
Как сделать 2D-анимацию в Unity с минимумом кода: кадры и скрипты
Инди-играм может не хватать визуальной привлекательности. Разбираемся, как оживить персонажей и фоны с помощью самой простой анимации.
Что можно анимировать в Unity
Анимация позволяет оживить игру даже с самой примитивной графикой. Например, персонаж для игры из этой статьи выглядит вот так:
Пишет о разработке сайтов, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
В нём нет ничего привлекательного, это набор простых фигур. Посмотрите, как он изменится, если добавить анимацию:
Теперь персонаж стал чуть более живым и даже забавным — на него гораздо приятнее смотреть, хотя внешне он не изменился.
С помощью анимации можно оживить и фоны. Например, сделать:
Анимацию добавляют и в интерфейсы: переливающиеся шкалы здоровья, поблёскивающие кнопки. Даже вращающаяся шестерёнка вместо простой надписи «Загрузка…» украсит проект.
Мини-игра к этой статье и все ассеты выложены в репозитории на GitHub. Если хотите научиться делать игры с нуля, рекомендуем записаться на курс «Профессия разработчик игр на Unity».
Анимация «из коробки» в Unity
В Unity создают анимацию с помощью:
Скрипт изменяет параметры объекта при определённых условиях: обновлении масштабов, добавлении цвета и так далее.
Что-то более продвинутое делается с помощью покадровой анимации — когда для разных состояний объекта (стоит, идёт, в прыжке, атакует) создаётся несколько спрайтов (двумерных изображений), которые сменяют друг друга с определённым интервалом.
И чуть более сложное — скелеты. Они позволяют использовать один спрайт, а потом приводить его в движение, изменяя положение отдельных частей.
Мы рассмотрим только скриптовую и покадровую анимацию в Unity, потому что для скелетной требуются специальные ассеты, и она куда сложнее.
Анимация вращения с помощью скрипта в Unity
Когда вы создаёте персонажа и добавляете ему спрайт, а потом управляете им, герой всегда смотрит в одну и ту же сторону, даже если движется в другую.
Исправить, создав отзеркаленную версию спрайтов, — не лучший вариант, потому что придётся делать лишнюю работу. Правильнее написать скрипт, который вращает объект.
Скриптинг анимации (Legacy)
Система анимации в Unity позволяет создавать великолепно анимированных персонажей. Она поддерживает блендинг, микширование, сложение анимаций, синхронизацию цикла ходьбы, анимационные слои, контроль всех аспектов проигрывания (время, скорость, веса блендинга), скиннинг мешей с 1, 2 или 4 костями на вершину, а также основанные на физике rag-dolls (тряпичные куклы) и процедурную анимацию. Для получения лучших результатов, рекомендуется почитать о практических подходах и принципах создания персонажей с оптимальной производительностью в Unity на странице Моделирование оптимизированных персонажей.
Вы можете попробовать примеры показывающие готовую анимацию персонажей. Чуть позже, когда вы освоите базовые вещи, можете взглянуть на описание класса Animation.
Смешивание анимации
В современных играх, смешивание анимации является необходимой функцией для обеспечения персонажа плавными анимациями. Аниматоры создают отдельные анимации, например, цикл ходьбы, цикл бега, анимация в состоянии покоя или стрельбы. В любой момент во время игры, должна быть возможность перехода с анимации спокойствия в цикл ходьбы и обратно. Естественно, вы хотите чтобы этот переход был плавным и без внезапных рывков в движении.
В этом случае смешивание анимации становится полезным. В Unity можно иметь любое количество анимаций, которые проигрываются на одном и том же персонаже. Все анимации смешиваются или складываются вместе для создания окончательной анимации.
Наш первый скрипт для анимации персонажа довольно простой; нам нужен способ для определения скорости движения персонажа, а после этого делать переход между анимациями ходьбы и покоя. Для этого простого теста мы будем использовать стандартные оси ввода:-
Чтобы использовать этот скрипт в вашем проекте:-
После нажатия на кнопку Play, персонаж начнет шагать на месте, пока вы будете удерживать нажатой кнопку со стрелкой вверх, и вернется в позу ожидания, если вы отпустите ее.
Слои анимации
Слои это невероятно полезная концепция, позволяющая классифицировать анимацию и приоритезировать веса.
Веса смешивания всегда нормализуются перед применением
Предположим, что у вас есть цикл ходьбы и цикл бега, имеющие веса, равные 1 (100%). Когда Unity генерирует окончательную анимацию, веса нормализуются, то есть вклад цикла ходьбы составит 50% анимации, и вклад цикла бега также составит 50%.
Типично, вам захочется указать, какая анимация получает больший вес, когда проигрывается две анимации. Конечно, можно вручную убедиться, что веса суммируются в 100%, но легче просто использовать для этого слои.
Пример использования слоев
Самый простой способ добиться этого, это просто продолжать проигрывание анимаций ходьбы и покой во время стрельбы. Чтобы это сделать, нам надо удостовериться, что анимация стрельбы находится в верхнем слое над анимациями покоя и ходьбы, что означает, что анимация стрельбы будет получать веса смешивания в первую очередь. Анимации ходьбы и покой будут получать веса только если анимация стрельбы не использует все 100% веса. Так, когда начинается переход в анимацию стрельбы, вес начнется с нуля, и за короткое время станет 100%. Вначале, слой ходьбы и покоя все еще будет получать веса, но когда полностью закончится переход в анимацию стрельбы – они не получат веса вообще. И это в точности то, что нам нужно!
По умолчанию, animation.Play() и animation.CrossFade() остановят или плавно уберут анимации находящиеся в одном том же слое. Это то что требуется в большинстве случаев. В нашем примере стрельбы, покоя и бега, проигрывание покоя и бега не будет влиять на анимацию стрельбы, и наоборот (если требуется, то это поведение можно изменить опциональным параметром функции animation.CrossFade).
Смешивание анимаций
Смешивание анимаций позволяет урезать количество анимаций, который нужно создать для вашей игры. Это достигается тем, что некоторые анимации влияют только на часть тела. Это значит, что такие анимации могут быть использованы совместно с другими анимациями в разнообразных комбинациях.
Добавление трансформации смешивания анимаций производится вызовом метода AddMixingTransform() имеющегося AnimationState.
Пример смешивания
Другой пример с использованием путей.
Аддитивные (additive) анимации
Аддитивные анимации и технология смешивания анимаций позволяют уменьшить общее количество анимаций, которые вам надо создать для вашей игры, и эти техники также важны для создания лицевой анимации.
Предположим, вам захотелось создать персонажа, который наклоняется в стороны во время поворотов, когда он ходит или бегает. Это приводит к 4 комбинациям (идти-наклоняться-влево, идти-наклоняться-вправо, бежать-наклоняться-влево, бежать-наклоняться-вправо), для каждой из которых нужна анимация. Создание отдельной анимации на каждую комбинацию, очевидно, ведет к множеству дополнительной работы, даже в таком простом случае. Но количество комбинаций увеличивается с каждым добавляемым действием. К счастью, аддитивные анимации и смешивание позволяет избежать необходимости создания отдельных анимаций для комбинаций простых движений.
Пример аддитивной анимации
Аддитивные анимации позволяют накладывать эффекты одной анимации поверх любых других запущенных анимаций. Когда генерируются аддитивные анимации, Unity вычислит разницу между первым и текущим кадрами анимационного клипа. Затем разница применится поверх всех остальных проигрываемых анимаций.
Ссылаясь на предыдущий пример, вы могли бы создать анимации для наклонов вправо и влево, и Unity смог бы наложить их на цикл ходьбы, покоя или бега. Это может быть достигнуто с помощью кода следующим образом:-
Совет: При использовании аддитивных анимаций, очень важно также проигрывать какие-то другие не-аддитивные анимации на каждой трансформации, которая также используется в аддитивной анимации. В противном случае, анимации будут добавляться поверх результата последнего кадра. Это точно не то, что вам нужно.
Процедурная анимация персонажей
Иногда вам понадобится анимировать кости вашего персонажа процедурно. Например, вы хотите чтобы голова вашего персонажа смотрела в определенную точку в 3D пространстве. Это действие лучше всего реализовать с помощью скрипта, который отслеживает целевую точку. К счастью, Unity делает это очень простой задачей, так как кости всего лишь являются трансформациями, которые управляют кожей (skinned mesh). Вы можете управлять костями персонажа из скрипта так же, как трансформациями GameObject.
Тряпичные куклы (Ragdolls) создаются таким же способом. Вам просто требуется добавить компоненты Rigidbody, Character Joint и Capsule Collider к различным костям. Это позволит вам создать анимацию вашего персонажа основанную на физике.
Воспроизведение и cэмплирование анимации
Этот раздел рассказывает о том как в Unity происходит сэмплирование анимации во время ее воспроизведения движком.
Анимационные клипы обычно являются фиксированными по частоте кадров. Например, вы можете создать анимацию в 3ds Max или Maya с частотой 60 кадров в секунду (FPS). При импорте анимации в Unity, частота кадров будет прочитана импортером, так что данные импортируемой анимации также будут 60 кадров в секунду (FPS).
Игры обычно работают с переменной частотой кадров. Частота кадров на вашем компьютере может быть выше, чем на других, и также может меняться из-за сложности отрисовки объектов в поле зрения камеры. В основном, это означает, что мы не можем сделать никаких предположений, с какой частотой кадров будет работать игра. Это значит, что даже если анимация создавалась для 60 кадров в секунду, она может быть воспроизведена на другой частоте кадров – например, 56.72, или 83.14 кадров в секунду, или любой другой.
В результате, Unity должен сэмплировать анимацию с различной частотой кадров, и не может гарантировать частоту кадров, для которой анимация создавалась. К счастью, анимации для 3D графики состоят не из дискретных кадров, а из непрерывных кривых. Так что, если игра выдает большую частоту кадров, чем частота кадров анимации, анимация будет выглядеть плавнее в игре, чем она выглядела в анимационном ПО.
Unity как анимировать персонажа
Нажимаем «Add component>>Physics>>Rigidbody» и «Add component>>Physics>>Capsule Collider». В «Capsule Collider» Выставляем размеры нашей капсулы что бы получилось как на картинке, слегка чуть больше модельки самой. 
В «Rigidbody» ставим галочку «Use gravity». Раскрываем вкладку «Constraints» и ставим все 3 галочки на «Freeze Rotation». Это нужно для того что бы наш персонаж не проваливался сквозь землю, не падал на землю если вдруг окажется на неровности и тому подобное.
Программируем персонажа на перемещение.
Создадим c# скрипт «movePlayer».
200?’200px’:»+(this.scrollHeight+5)+’px’);»> using UnityEngine;
using System.Collections;
public class movePlayer : MonoBehaviour <
private GameObject player; //Переменна объекта персонажа с которым будем работать.
public static int speed = 6; //Скорость перемещения персонажа. Запись public static обозначает что мы сможем обращаться к этой переменной из любого скрипта
public static int _speed; //постоянная скорость перемещения персонажа
public int rotation = 250; //Скорость пповорота персонажа
public int jump = 3; //Высота прыжка
//Поворачиваем персонажа. Так как наша переменная x глобальна, из скрипта камеры в неё будем записывать длину на сколько сместился указатель мыши и по оси X и относительно этого будет повернут наш персонаж
Quaternion rotate = Quaternion.Euler (0,x,0); //Создаем новую переменную типа Quaternion для задавания угла поворота
player.transform.rotation = rotate; //Поворачиваем персонаж
200?’200px’:»+(this.scrollHeight+5)+’px’);»> codeusing UnityEngine;
using System.Collections;
private float x = 0.0f; //Угол поворота по Y?
private float y = 0.0f; //Уго поворота по X?
[AddComponentMenu(«Scripts/Mouse Orbit»)] //Добавляем в меню
public void Start() <
//переворачивам углы
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
if(rigidbody)
rigidbody.freezeRotation = true; //Если камера столкнется с физ.объектомона остановиться
>
y = ClampAngle(y,yMinLimit, yMaxLimit); //Вызыв самописной функции для ограничения углов поврот
movePlayer.x = x;
//Повернуть камеру согласно поченым данным
Quaternion rotation = Quaternion.Euler(y, x, 0);
transform.rotation = rotation;
200?’200px’:»+(this.scrollHeight+5)+’px’);»> using UnityEngine;
using System.Collections;
public class AnimatePlayer : MonoBehaviour <
Animation Scripting (Legacy)
Unity’s Animation System allows you to create beautifully animated skinned characters. The Animation System supports animation blending, mixing, additive animations, walk cycle time synchronization, animation layers, control over all aspects of the animation playback (time, speed, blend-weights), mesh skinning with 1, 2 or 4 bones per vertex as well as supporting physically based rag-dolls and procedural animation. To obtain the best results, it is recommended that you read about the best practices and techniques for creating a rigged character with optimal performance in Unity on the Modeling Optimized Characters page.
Making an animated character involves two things; moving it through the world and animating it accordingly. If you want to learn more about moving characters around, take a look at the Character Controller page. This page focuses on the animation. The actual animating of characters is done through Unity’s scripting interface.
You can download example demos showing pre-setup animated characters. Once you have learned the basics on this page you can also see the animation script interface.
Animation Blending
In today’s games, animation blending is an essential feature to ensure that characters have smooth animations. Animators create separate animations, for example, a walk cycle, run cycle, idle animation or shoot animation. At any point in time during your game you need to be able to transition from the idle animation into the walk cycle and vice versa. Naturally, you want the transition to be smooth and avoid sudden jerks in the motion.
В этом случае смешивание анимации становится полезным. В Unity можно иметь любое количество анимаций, которые проигрываются на одном и том же персонаже. Все анимации смешиваются или складываются вместе для создания окончательной анимации.
Сначала сделаем плавный переход между анимациями спокойствия и ходьбы. Чтобы облегчить работу написания скрипта, сперва нужно изменить Wrap Mode анимации на Loop. Затем нужно отключить Play Automatically для уверенности, что никто, кроме нашего скрипта, не проигрывает анимацию.
Наш первый скрипт для анимации персонажа довольно простой; нам нужен способ для определения скорости движения персонажа, а после этого делать переход между анимациями ходьбы и покоя. Для этого простого теста мы будем использовать стандартные оси ввода:-
Чтобы использовать этот скрипт в вашем проекте:-
После нажатия на кнопку Play, персонаж начнет шагать на месте, пока вы будете удерживать нажатой кнопку со стрелкой вверх, и вернется в позу ожидания, если вы отпустите ее.
Animation Layers
Слои это невероятно полезная концепция, позволяющая классифицировать анимацию и приоритезировать веса.
Система анимации Unity может смешивать несколько анимаций, в соответствие с вашими пожеланиями. Вы можете назначить веса вручную, или просто использовать animation.CrossFade(), который будет анимировать вес автоматически.
Веса смешивания всегда нормализуются перед применением
Let’s say you have a walk cycle and a run cycle, both having a weight of 1 (100%). When Unity generates the final animation, it will normalize the weights, which means the walk cycle will contribute 50% to the animation and the run cycle will also contribute 50%.
However, you will generally want to prioritize which animation receives most weight when there are two animations playing. It is certainly possible to ensure that the weight sums up to 100% manually, but it is easier just to use layers for this purpose.
Layering Example
As an example, you might have a shoot animation, an idle and a walk cycle. The walk and idle animations would be blended based on the player’s speed but when the player shoots, you would want to show only the shoot animation. Thus, the shoot animation essentially has a higher priority.
The easiest way to do this is to simply keep playing the walk and idle animations while shooting. To do this, we need to make sure that the shoot animation is in a higher layer than the idle and walk animations, which means the shoot animation will receive blend weights first. The walk and idle animations will receive weights only if the shoot animation doesn’t use all 100% of the blend weighting. 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!
По умолчанию, animation.Play() и animation.CrossFade() остановят или плавно уберут анимации находящиеся в одном том же слое. Это то что требуется в большинстве случаев. В нашем примере стрельбы, покоя и бега, проигрывание покоя и бега не будет влиять на анимацию стрельбы, и наоборот (если требуется, то это поведение можно изменить опциональным параметром функции animation.CrossFade).
Смешивание анимаций
Смешивание анимаций позволяет урезать количество анимаций, который нужно создать для вашей игры. Это достигается тем, что некоторые анимации влияют только на часть тела. Это значит, что такие анимации могут быть использованы совместно с другими анимациями в разнообразных комбинациях.
Добавление трансформации смешивания анимаций производится вызовом метода AddMixingTransform() имеющегося AnimationState.
Пример смешивания
Another example using a path.
Additive Animations
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.
Suppose you want to create a character that leans to the sides as it turns while walking and running. This leads to four combinations (walk-lean-left, walk-lean-right, run-lean-left, run-lean-right), each of which needs an animation. Creating a separate animation for each combination clearly leads to a lot of extra work even in this simple case but the number of combinations increases dramatically with each additional action. Fortunately additive animation and mixing avoids the need to produce separate animations for combinations of simple movements.
Additive Animation Example
Additive animations allow you to overlay the effects of one animation on top of any others that may be playing. When generating 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.
Referring to the previous example, you could make animations to lean right and left and Unity would be able to superimpose these on the walk, idle or run cycle. This could be achieved with code like the following:-
Совет: При использовании аддитивных анимаций, очень важно также проигрывать какие-то другие не-аддитивные анимации на каждой трансформации, которая также используется в аддитивной анимации. В противном случае, анимации будут добавляться поверх результата последнего кадра. Это точно не то, что вам нужно.
Процедурная анимация персонажей
Иногда вам понадобится анимировать кости вашего персонажа процедурно. Например, вы хотите чтобы голова вашего персонажа смотрела в определенную точку в 3D пространстве. Это действие лучше всего реализовать с помощью скрипта, который отслеживает целевую точку. К счастью, Unity делает это очень простой задачей, так как кости всего лишь являются трансформациями, которые управляют кожей (skinned mesh). Вы можете управлять костями персонажа из скрипта так же, как трансформациями GameObject.
Одна из важных вещей, которую необходимо знать, это то, что анимационная система обновляет трансформации после функции Update(), и до функции LateUpdate(). Поэтому, если вам нужно вызвать функцию LookAt(), следует делать это в LateUpdate(), чтобы удостовериться, что вы на самом деле переопределяете анимацию.
Тряпичные куклы (Ragdolls) создаются таким же способом. Вам просто требуется добавить компоненты Rigidbody, Character Joint и Capsule Collider к различным костям. Это позволит вам создать анимацию вашего персонажа основанную на физике.
Animation Playback and Sampling
This section explains how animations in Unity are sampled when they are played back by the engine.
AnimationClips are typically authored at a fixed frame rate. For example, you may create your animation in Autodesk® 3ds Max® or Autodesk® Maya® at a frame rate of 60 frames per second (fps). When importing the animation in Unity, this frame rate will be read by the importer, so the data of the imported animation is also sampled at 60 fps.
However, games typically run at a variable frame rate. The frame rate may be higher on some computers than on others, and it may also vary from one second to the next based on the complexity of the view the camera is looking at at any given moment. Basically this means that we can make no assumptions about the exact frame rate the game is running at. What this means is that even if an animation is authored at 60 fps, it may be played back at a different framerate, such as 56.72 fps, or 83.14 fps, or practically any other value.
As a result, Unity must sample an animation at variable framerates, and cannot guarantee the framerate for which it was originally designed. Fortunately, animations for 3D computer graphics do not consist of discrete frames, but rather of continuous curves. These curves can be sampled at any point in time, not just at those points in time that correspond to frames in the original animation. In fact, if the game runs at a higher frame rate than the animation was authored with, the animation will actually look smoother and more fluid in the game than it did in the animation software.
Создание персонажей в Blender и Unity
Визуально персонажи 3D-игр имитируются с помощью использования моделей, текстур и анимаций.
В прошлом для применения одинаковых анимаций персонажи должны были иметь полностью идентичные скелеты. Это ограничивало разнообразие персонажей, потому что их рост и пропорции тоже должны были быть одинаковыми. Например, в старых играх FIFA все игроки имели одинаковые размеры, потому что создание отдельного скелета и набора анимаций превратилось бы в настоящий кошмар.
К счастью для разработчиков игр, сегодня большинство движков имеет систему, позволяющую многократно использовать анимации при условии совместимости скелетной иерархии. Такая система позволяет использовать одинаковые анимации для персонажей всех форм и размеров. В Unity эта система называется Mecanim. Она обеспечивает удобную настройку анимаций, смешивание между ними и перенос гуманоидных анимаций между моделями.
Возможность многократного применения анимаций позволяет использовать анимации из Asset store и с таких вебсайтов, как mixamo.com, для ваших собственных персонажей. Это экономит кучу времени!
В этом туториале вы узнаете, как подготовить гуманоидную модель в Blender и как перенести её в Unity. В частности, вы научитесь следующему:
Приступаем к работе
Для прохождения этого туториала вам необходимо следующее:
Откройте папку заготовки (starter) проекта и перейдите в папку Assets\RW\Models. Откройте в Blender файл CuteCharacter.blend.
В файле содержатся следующие данные:
Заметьте, что она отзеркалена по оси X, это сильно упростит весь процесс работы. Справа показано простое изображение загруженной текстуры:
Первый шаг к анимированию этого персонажа — выполнение риггинга.
Создаём риг персонажа
Риггинг — это создание арматуры, скелета модели. У арматуры есть несколько соединённых костей, к которым можно прикрепить вершины, чтобы они двигались при перемещении кости.
Переместите мышь в окно 3D View, чтобы переключить на него фокус. Затем добавьте новую арматуру — удерживайте Shift и нажмите A, чтобы открыть Add Menu. Выберите Armature > Single Bone.
Мы создали арматуру и её самую первую кость, которую также называют корневой костью (root bone). Не снимая выделения с арматуры, найдите в разделе Display вкладки Properties флажок X-Ray и поставьте его.
Теперь арматура будет видна сквозь персонажа. Это упростит создание скелета.
Прежде чем приступать к созданию полной структуры, важно понять, как её нужно настроить для совместимости с Humanoid Avatar движка Unity.
Из-за особенностей привязки костей к собственной системе Unity некоторые ключевые кости являются обязательными.
Unity ожидает наличия минимум 15 костей, а именно:
Убедитесь, что арматура всё ещё выделена и нажмите на Tab, чтобы перейти в режим Edit. Выберите корневую кость, нажав на неё правой клавишей мыши.
Примечание: в Blender для выбора объектов используется правая клавиша мыши. Нажатие левой клавиши мыши изменяет позицию 3D-курсора — небольшого жёлтого круга с красно-белым кольцом вокруг. При перемещении 3D-курсора все новые объекты создаются в его новой позиции, а для нашего туториала это не требуется. Для сброса позиции 3D-курсора можно нажать Shift + S, откроется меню Snap Menu, после чего выбрать Cursor to Center.
Откройте вкладку Bone на панели Properties справа, чтобы можно было быстро вносить изменения, и переименуйте корневую кость в Hips, введя имя в поле ввода названия и нажав Enter.
Позвоночник
Настало время создавать структуру костей!
Выберите нижнюю сферу кости Hips и нажмите по порядку G, Z, 0.5 и Enter, чтобы переместить её туда, где должен быть пупок.
Теперь выберите верхнюю сферу и нажмите G, Z, 0.1 и Enter, чтобы немного переместить её вверх.
Примечание: если вам плохо видно происходящее, то можно приближаться и отдаляться при помощи колеса мыши.
Чтобы создать несколько костей позвоночника, нам нужно подразделить кость Hips на три части. Выберите кость Hips, нажмите W, чтобы открыть меню Specials и выберите Subdivide. По умолчанию эта операция разделяет кость на две части, поэтому измените значение Number of Cuts в нижней части панели Tool слева на 2.
Примечание: если вы не видите ползунок Number of Cuts, то переместите курсор мыши под текст Subdivide Multi внизу слева и прокрутите вверх, чтобы сделать его видимым.
После разделения позвоночника новые кости называются Hips.001 и Hips.002. Это плохой способ наименования костей; переименуйте кости, по очереди выделив их и изменив имя в правой панели Bone.
Назовите верхнюю Chest, а среднюю LowerSpine.
Теперь перейдём к костям ног. Дублируйте кость Hips, выбрав её и нажав Shift + D, а затем для подтверждения нажмите правую клавиши мыши.
Если посмотреть на панель Bone справа, то можно увидеть, что выбрана кость с именем Hips.001. Переименуйте её в UpperLeg.L. L означает left, «левая». Так мы будем понимать, с какой мы стороны костей и это поможет нам в дальнейшем при отзеркаливании.
Поверните кость UpperLeg.L по оси Y, нажав R, Y, 180 и Enter.
Теперь переместите на место по горизонтали, нажав G, X, .23 и Enter. Затем нажмите G, Z, -.2 и Enter, чтобы переместить её вертикально.
Примечание: на картинке выше показан режим wireframe, чтобы подчеркнуть, где находится кость. Включить или отключить этот режим можно нажатием на Z.
Выберите нижнюю сферу (также называемую коннектором) и переместите её вниз, нажав G, Z, -.3 и Enter.
Чтобы ногу можно было сгибать, её необходимо разделить. Выберите кость UpperLeg.L, нажмите W и выберите Subdivide для разделения ноги на две части. В результате у нас получится две кости ноги; назовите нижнюю LowerLeg.L.
Последняя часть ног — это ступни. Переключитесь на вид сбоку, нажав 3 на алфавитно-цифровом блоке (Numpad), после чего нажмите на клавишу «точка» (.), чтобы сфокусироваться на голени.
Примечание: если на клавиатуре нет алфавитно-цифрового блока, то переключаться между видами можно нажатием на кнопку View в нижней части экрана.
Немного отдалите окно просмотра, чтобы видеть большую часть голени.
Теперь выберите нижний коннектор и чтобы создать стопу, экструдируйте его, нажав E, Y, -.18 и Enter.
Переименуйте созданную кость в Foot.L в панели Bone.
Теперь неплохо было бы сохранить файл. Нажмите CTRL + S и щёлкните левой клавишей мыши на появившемся имени файла. Периодически сохраняйте свою работу, Blender — достаточно стабильное приложение, но иногда может «крашиться».
Вернитесь в вид спереди, нажав 1 на алфавитно-цифровом блоке. Прежде чем переходить к голове, нам нужно сделать кость таза родительской для ноги. К счастью, сделать это довольно просто!
Выберите UpperLeg.L и найдите в разделе Relations панели Bone раскрывающийся список Parent. Нажмите на него и выберите Hips.
Приступим к голове! Выберите коннектор в верхней части кости Chest, нажмите E, Z, .055 и Enter. Это будет кость шеи, так что назовите её в панели Bone Neck.
Чтобы добавить кость головы, не снимайте выделение с верхнего коннектора и нажмите E, Z, .95 и Enter.
Назовите созданную кость Head.
Далее приступим к коннектору левого плеча. Выберите верхний коннектор кости Chest и нажмите E, X, .08 и Enter, чтобы добавить новую кость. Немного переместите её вниз, выбрав правый коннектор и нажав G, Z, -.09 и Enter.
Назовите эту кость ShoulderConnector.L. Эта кость будет прикреплять плечо к грудине. Для протокола: это ни в коем случае не анатомически корректно, но нам это и не требуется.
Снова выберите самый правый коннектор и нажмите E, X, .85 и Enter. Так мы создадим одну большую кость, которую нужно будет разделить, чтобы создать оставшиеся кости с левой стороны.
Выберите созданную кость, нажмите W и выберите Subdivide. Измените количество разрезов внизу слева на 3, чтобы получить четыре части.
Назовите эти кости следующим образом, начиная слева направо:
На первый взгляд текущее расположение этих костей выглядит неплохо, но из-за того, как расположен коннектор между частями руки (его можно назвать локтем), рука не сможет правильно сгибаться. Нажмите Z, чтобы перейти в режим wireframe, и посмотрите сами:
Красная линия обозначает, где локоть находится сейчас, а белая — точку сгиба руки на меше. Чтобы исправить это, выберите LowerArm.L и переместите её вправо, нажав G, X, .09 и Enter.
Пока мы работаем только с левой частью. Но как насчёт правой?
Не знаю, как вы, а я воспользовался бы любой возможностью упростить свою работу. Поэтому следующим шагом будет зеркальное отражение костей слева направо нажатием всего нескольких клавиш.
Отзеркаливание
С версии 2.79 в Blender есть удобная новая функция для быстрого отзеркаливания костей арматуры всего за несколько простых шагов! До появления этой функции приходилось дублировать, отзеркаливать вручную, изменять названия и задавать роли костей. Если вам когда-нибудь доводилось это делать, то вы знаете, как это долго.
Для начала снимите выделение со всех костей, нажав A, чтобы не осталось оранжевых контуров выделений.
Далее выберем кости только с левой стороны (левая сторона персонажа находится справа от вас), удерживая Shift и щёлкая правой клавишей мыши каждую кость. Не забудьте о ступне!
Выбрав эти кости, нажмите W и выберите Symmetrize.
И этого достаточно, чтобы получить идеальную зеркальную версию выбранных костей:
Кроме того, в конце названий костей будет вместо .L буква .R, обозначающая их позицию.
Сохраните файл и приготовьтесь к риггингу.
Рисование весов
Рисование весов (Weight painting) — это процесс привязки костей к 3D-мешу. Каждая кость прикрепляется к группе вершин с определённой величиной веса.
Вес определяет «жёсткость» перетягивания вершин за костью.
Выполнение этой задачи вручную может занять много времени, потому что придётся самостоятельно рисовать вес каждой отдельной кости. К счастью, Blender может взять на себя основную часть рутинной работы, автоматически нарисовав веса в зависимости от близости костей к вершинам.
Нажмите Tab, чтобы переключиться в Object mode. Сначала выберите модель, затем удерживайте Shift и нажмите ПКМ на арматуре, чтобы выбрать и её тоже.
Теперь нажмите CTRL + P, чтобы открыть меню Parent и выберите With Automatic Weights, чтобы сделать модель родителем арматуры и выполнить автоматическое рисование весов.
Визуально разница может быть незаметна, но теперь кости присоединены к мешу.
Прежде чем приступать к проверке, убедитесь, что Pivot Point находится в режиме Median Point, проверив нижнюю панель:
Включите режим Median Point, если там всё ещё выбран режим 3D Cursor.
А теперь начинается интересное! Переключитесь в режим Pose, выберите кость и поверните её, нажав R и перемещая курсор мыши. Проделайте это с каждой костью в центральной и левой части модели, чтобы убедиться, что все веса назначены верно.
Повертите окно обзора в разные стороны и проверьте вращение под другими углами, нажав колесо мыши и перемещая мышь в разные стороны.
Проверив все кости, вы можете заметить, что глаза не двигаются вместе с головой, что выглядит немного странно, если не сказать больше:
Чтобы прикрепить глаза к голове, нам придётся всё-таки самим назначить веса. Не выходите из режима Pose арматуры, удерживайте Shift и нажмите ПКМ на модели, чтобы тоже выбрать её. Теперь перейдите в режим Weight Paint. Мы готовы к рисованию весов.
В этом режиме можно выбирать кости, удерживая CTRL и щёлкая ПКМ на кости. Выберите кость Head и поверните её назад, нажав R, X, -90 и Enter.
Чтобы прикрепить глаза к кости Head, выберите кисть Add в разделе Brush панели Tool слева.
Нажмите Z, чтобы переключиться в режим wireframe и поверните окно обзора так, чтобы хотя бы один из глаз больше не находился на передней части головы. Теперь выполните раскраску вершин глаз, чтобы увеличить вес, пока глаза не перестанут висеть в воздухе.
Вес можно увидеть визуально по цвету на меше; значения изменяются от 0 (тёмно-синий) до 1 (ярко-красный). Чтобы проверить результаты, вернитесь в вид спереди, нажав numpad 1 и Alt (или Option) + R для сброса поворота кости Head.
Теперь глаза правильно прикреплены к голове.
Примечание: показанный выше поворот выполнен вращением трекбола. Этот режим вращения можно активировать повторным нажатием R после начала поворота.
Завершив базовое рисование весов, можно приступить к деталям.
Добавление аксессуаров
Аксессуары в этом контексте — это объекты, прикрепляемые к персонажу, но не являющиеся частью его тела. В этом разделе мы рассмотрим два способа прикрепления объектов: к самой модели и как отдельного многоразового объекта, прикрепляемого к кости.
Сначала мы нажмём Z, чтобы выйти из режима wireframe и нажмём A, а затем Alt (или Option) + R, чтобы сбросить поворот всех костей.
Редактирование персонажа
Первый способ добавления деталей к персонажу проще, но накладывает определённые ограничения. При работе с самой моделью, которая зеркально отражена, вся добавляемая геометрия будет копироваться из левой стороны в правую, и наоборот. Поэтому на одну из сторон невозможно добавить что-нибудь уникальное. Поскольку геометрия является частью этой конкретной модели, её также нельзя заново использовать для других персонажей. Такой способ идеален для любой ситуации, в которой подобные ограничения не являются проблемой.
Если вы повторяли за мной действия туториала, то сейчас находитесь в в режиме Weight Paint. И это хорошо, потому что после добавления шляпы нам нужно снова заняться рисованием весов. Нажмите Tab, чтобы перейти в режим Edit mode и начните с переключения режима выделения на Vertex, нажав CTRL + Tab и выбрав в меню Vertex.
Теперь выберите ПКМ любую вершину в верхней части головы, находящуюся выше красной линии (которая является используемым для текстурирования UV-швом). Нажмите CTRL + L для выбора всех присоединённых вершин, так мы выберем всю модель. Теперь выберите UV delimiter, выбрав в нижней левой панели >UVs.
Теперь будет выбрана только верхняя часть головы.
Выберите также edge loop под ней, удерживая Shift и Alt (или Option), а затем нажав ПКМ на любой из первых горизонтальных рёбер ниже.
Теперь дублируйте выбранные грани, нажав Shift + D, а затем Enter. Немного переместите дублированные грани, нажав G, Z и 0.01.
Затем отмасштабируйте всё выделенное, нажав S, 1.05 и Enter.
Так мы немного сместим шляпу с головы, чтобы избежать Z-конфликта граней.
Шляпа пока похожа на висящий в воздухе кусок тела, поэтому чтобы прикрепить её к телу, сделаем следующее:
Это придаст шляпе немного глубины, чтобы она хорошо выглядела со всех сторон и в ней не было дыр. Однако шляпа из человеческой кожи — это не совсем то, чего бы нам хотелось. Для изменения цвета нам нужно сначала развернуть её UV-координаты, чтобы они красиво лежали на текстуре.
Выберите всю шляпу, выбрав любую её вершину и нажав CTRL + L. В этот раз измените ограничитель на Normal, чтобы выбрать все соединённые вершины.
Для нашей шляпы мы выполним одну из простейших в мире развёрток: из вида. Нажмите numpad 1, чтобы перейти в вид спереди, затем нажмите U, чтобы открыть меню Unwrap и выберите Project From View.
Если вы посмотрите на правую сторону окна Blender, в которой показана текстура, то заметите, что туда добавилось несколько вершин, похожих на половину шляпы:
Можно выбрать все вершины, переместив курсор мыши на текстуру и нажав A. Действия в Blender чувствительны к контексту и зависят от расположения курсора, поэтому пусть он пока находится внутри этой области текстуры.
Теперь нажмите G, чтобы переместить UV на синее пятно, подтвердите перемещение нажатием Enter, а затем отмасштабируйте выбранное, чтобы оно уместилось в пределах синей области: нажмите S и подтвердите клавишей Enter.
Если теперь посмотреть на персонажа, то можно увидеть, что его шляпа стала синей.
Можно изменить изображение текстуры, чтобы сделать любой другой цвет.
Теперь снова переместите курсор влево, рядом с моделью и нажмите Tab, чтобы вернуться в режим Weight Paint. Немного поверните кость Head, чтобы проверить, прикреплена ли шляпа.
Похоже, нам повезло! Поскольку вершины шляпы близко к кости Head, они добавились автоматически. Если бы этого не случилось, то нам пришлось бы раскрашивать шляпу вручную, как мы это делали с глазами.
Теперь мы рассмотрим создание и прикрепление отдельного объекта.
Прикрепление объектов
Перейдите в режим Object mode и нажмите Shift + A, чтобы открыть меню Add. Выберите Mesh > Cylinder, чтобы добавить в сцену новый цилиндр.
Предлагаемый по умолчанию цилиндр слишком велик, поэтому настроим его параметры в нижнем левом углу: изменим Radius на 0.04, а Depth на 1.2.
Благодаря этому цилиндр станет тоньше и короче.
Сделаем цилиндр гладким, нажав на кнопку Smooth в разделе Shading панели Tool Shelf слева.
Пока нашему цилиндру не назначено никакого материала. Чтобы назначить материал, откройте вкладку Material в панели Properties справа и выберите CuteMaterial из раскрывающегося списка рядом с кнопкой New.
Чтобы превратить цилиндр в коричневый посох, нам для начала потребуется выполнить UV-развёртку. Нажмите Tab, чтобы перейти в режим Edit mode, нажмите U, чтобы открыть меню Unwrap, и выберите Project From View.
Переместите курсор мыши на текстуру справа, нажмите G, чтобы переместить UV на коричневый кусок текстуры. Подтвердите перемещение клавишей Enter и уменьшите масштаб нажав S и переместив мышь так, чтобы UV поместились внутри этого куска.
Теперь посох стал коричневым. Не волнуйтесь о неправильном расположении, скоро мы им займёмся.
Откройте вкладку Constraints панели Properties. Добавьте новое ограничение (constraint), нажав на раскрывающийся список Add Object Constraint и выбрав Child Of.
Constraints используются для ограничения позиции, поворота и масштаба объекта. В нашем случае я сделал цилиндр дочерним объектом кости руки персонажа. Благодаря этому при создании анимаций объект будет постоянно прикреплён к руке. Это очень упрощает предварительный просмотр анимации и позволяет ограничить пересечения объекта с телом.
Задать ограничение очень просто. Нажмите на раскрывающийся список Target и выберите Armature. Теперь нажмите на раскрывающийся список Vertex Group и выберите Hand.R.
После этого вы заметите, что посох мгновенно прикрепился к правой руке персонажа. Однако его позиция и поворот не совсем верны. Поверните посох по оси Z на 90 градусов, нажав R, X, 90 и Enter. Теперь переместите его немного вперёд, нажав G, Y, -0.4 и Enter. Так намного лучше!
Пришла пора испытать посох. Вернитесь в режим Object mode, нажав Tab, выберите арматуру и переключитесь в режим Pose mode с помощью раскрывающегося списка в нижней части экрана. Поверните окно просмотра так, чтобы чётко видеть посох, выберите UpperArm.R и немного поверните её, нажав R и перемещая мышь. Посох будет следовать за рукой, как будто персонаж его держит.
Персонаж и его аксессуары готовы. Сохраните файл, наша работа здесь закончена.
Теперь мы займёмся экспортом модели и арматуры в Unity.
Экспорт в другие форматы
Примечание: если вам не интересно экспортировать модели в другие форматы, чтобы делиться ими с людьми, то можете пропустить этот раздел. Просто сохраните файл и закройте Blender.
Экспортировать в FBX из Blender очень просто. Для начала выберите в верхнем меню File > Export > FBX (.fbx).
Вы увидите режим экспорта. В отличие от большинства приложений, Blender не открывает отдельное окно, а вместо этого заменяет содержимое всего окна.
Можно выбрать место сохранения файла, выбрав папку слева или введя местоположение в поле сверху. Параметры экспорта указаны в нижнем левом углу окна:
Эти параметры экспорта по умолчанию подходят для Unity, но существует вероятность того, что в более сложных сценах они могут создать хаос, потому что экспортируют всё, даже источники освещения и камеры. Чтобы экспорт был чистым, внесите следующие изменения:
Снимите выделение с Camera, Lamp и Other. Это можно сделать, удерживая Shift и нажимая на опции, которые нужно отключить.
Если выбраны только такие опции, то никакие нежелательные объекты не экспортируются. Теперь поставьте флажок !EXPERIMENTAL! Apply Transform под этими опциями. Он применит позицию, поворот и масштаб всех объектов. Это означает, что неоднообразные значения будут сброшены; например, если поворот имел значения (X:23, Y:125, Z:7), то он будет сброшен на (X:0, Y:0, Z:0).
Переключитесь на вкладку Geometries, нажав на кнопку Geometries, и снимите флажок Use Modifiers Render Setting. Это позволит сохранить высокое количество полигонов внутри для рендеринга в Blender, но оставит его низким внутри Unity.
Далее откройте вкладку Armatures, поставьте флажок Only Deform Bones и снимите Add Leaf Bones. Это не позволит приложению Blender добавлять к арматуре лишние кости. Leaf bones необходимы только для совместимости с Maya. Non-deform bones, например, контролирующие кости, необходимы только в ПО моделирования для выполнения точной настройки; в таких игровых движках, как Unity, они бесполезны.
Опции Animation по умолчанию настроены правильно, так что менять их не нужно.
Настроив всё это, было бы слишком скучно каждый раз заниматься этим каждый раз при экспорте файла. И тут нам помогут пресеты. Мы можем сохранить все эти параметры во внутренние опции Blender для использования в будущем.
Для этого нажмите на кнопку + рядом с раскрывающимся списком Operator Presets, введите в текстовое поле название пресета и нажмите на кнопку OK. В этом туториале мы назовём его Unity FBX.
Если открыть теперь раскрывающийся список Operator Presets, то можно выбрать только что созданный пресет:
После этого параметры мгновенно будут применены. Пресеты работают для всех файлов, поэтому теперь вы можете запросто экспортировать любой файл Blender в FBX для использования в Unity.
Сохраните файл и закройте Blender. Наконец настало время перейти в Unity и воспользоваться нашей моделью.
Настройка гуманоида
Откройте заготовку проекта в Unity и посмотрите на окно Project.
Вот краткое описание папок:
Разобравшись с этим, давайте приступим к использованию персонажа!
Привязка аватара
Для начала выберите модель CuteCharacter из папки Models и откройте в Inspector вкладку Rig. Откройте раскрывающееся меню Animation Type и выберите Humanoid.
Так мы сообщим, что персонаж является гуманоидом, чтобы Unity могла использовать его соответствующим образом. Теперь нажмите Apply, чтобы сохранить эти параметры.
После краткого повторного импорта вы заметите, что появилась кнопка Configure…. Нажмите на неё, чтобы приступить к связыванию костей с системой Mecanim движка Unity’.
Посмотрите на окно Scene и поверните окно так, чтобы персонаж смотрел на вас. Заметьте зелёные кости; их использует движок Unity. При нажатии на любую из них будет выбрана соответствующая кость и в Hierarchy, и в Inspector.
Использование движком Unity костей напоминает работу кукловода. Вместо непосредственного использования файлов анимации для обновления костей в каждом кадре он считывает значения и применяет их к каждому гуманоиду на основании его определения Avatar. Это обеспечивает гибкость при работе с разными формами тел. Возьмём для примера персонажа, с которым мы работали — его пропорции нереалистичны, но это не имеет значения, ведь его скелет имеет необходимые кости: позвоночник, руки, ноги и т.д. Некоторые из костей могут быть короче, чем у большинства людей, но они всё-таки присутствуют.
Теперь посмотрим на Inspector: вы видите фигуру человека с разбросанными по ней зелёными и серыми кругами. Все сплошные круги необходимы для работы системы Avatar. Если какие-то из них отсутствуют, то они становятся красными, и вы не сможете правильно анимировать персонажа.
Пунктирные круги — это дополнительные кости для более сложных ригов. Все серые части отсутствуют, но необязательны. Например, у нашего персонажа нет пальцев.
Ниже представлено полное описание костей, и именно здесь нужно связывать части тела с костями. Если какой-то из кругов красный, то нужно назначить (или переназначить) кость. Созданный нами скелет полностью отвечал требованиям уже при импорте в Unity, поэтому никаких настроек не требуется. Ура!
Нажмите на кнопку Apply в нижнем правом углу и щёлкните кнопку Muscles & Settings в верхней части Inspector. Это позволит просматривать и настраивать виртуальные мышцы.
Вы увидите три раздела:
Раздел Per-Muscle Settings содержит подразделы, которые можно разворачивать нажатием на стрелки. В каждом из них есть отдельные превью. Эти подразделы позволяют указать минимальные и максимальные углы, чтобы избежать наложений в вашей модели.
Разверните раздел Left Arm и попробуйте перетаскивать ползунок Arm Down-Up. Заметьте, что происходит при минимальном значении:
Примечание: если персонаж слишком тёмный, чтобы создавать силуэт, то можно отключить в окне Scene освещение сцены, нажав на небольшой значок солнца в верхней части.
Рука движется через тело персонажа. Плохо!
Чтобы исправить это, переместите ползунок превью в наименьшее значение и измените minimum angle раздела Arm Down-Up на -20.
Сделайте то же самое для Right Arm > Arm Down-Up.
На этом мы закончим настройку мышц. Можно настроить и другие мышцы, чтобы предотвратить наложение, но в этом туториале мы остановимся на перемещении рук вверх-вниз.
Нажмите кнопку Apply в нижнем правом углу для сохранения изображений в Avatar и нажмите Done, чтобы закрыть режим привязки.
Теперь настало время добавить персонаж в сцену и дать ему воспроизводимую анимацию.
Использование персонажа
Чтобы добавить персонажа, перетащите модель CuteCharacter из папки Models в Hierarchy.
Задайте для CuteCharacter поворот (X:0, Y:180, Z:0), чтобы он смотрел в камеру.
Создайте новый контроллер анимаций, нажав правой клавишей на папке RW\Animation Controllers и выбрав Create > Animation Controller.
Назовите его CharacterController и дважды нажмите на него, чтобы открыть окно Animator. Теперь перетащите анимацию Idle из папки RW\Animations на сетку Animator, чтобы сделать её анимацией по умолчанию.
Далее выберите CuteCharacter в Hierarchy и нажмите на кнопку-селектор рядом с полем Controller. Выберите в окне выбора CharacterController.
Вот и всё! Нажмите на кнопку Play, чтобы увидеть персонажа в действии.
Теперь снова нажмите на кнопку Play, чтобы остановить сцену, и нажмите CTRL + S, чтобы сохранить изменения.
Куда двигаться дальше?
Поздравляю, вы выполнили туториал. Готовый проект можно скачать отсюда.
В этом туториале вы научились следующему:
Чтобы узнать больше о Blender, изучите следующие туториалы:





