Как бешеный скуф собрал боевой прототип в Unreal Engine

Всем привет! Сегодня рассмотрим подход к созданию вот этого прототипа.

Мой телеграмм канал про анимацию и unreal

Шаг первый: пишем общий план что мы хотим увидеть, какие механики у нас будут и сколько потребуется анимаций.

Как бешеный скуф собрал боевой прототип в Unreal Engine

Краткое описание, однако уже понятно, что нужно сделать.

Дальше я расписываю, что конкретно буду делать на каждом этапе.

Как бешеный скуф собрал боевой прототип в Unreal Engine

После этого я пошёл снимать и собирать референсы.

У меня были разборные гантели и много фантазии

(Роль импровизированной кувалды играют разборные гантели.)

Референсы из TLOU 2 брал для вдохновения.

Персонажей я купил на Fab.

это маркетплейс цифровых ассетов от Epic Games, где можно купить или бесплатно скачать персонажей, окружение, анимации, материалы и другие ресурсы для разработки игр.

Чутка подправил им Skinning в Maya.

Skinning это привязка вершин 3D-модели к костям скелета с помощью весов влияния.

Например, вершины около локтя частично привязаны к плечу и предплечью. Когда кости двигаются, модель плавно деформируется вместе с ними.

Дальше перенёс анимацию с Game Animation Sample на женского персонажа с помощью встроенной Retarget System.

Как бешеный скуф собрал боевой прототип в Unreal Engine

Указываем, с какого персонажа перенести и на какого (и да, это не работает идеально)))).

Важный момент в Game Animation Sample поза персонажа без оружия. Я сделал аддитивную анимацию для оружия и подключил её поверх всей анимационной системы.

Additive Animation

Additive Animation добавляет изменение поверх базовой анимации, а не заменяет её.

Например, поверх бега можно добавить отдачу оружия, дыхание, наклон корпуса или поворот головы.

Вторая анимация через Layered Blend per Bone, чтобы уменьшить амплитуду движения локтя в беге (ведь у нас у нас оружие в руке).

Layered Blend per Bone смешивает несколько анимаций по выбранным костям и их дочерней иерархии. Эта нода заменяет одну анимацию на другую по выбранным костям.

Дальше я отснял мокап для быстрого прототипирования

Через этот сервис

Мокап (Motion Capture) — это технология записи движений человека с последующим переносом их на 3D-персонажа.

Выглядит это криво и косо, однако для прототипа этого достаточно.

Дальше я перенёс анимацию на Control Rig персонажа в Maya, чтобы поправить Root-анимацию и зациклить анимацию для первого прототипа.

Control Rig в Maya это система контроллеров, ограничений и связей, через которую аниматор управляет скелетом персонажа, не вращая кости напрямую.

Root главная корневая кость скелета, от которой наследуют движение все остальные кости.

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

Первый пас прототипа выглядел так.

Есть все базовые механики, которые я хотел сделать (кроме парирований).

Важный момент: нужно как можно дольше оставаться на этом этапе и тестировать:

  • каким долгим должен быть замах;
  • как быстро делать удар;
  • сколько персонаж должен проходить во время удара;
  • сколько времени дать на восстановление после удара;
  • с какой скоростью должен бежать персонаж.
  • Как много нужно пройти персонажу во время хит реакции

И на этапе прототипа мы можем ускорять или замедлять анимации прямо в движке.

Допустим, у нас есть атака. Скажем, в процессе атаки персонаж смещается на 3 метра. Запускаем игру и спокойно убегаем от врага.

Вопрос: что делать?

Переделать анимацию и снова протестировать.

Задать процедурное смещение в игре — скажем, 2 метра в секунду, расставить его в нужных местах и после тестов уже переделывать анимацию.

Плюс можно ускорить нужные части анимации в движке.

Такой подход может сэкономить много времени.

Два примера: исходная атака и атака после того, как я добавил смещение и изменил тайминг.

Блокинг парной анимации

Дальше я сделал блокинг парной анимации.

Блокинг анимации это первый этап, на котором аниматор расставляет основные позы и определяет тайминг движения без мелких деталей.

На этом этапе проверяют идею, силу поз, ритм, баланс и читаемость действия.

Реализация камеры

Вот как я реализовал камеру.

Функционал нужен для проигрывания парной анимации и для того, чтобы камера один в один проигрывалась так же, как в Maya.

Примерный пайплайн: у женского персонажа есть кость под камеру в скелете. Кость я сделал прямо в Unreal.

Синхронизация двух персонажей происходит с помощью плагина Contextual Animation.

Во время проигрывания анимации я делаю Spawn блюпринта с CineCamera. В самом блюпринте я выставляю настройки соотношения сторон такие же, как у камеры в Maya. Затем прикрепляю эту камеру к кости для камеры и на время проигрывания парной анимации переключаю вид на эту камеру.

Как только анимация заканчивается, удаляю камеру и возвращаю вид из дефолтной камеры персонажа.

(Удаление камеры — это костыль.)))

Вот, по сути, функциональный прототип готов. Дальше я стал дорабатывать анимации.

ВАЖНО - на нем нужны готовые анимации на этом этап -нам нужны маханики , тайминги , и базовое аи для врага

Доработка

В первую очередь занялся ударами и хит-реакциями.

Удары женского персонажа

Ударам добавил шейки.

С помощью :

Blueprint Camera Shake это блюпринт в Unreal Engine, который задаёт эффект тряски камеры.

В нём настраиваются смещение, вращение, FOV, сила и длительность тряски. Используется для ударов, взрывов, отдачи оружия, бега и других событий.

Как бешеный скуф собрал боевой прототип в Unreal Engine

Хит-реакции врага

Лучше синхронизировал их с ударами противника.

Для этого я начало хит-реакции чуть-чуть сместил в Animation Montage и чуть-чуть ускорил их прямо в Unreal.

Удары врага

Он бьёт серию из двух ударов.

Мне не хотелось делать удары назад для врага, поэтому я сделал такой трюк.

Поставил Motion Warping в момент второго удара врага: если игрок перед нами — это обычный удар, если забегает за спину — это удар с разворота.

Motion Warping динамически изменяет Root Motion анимации, чтобы персонаж точно пришёл в заданную точку и повернулся в нужном направлении. Например, подошёл точно к врагу для добивания.

Для хит реакций девушки был такой же подход , как и для хит реакций врага

Повороты

У меня их всего два: на 180° влево и вправо.

Для них я использовал ноду Offset Root Bone.

Она позволяет на основе одной turn-анимации, например на 180°, получать повороты на 135°, 120° и другие углы. Суть в том, что реальный поворот капсулы/актора и поворот Root Bone в анимации могут не совпадать, а Offset Root Bone сглаживает и компенсирует эту разницу.

Например, у нас есть анимация на 180°.

Но в игре врагу нужно повернуться только на 135°.

Мы поворачиваем Actor / Capsule на 135°.

Анимация при этом содержит Root-поворот на 180°.

Offset Root Bone видит разницу между Capsule и Root Bone.

Эту разницу он компенсирует, то есть сглаживает.

Конечно, не стоит ждать, что из анимации на 180° выйдет клёвая анимация поворота на 45°.

Парные анимации

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

Парирование

Условия такие: если во время замаха врага мы ударим его, то сработает Parry Action.

Анимация у женского персонажа сделана универсально, чтобы было неважно, бьём мы слева или справа: она работает плюс-минус одинаково.

На этом все

269
63
22
8
4
4
3
2
1
1
1