Сегодня редко можно встретить игру без анимации, потому что она является важным аспектом передачи движения. Без анимации будет казаться, что персонаж не бежит, а скользит. И так, сегодня у нас анимация Unreal Engine.
К счастью, Unreal позволяет быстро и удобно анимировать персонажей!
В этой части туториала вы научитесь следующему:
- Импортировать меш со скелетом
- Импортировать анимации
- Создавать Animation Blueprint для переходов между разными анимациями
- Выполнять плавные переходы анимаций
Учтите, что в этой части мы будем использовать Blueprints. Если вам нужно освежить свои знания, то прочитайте статью проBlueprints.
Примечание:этот пост является одной из восьми частей туториала, посвящённого Unreal Engine:
- Часть 1: Знакомство с движком
- Часть 2: Blueprints
- Часть 3: Материалы
- Часть 4: UI
- Часть 5: Как создать простую игру
- Часть 6: Анимация
- Часть 7: Звук
- Часть 8: Системы частиц
- Часть 9: Искусственный интеллект
- Часть 10: Как создать простой FPS
Приступаем к работе
Скачайтезаготовку проектаи распакуйте её. В корневом каталоге есть папкаAnimation Assets. В этой папке находятся персонаж и анимации, которые мы будем импортировать.
Откройте проект, перейдя в папку проекта и запустивSkywardMuffin.uproject.
Примечание:если откроется окно, сообщающее, что проект создан в более ранней версии Unreal editor, то всё в порядке (движок часто обновляется). Можно или выбрать опцию создания копии, или опцию преобразования самого проекта.
Нажмите наPlay, чтобы запустить игру. Цель игры заключается в том, чтобы коснуться как можно большего числа облаков, не упав. Чтобы прыгнуть на первое облако, нажмителевую клавишу мыши.
Вместо простого красного круга давайте будем управлять этим милым маффином:
Этот маффин имеетскелет, который позволяет нам анимировать его.
Что такое скелет(анимация Unreal Engine) ?
В 3D-редакторах скелетом называется множество взаимосвязанных точек, называемыхшарнирами. На рисунке ниже каждая сфера является шарниром.
Примечание:в Unreal используются взаимозаменяемые терминыjointиbone.
Управляя этими шарнирами, можно создавать различные позы персонажа.
При переходе из одной позы в другую создаётсяанимация.
Если создать ещё больше поз между предыдущими, можно получить что-то вроде такого:
В Unreal любой меш со скелетом называетсяSkeletal Mesh. Давайте начнём с импорта Skeletal Mesh для маффина.
Импорт Skeletal Mesh (анимация Unreal Engine)
Перейдите в Content Browser и зайдите вCharacters\Muffin. Нажмите наImportи перейдите вSkywardMuffinStarter\Animation Assets. ВыберитеSK_Muffin.fbxи нажмитеOpen.
В окне импорта перейдите в разделMeshи снимите флажок с опцииCreate Physics Asset. Physics Asset помогает создать эффект рэгдолла. В этом туториале мы не будем его использовать, поэтому он нам не понадобится.
В проекте уже содержится материал и текстура маффина, поэтому импортировать их не нужно.Снимите флажкис опцийImport MaterialsиImport Textures.
Все остальные настройки оставьте по умолчанию и намжите наImport. При этом создадутся следующие ассеты:
- SK_Muffin:ассет Skeletal Mesh. Это просто меш со ссылкой на ассет Skeleton.
- SK_Muffin_Skeleton:ассет Skeleton. Он содержит список шарниров и другую информацию, например, об их иерархии.
Импортировав маффин, мы готовы использовать его.
Использование Skeletal Mesh (анимация Unreal Engine)
Прежде чем использовать новый Skeletal Mesh, нужно дать ему материал, чтобы он не был просто серым пятном.Дважды щёлкнитенаSK_Muffin, чтобы открыть его.
Перейдите в панель Asset Details и найдите разделMaterial Slots. Назначьте материалM_Muffinи закройтеSK_Muffin.
Теперь давайте используемSK_Muffinв качестве персонажа игрока. Вернитесь в Content Browser идважды щёлкнитенаBP_Muffin, чтобы открыть его.
Перейдите к панели Components и выберите компонентMesh (Inherited). Переключитесь на панель Details и найдите разделMesh. Для свойстваSkeletal Meshвыберите значениеSK_Muffin.
Нажмите наCompileи вернитесь в основной редактор. Нажмите наPlay, и вы сможете управлять в игре маффином!
Игра уже выглядит намного лучше! Следующим шагом будет импорт анимаций, которые вдохнут в маффин жизнь.
Импорт анимаций
Перейдите в Content Browser и нажмите наImport. Перейдите вSkywardMuffinStarter\Animation Assets. Выберите следующие файлы:
- SK_Muffin_Death.fbx
- SK_Muffin_Fall.fbx
- SK_Muffin_Idle.fbx
- SK_Muffin_Jump.fbx
- SK_Muffin_Walk.fbx
Выбрав их, нажмите наOpen.
В окне импорта перейдите в разделMeshиснимите флажокс опцииImport Mesh. Благодаря этому Skeletal Mesh не будет импортирован снова.
Теперь проверьте, что свойствоSkeletonимеет значениеSK_Muffin_Skeleton. Это определяет скелет, который будет использоваться в анимации.
Затем нажмите наImport All. Так вы импортируете все анимации с только что указанными настройками.
Теперь, когда у нас есть все анимации, нам нужен способ их воспроизведения. Можно воспользоваться для этогоAnimation Blueprint.
Создание Animation Blueprint (анимация Unreal Engine)
Animation Blueprint похож на обычный Blueprint. Однако в нём также есть граф, предназначенный только для задач анимации.
Чтобы создать его, перейдите в Content Browser и нажмите на кнопкуAdd New. ВыберитеAnimation\Animation Blueprint.
Во всплывающем окне найдите свойствоTarget Skeletonи выберитеSK_Muffin_Skeleton. Затем нажмите на кнопкуOKдля создания Animation Blueprint.
Переименуйте ассет вABP_Muffin. После этогодважды щёлкнитена нём, чтобы открыть его в Animation Blueprint editor.
Animation Blueprint Editor
The Animation Blueprint editor похож на Blueprint editor, но в нём есть четыре дополнительных панели:
- Anim Graph:это специальный граф для анимаций. Здесь воспроизводятся все анимации.
- Preview Scene Settings:эта панель позволяет настраивать сцену предварительного просмотра во Viewport
- Anim Preview Editor:создаваемые переменные также будут отображаться здесь. Используйте эту панель для предварительного просмотра того, как влияют ваши переменные на конечную анимацию.
- Asset Browser:эта панель содержит список анимаций, которые может использовать текущий скелет.
Для задания ситуаций, в которых должна воспроизводиться каждая анимация, можно использовать конечный автомат (State Machine).
Что такое конечный автомат?
Конечный автомат — это наборсостоянийиправил. В нашем туториале можно считать состояние анимацией.
Конечные автоматы одновременно могут находиться только в одном состоянии. Для перехода в следующее состояние должны выполняться определённые условия, задаваемые правилами.
Ниже представлен простой пример конечного автомата. В нём показаны состояния прыжка и правила перехода в каждое состояние.
Состояния могут иметь и двустороннюю взаимосвязь. В представленном ниже примере состояния Jump и Fall могут переходить друг в друга.
Без этой двусторонней связи персонаж не смог бы выполнять двойной прыжок, потому что он мог бы переходить в состояние Jump только из состояния Idle.
Ну, довольно о конечных автоматах, давайте уже займёмся их созданием.
Создание конечного автомата
Перейдите в Anim Graph инажмите правой клавишей мышина пустой области. В меню выберитеAdd New State Machine.
Это добавит в граф нод State Machine. Переименуйте State Machine вLocomotion. Затем соедините конечный автоматLocomotionс нодомFinal Animation Pose.
Теперь конечный автоматLocomotionбудет определять конечную анимацию маффина.
Дважды щёлкнитена конечном автоматеLocomotion, чтобы открыть его. Внутри вы увидите нодEntry.
Соединённое с этим нодом состояние является состояниемпо умолчанию. В нашем туториале состоянием по умолчанию будет анимация ожидания. Создайте это состояние,нажав правой клавишей мышина пустой области графа. В меню выберитеAdd Stateи переименуйте его вIdle.
Теперь нужно соединить нодEntryс состояниемIdle.ПеретащитеконтактEntryксеройобласти состоянияIdle. Отпустителевую клавишу мыши, чтобы соединить их.
При создании состояния через контекстное меню с ним не будет связана никакая анимация. Давайте это исправим.
Привязывание анимации к состоянию
Дважды щёлкнитена состоянииIdle, чтобы открыть его.
Чтобы привязать анимацию, перейдите в Asset Browser иперетащитеанимациюSK_Muffin_Idle. Отпустителевую клавишу мышина пустой области графа, чтобы добавить её.
Затем присоедините нодPlay SK_Muffin_Idleк нодуFinal Animation Pose.
Для использования Animation Blueprint нам нужно обновитьBP_Muffin.
Использование Animation Blueprint
Нажмите наCompileи переключитесь наBP_Muffin.
Перейдите в панель Components и выберите компонентMesh (Inherited). Перейдите в панель и найдите разделAnimation.
Выберите дляAnimation ModeзначениеUse Animation Blueprint. ДляAnim Classвыберите значениеABP_Muffin.
Теперь Skeletal Mesh в качестве своего Animation Blueprint будет использоватьABP_Muffin.
Нажмите наCompileи закройтеBP_Muffin. Перейдите в основной редактор и нажмите наPlay, чтобы проверить Animation Blueprint. ПосколькуIdleявляется состоянием по умолчанию, маффин сразу же использует анимацию ожидания.
В следующем разделе мы создадим состояния для прыжков и падения.
Создание состояний прыжка и падения
Вернитесь кABP_Muffinи переключитесь к графу конечного автоматаLocomotion. Это можно сделать, нажав на словоLocomotion, расположенное в верхней части графа.
Вместо создания состояния и привязки к нему анимации можно создать состояние с уже привязанной анимацией. Давайте сделаем так для состояния прыжка.
Перейдите в Asset Browser иперетащитеанимациюSK_Muffin_Jump. Отпустителевую клавишу мышина пустой области графа. Это создаст состояние с уже привязанной к нему анимацией.
Переименуйте состояние вJump.
Повторите процесс с анимациейSK_Muffin_Fallи переименуйте состояние вFall.
Теперь у нас есть три состояния:Idle,JumpиFall.
Теперь мы свяжем состояния друг с другом. Это можно сделать,перетащивсеруюобласть состояния,изкоторого нужно выполнить переход. Отпустителевую клавишу мышинасеройобластицелевогосостояния для создания перехода.
Создайте следующие переходы:
- ИзIdleвJump
- ИзJumpвFall
- ИзFallвJump
- ИзFallвIdle
Теперь, когда у нас есть переходы, нужно задать условия, при которых они происходят. Это можно сделать с помощью правил переходов (Transition Rules).
Transition Rules
Этот значок обозначает правило перехода (Transition Rule):
Каждое правило перехода содержит нодResultс единственным булевым входом.
Если этот вход равенtrue, то происходит переход.
Далее нужно создать переменные, сообщающие нам, прыгает или падает игрок. Мы применим эти переменные в правилах переходов.
Определяем, прыгает персонаж или падает
Создайте двебулевыпеременные с названиямиIsJumpingиIsFalling.
Во-первых, мы зададим значениеIsJumping. Переключитесь на Event Graph и найдите нодEvent Blueprint Update Animation. Этот нод работает подобно нодуEvent Tick.
Чтобы проверить, прыгает ли персонаж, создадим следующую схему:
Так мы проверим, больше ли нуляскоростьперсонажа пооси Z. Если это так, то персонаж прыгает, аIsJumpingдолжна принимать значениеtrue.
Примечание:приведите её к классу, который будет использовать Animation Blueprint. Это очень важно для того, чтобы можно было предварительно просматривать переменные с помощью Anim Preview Editor.
Чтобы проверить, падает ли персонаж, нам достаточно выполнить противоположную проверку. Добавьте выделенные ноды:
ТеперьIsFallingбудет равнаtrue, когдаскорость по Zперсонажа меньше нуля.
Настало время использовать эти переменные для задания правил переходов.
Определение правил переходов
Во-первых, нам нужно задать правило переходаIdle to Jump. Переключитесь обратно к конечному автоматуLocomotion.Дважды щёлкнитена правиле переходаIdle to Jump, чтобы открыть его.
Создайте нодIsJumpingи соедините его с нодомResult.
Теперь состояниеIdleможет переходить в состояниеJump, когдаIsJumpingравноtrue.
Повторите процесс для правил переходовJump to FallиFall to Jump. Используйте следующие переменные:
- Из Jump в Fall:IsFalling
- Из Fall в Jump:IsJumping
Теперь состоянияJumpиFallмогут переходить друг в друга.
Осталось назначить ещё одно правило перехода. Откройте правило переходаFall to Idle.
Для перехода в состояниеIdleигрок не должен прыгать или падать. Чтобы выполнить эту проверку, можно использовать нодNOR. Этот нод возвращаетtrueтолько когда оба входа имеют значенияfalse.
Создайте нодNORи соедините с ним нодIsJumpingиIsFalling. После этого соедините нодNORс нодомResult.
Теперь состояниеFallможет переходить в состояниеIdle, когдаIsJumpingиIsFallingравныfalse.
Нажмите наCompileи вернитесь в основной редактор. Нажмите наPlayдля проверки переходов.
Примечание:также вы можете проверить переходы, изменяя переменные в Anim Preview Editor.
Пока маффин при движении по земле только скользит, потому что мы ещё не применили анимацию ходьбы!
Вместо создания нового состояния для ходьбы можно смешать его с анимацией ожидания с помощьюBlend Space.
Что такое Blend Space?
Blend Space — это тип анимационного ресурса. Он выполняет интерполяцию между разными анимациями на основании входных значений. В этом туториале мы будем использовать в качестве входных данныхскоростьигрока.
Blend Space также помогают упростить конечные автоматы. Вот как будет выглядеть конечный автоматLocomotion, если не использовать для ходьбы Blend Space:
Благодаря Blend Space достаточно просто заменить анимацию ожидания.
Теперь, когда вы познакомились с магией Blend Space, настало время создать его.
Создание Blend Space
Перейдите в Content Browser и нажмите наAdd New. ВыберитеAnimation\Blend Space 1D.
Примечание:разница междуBlend SpaceиBlend Space 1Dзаключается в том, что у первого естьдвавхода. Последнее имеет толькоодинвход.
Во всплывающем окне выберитеSK_Muffin_Skeleton.
Переименуйте ассет вBS_IdleWalkидважды щёлкнитена нём, чтобы открыть его в Animation editor.
Когда откроется Blend Space, вы увидите панель в нижней части экрана. Это Blend Space editor, в котором мы будем добавлять анимации.
Давайте добавим анимации в Blend Space.
Добавление анимаций в Blend Space
Во-первых, нужно изменить имя значеняи оси (входа). Перейдите в панель Asset Details и найдите разделAxis Settings. Измените свойствоHorizontal Axis\NameнаSpeed.
Теперь мы добавим анимации. Перейдите в Asset Browser иперетащитеанимациюSK_Muffin_Idle. Переместите еёвлевона сетке Blend Space, чтобы она привязалась к значению0.0. Отпустителевую клавишу мыши, чтобы добавить анимацию.
Примечание:для отображения названий анимаций нажмите на значокметкивверхнем левомуглу сетки Blend Space.
После этого добавьте анимациюSK_Muffin_Walkв значение100.0.
Теперь Blend Space будет смешивать анимации ожидания и ходьбы в зависимости от входного значения. Если входное значение равно0, то будет воспроизводиться только анимация ожидания. Если входное значение равно100, то будет воспроизводиться только анимация ходьбы. Все промежуточные значения будут смешиваться.
Примечание:эти значения выбраны произвольно. Например, можно изменить максимальное значение, сделав его равным 500. В этом случае анимация ходьбы будет воспроизводиться только при более высоких скоростях.
Можно изменять значения разделаAxis Settingsв панели Asset Details.
Настало время использовать Blend Space.
Применяем Blend Space
ЗакройтеBS_IdleWalkи откройтеABP_Muffin. Переключитесь на конечный автоматLocomotionи откройте состояниеIdle.
Во-первых, удалите нодPlay SK_Muffin_Idle.
Затем добавьте Blend SpaceBS_IdleWalkс помощью перетаскивания. Соедините нодBS_IdleWalkс нодомFinal Animation Pose.
ТеперьBS_IdleWalkбудет воспроизводиться автоматически, потому что является состоянием по умолчанию. Однако оно будет отображать только анимацию ожидания. Так происходит потому, что входSpeedостаётся равным0.
Чтобы исправить это, нужно передать ему скорость игрока.
Получение скорости игрока
Создайте новую переменную типаfloatс именемSpeed. Затем переключитесь на Event Graph.
Добавьте новый контакт к нодуSequence, а затем добавьте к нему выделенные ноды:
Эта схема будет постоянно приравнивать переменнуюSpeedк значению скорости игрока.
Переключитесь обратно к графу состоянияIdle. Соедините переменнуюSpeedсо входомSpeedнодаBS_IdleWalk.
Теперь сможетBS_IdleWalkвыполнять смешивание между анимациями ожидания и ходьбы.
Нажмите наCompileи вернитесь в основной редактор. Нажмите наPlay, чтобы протестировать Blend Space.
Есть ещё одна анимация, которую нам нужно использовать: анимация смерти.
Использование анимации смерти
В этой игре можно умереть только в состоянииIdle(на земле). Однако давайте представим, что игрок может умереть в любом состоянии. Первой мыслью будет создать состояниеDeathи соединить с ним все состояния. Так можно сделать, но это быстро приведёт к запутанному графу.
Решением может стать использование нодаBlend Poses by bool. Этот нод может переключаться между двумя анимациями в зависимости от значения входного булева значения.
Прежде чем создать этот нод, нам нужна переменная, содержащая статус смерти игрока.
Проверяем, умер ли игрок
Вернитесь назад кABP_Muffinи создайте переменную типаbooleanпод названиемIsDead. Затем переключитесь на Event Graph.
Добавьте новый контакт к нодуSequence, а затем добавьте к нему выделенные ноды:
Так мы зададим переменнуюIsDead, зависящую от состояния смерти игрока.
Затем мы воспользуемся нодомBlend Poses by bool.
Использование нода Blend Poses by Bool
Переключитесь на Anim Graph и добавьте анимациюSK_Muffin_Death. Выбрав её, перейдите в панель Details иснимите флажоксо свойстваLoop Animation.
Благодаря этому анимация смерти будет проигрываться только один раз.
Затем создайте нодBlend Poses by bool.
Выберите нодBlend Poses by boolи перейдите в панель Details. В разделеOptionпоставьте флажокна свойствеReset Child on Activation.
Поскольку анимация смерти проигрывается всего один раз, эта опция гарантирует, что анимация сбрасывается перед воспроизведением.
Наконец, добавьте переменнуюIsDeadи соедините всё следующим образом:
Теперь если переменнаяIsDeadбудет равнаtrue, то начнёт воспроизводиться анимация смерти. ЕслиIsDeadравноfalse, то будет воспроизводиться текущая анимация конечного автоматаLocomotion.
Нажмите наCompileи закройтеABP_Muffin. Нажмите наPlayи протестируйте новую анимацию смерти!
Куда двигаться дальше?
Скачать готовый проект можноздесь.
Теперь игра выглядит гораздо более качественной, не так ли? На основе уже полученных знаний можно сделать многое, но это ещё не конец! Изучите страницуSkeletal Mesh Animation Systemдокументации Unreal Engine. Здесь можно узнать о других типах анимационных ассетов и о способах их использования.
Если вы хотите продолжить обучение, то читайтеследующую часть туториала, в которой я покажу вам, как добавлять в игру музыку и звуковые эффекты.