Весь цикл статей
Всем привет.
В этой части настроим анимацию движения во все стороны для персонажа.
Начнем с того что создадим 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/