Как бешеный скуф собрал боевой прототип в Unreal Engine
Всем привет! Сегодня рассмотрим подход к созданию вот этого прототипа.
Мой телеграмм канал про анимацию и unreal
Шаг первый: пишем общий план что мы хотим увидеть, какие механики у нас будут и сколько потребуется анимаций.
Краткое описание, однако уже понятно, что нужно сделать.
Дальше я расписываю, что конкретно буду делать на каждом этапе.
После этого я пошёл снимать и собирать референсы.
У меня были разборные гантели и много фантазии
(Роль импровизированной кувалды играют разборные гантели.)
Референсы из TLOU 2 брал для вдохновения.
Персонажей я купил на Fab.
это маркетплейс цифровых ассетов от Epic Games, где можно купить или бесплатно скачать персонажей, окружение, анимации, материалы и другие ресурсы для разработки игр.
Чутка подправил им Skinning в Maya.
Skinning это привязка вершин 3D-модели к костям скелета с помощью весов влияния.
Например, вершины около локтя частично привязаны к плечу и предплечью. Когда кости двигаются, модель плавно деформируется вместе с ними.
Дальше перенёс анимацию с Game Animation Sample на женского персонажа с помощью встроенной Retarget System.
Указываем, с какого персонажа перенести и на какого (и да, это не работает идеально)))).
Важный момент в 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, сила и длительность тряски. Используется для ударов, взрывов, отдачи оружия, бега и других событий.
Хит-реакции врага
Лучше синхронизировал их с ударами противника.
Для этого я начало хит-реакции чуть-чуть сместил в 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.
Анимация у женского персонажа сделана универсально, чтобы было неважно, бьём мы слева или справа: она работает плюс-минус одинаково.
На этом все