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.