February 7

GameDev 3.0. Этап 2.1. Дальний бой. Урок 3. Механика передвижения

Возьмем анимации с проекта Lyra, скачаем с EpicGames.

Откроем проект, как скачается.

Это скопируем и подсоединим к WarpingDirection в Return Value, а в Current - WarpingDirection из переменных перетянем.

Все это копируем и на False то же самое ставим, только в первый Target ставим 1, а во второй подключим Direction.

Добавим механику поворота.

Заходим в блюпринт перса BP_ThirdPersonCharacter и вызовем ноду EventTick в EventGraph.

EventTick - это ивент, который будет постоянно выбивать какое-то значение в реальном времени. То есть, когда нам надо постоянно искать какое-то значение, или присваивать, или обновлять, мы можем использовать EventTick .

Из него создаем Sequence, вызовем ноду Get Control Rotation, в ней получаем вращение от нашего контроллера, в нашем случае - от мыши. В ней на Return Value нажимаем ПКМ -> Split Struct Pin

Теперь у нас 3 значения, нам нужна Z (Yaw).

Создаем новую переменную TargetRotation типа Rotator. Вызываем TargetRotation с зажатым Alt, то есть присваиваем эту переменную, отсюда вызываем RInterp to Constant, в Current подсоединим TargetRotation, Interp Speed ставим значение 300 для начала (потом поменяем на 500 в итоге, поэтому ставим сразу 500), к Delta Time вызовем Get World Delta Seconds.

Target также разделим на 3 значения, как и выше: ПКМ -> Split Struct Pin и Z подсоединим с Get Control Rotation -> Z.

Теперь вызовем ноду Set Actor Rotation. Из New Rotation вызываем RInterp to, из Current вызываем Get Actor Rotation, а в Target вызываем TargetRotation, в Delta Time вызовем Get World Delta Seconds, Interp Speed ставим значение 15.

После проверки видим проблему, когда при вращении мышки перс тоже вращается, когда стоим на месте. Исправим это, добавим в Sequence еще 3 пина и логику, которую сделали, перекинем на Then 3 с помощью зажатого Ctrl.

Создадим новую переменную HasMovementInput типа Boolean и с зажатым Alt вытащим и присоединим к Then 0. Здесь будем проверять, движется перс или нет в данный момент.

Для этого вызовем Character Movement, вызываем Get Current Acceleration, также вызываем Get Max Acceleration, из Get Current Acceleration вызываем Vector Length, из него вызываем оператор Divide и разделим значения Current Acceleration на Max Acceleration, теперь проверяем на "больше" оператор Greater и вставляем в HasMovementInput.

Эта логика отвечает, движемся мы или нет в данный момент. Если движемся, то True. Чтобы это работало, добавим Branch и в Condition подключим HasMovementInput. А к True подключим SET.

Запустим, проверим, при вращении перс стоит, не крутится:

Выведем в отдельную функцию для того, чтобы ее использовать еще раз и заново не писать этот код. Выделяем все, кроме Branch и Get Control Rotation и ПКМ -> Collapse to Function

Назовем ее SmoothCharacterRotation. Compile, Save.

Зайдем внутрь функции и тянем за Interp Speed к фиолетовой ноде, появляется галочка Add Pin to Node, отпускаем, у нас появляется Interp Speed.

Выделяем эту фиолетовую ноду и справа в Details меняем название пина на InterpSpeed(const)

Со 2 Interp Speed точно так же соединяем к фиолетовой ноде и назовем InterpSpeed(smooth). Compile, Save.

Выходим назад и теперь мы можем редактировать эти значения снаружи. Ставим значения 500 и 15 соответственно и Compile, Save.