[3] Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Анимация движения во все стороны

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Весь цикл статей
  1. Базовая настройка и импорт ассетов

  2. Управление персонажем и камерой

  3. Анимация движения во все стороны

  4. Пространственный инвентарь(Часть 1)

Всем привет.

В этой части настроим анимацию движения во все стороны для персонажа.

Начнем с того что создадим Animation Blueprint для нашего персонажа.

Перейдем в папку Blueprints->Player и нажмем ПКМ. В появившемся меню выбираем Animation Blueprint

Дальше выбираем наш скелет и жмем OK

Назовем созданный блюпринт ABP_Player

Отроем его и перейдем в AnimGraph

Щелкнем ПКМ во Viewport и создадим новую State Machine

Назовем ее Locomotion. Здесь будут наша анимация передвижения.

Вернемся в папку Blueprints->Player и создадим там Blend Space

Назовем его BS_Locomotion

Откроем его и в Axis settings увидим что есть две оси - Horizontal и Vertical

Развернем Horizontal и дадим ей имя Velocity, так как она будет отвечать за скорость. Maximum Axis Value установим на 600(стандартная скорость в Character Movement Component)

Теперь развернем Vertical и назовем ее Direction, она будет отвечать за угол между вектором скорости и Forward вектором актора. Т.е. будет показывать в какую сторону движется персонаж и проигрывать соответствующую анимацию. Минимальное значение будет -180, а максимально 180.

Number of Grid Divisions изменяем на 8

Теперь сетка выглядит следующим образом

В Asset Browser находим анимацию Pistol_Idle

Переносим ее в то положение, когда Velocity и Direction равны 0

Теперь находим анимацию Pistol_WalkFwdLoop

Переносим ее в то положение, когда Velocity = 150, а Direction = 0

Дальше нам нужны анимации для движения персонажа влево под определенными углами

Выставляем их когда Direction становится отрицательным(значит персонаж движется влево). Число в названии указывает на какое значение Direction нужно поставить эту анимацию.

Pistol_StrafeLeft45Loop - -45

Pistol_StrafeLeftLoop - -90

Pistol_StrafeLeft135Loop - -135

Тоже самое проделываем с анимациям когда персонаж движется вправо

Дальше находим анимацию Pistol_WalkBwdLoop и ставим ее когда Velocity = 150, а Direction = 180 и -180

В итоге получается что-то в таком виде

Тоже самое нужно проделать для анимации бега

Все делается аналогично, только теперь устанавливаем на значение Velocity = 600.

Это будет что-то вроде самостоятельной работы)

Получается следующая картина

Вернемся в ABP_Player. Дальше в Locomotion и перетаскиваем BS_Lomotion во Viewport

Соединяем его с Entry

Теперь заходим внутрь BS_Locomotion. Щелкаем ПКМ по Velocity и создаем из нее переменную(Promote to Variable)

Тоже самое проделываем с Direction

Вернемся в AnimGraph и соединим Locomotion с OutputPose

Перейдем в BP_SHCharacter и выделим компонент Skeletal Mesh

В Details нужно установить наш анимационный блюпринт в Anim Class

Теперь если запустить игру будет проигрывать анимация Idle, но анимации Walk и Run нет.

Чтобы они работали необходимо обновлять переменные Velocity(скорость) и Direction(направление).

Начнем с Velocity и сделаем это с помощью блюпринтов.

Перейдем в ABP_Player. Дальше в EventGraph

Слева можно увидеть наши переменные Velocity и Direction

Перетащим Velocity во Viewport и выберем Set Velocity

Функция Try Get Pawn Owner возвращает ссылку на владельца пешки, на нашего персонажа. У которого есть функция Get Velocity, находим ее

Get Velocity возвращает Vector. Чтобы узнать значение скорости нам нужно узнать длину этого вектора с помощью функции Vector Length

И теперь длину этого вектора соединяем с переменной Velocity

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

Перейдем в редактор кода, а именно в заголовочный файл персонажа SHCharacter.h, чтобы это исправить.

В секции protected создадим новую функцию MoveDirection, она будет возвращать тип float(направление движения, если точнее угол между foward вектором и вектором скорости).

Также воспользуемся макросом UFUNCTION со спецификатором BlueprintCallable, чтобы мы воспользоваться этой функцией в блюпринтах.

Теперь перейдем в SHCharacter.cpp и создадим тело функции MoveDirection

Как я говорил выше - это функция будет возвращать угол между foward вектором и вектором скорости

Делать это нужно с нормализованными векторами, т.е. равными 1. Forward вектор по умолчанию нормализован, а вот вектор скорости необходимо нормализовать с помощью функции GetSafeNormal у GetVelocity

Теперь можно найти угол между нашими векторами c помощью скалярного произведения. Для этого у Vector есть функция, которая называется DotProduct.

DotProduct возвращается косинус угла между векторами, чтобы получить значение угла необходимо воспользоваться функцией арккосинуса(Acos), которая находится в библиотеке FMath.

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

Чтобы найти знак угла воспользуемся векторным произведение(CrossProduct)

Так как Acos возвращает угол в радианах, нам нужно преобразовать его в градусы с помощью функции RadiansToDegrees и сразу умножим градусы на знак векторного произведения(SignAngle) по оси Z

Осталось DegreesAngle передать в возвращаемое значение функции.

Теперь вернемся в анимационный блюпринт ABP_Player и вызовем Event Blueprint Initialize Animation

Дальше вызовем функцию Try Get Pawn Owner

Чтобы с помощью Cast получить ссылка на нашего персонажа

Создадим переменную из возвращаемого значения Cast. Для этого необходимо щелкнуть ПКМ по As SHCharacter и потом по Promote to Variable

Назовем переменную Player

После Velocity вызовем Set Direction(переменная, которую создали ранее)

Потом возьмем переменную Player и вызовем функцию MoveDirection, которую создавали в С++ классе, а возвращаемое значение соединим с Direction

И последнее что мы сделаем - это проверим с помощью функции IsValid, что Try Get Pawn Owner возвращает не пустой указатель на персонажа

Теперь если запустить игру и побегать персонажем в разные стороны, будут проигрываться соответствующие анимации.

Тоже самое только в видео:

Подпишись:

Discord - discord.gg/CqZTXY4zwG

VK - vk.com/vlakugames

Youtube - vk.cc/cchfQD

Rutube - https://rutube.ru/channel/23334940/

Источник: https://habr.com/ru/post/676642/


Интересные статьи

Интересные статьи

Эта статья расскажет вам, как я начал бороться с клинической депрессией, используя для этого свое любимое занятие - программирование на c++. Это моя первая статья из цикла статей, который я решил назв...
Думаю, многих любителей электроники зацепила волна обсуждений видео на канале Veritasium ( EN | RU ). Я его видел в рекомендациях на YT, но смотреть не стал, так как заголовок, «Большое заблужден...
stol-p1 — проект Оригами подставки для работы на ноутбуке и планшете, который я разрабатываю с ребятами последние 7 месяцев. Он имеет 5 разных позиции для удобной работы за ноутом...
Начальник заставляет работать по ночам или в выходные? Орёт при всех матом? Позволяет себе пошлые шутки? Коллеги постоянно и настоятельно требуют помощи? Премию так и не дают, а зарпл...
В нашем первом туториале по ретро-играм мы показали, как настраивать инструмент 2D Pixel Perfect и как создавалась графика в эпоху 8-битных игр. В этом посте мы перенесёмся в 16-битную эру. С п...