GameDev 3.0. Этап 2.1. Дальний бой. Урок 4. Механика передвижения
- Повороты персонажа на месте с анимацией
- Настройка камеры персонажа
- Ускорение персонажа на Shift
- Замедление персонажа на Alt
- Ограничение наклона камеры
- Замедление времени на клавишу для поиска багов
Повороты персонажа на месте с анимацией
Сейчас создадим довольно-таки сложную функцию, она нужна для поворота персонажа на месте.
Заходим в BP_ThirdPersonCharacter, вызываем Get Control Rotation
Далее выделим все вместе и ПКМ-> Collapse to Function
Назовем эту функцию LimitRotation
Заходим внутрь этой функции и подсоединяем
Сейчас подключим анимацию, когда крутится на месте с этой новой функцией. Также нам надо подключить новую функцию. Добавляем Branch к нашей функции LimitRotation, к нему подключаем Add Actor World Rotation, на Delta Rotation ПКМ -> Split Struct Pin.
Здесь напишем такую логику. Вызываем Get Curve Value, если ничего не появилось, убираем галочку тут
и выбираем функцию из Animation.
К нему подключаем Get Anim Instance, обязательно включаем галочку обратно, чтобы поиск шел быстрее.
Это и есть наш Target. В Curve Name пишем RotationAmount.
Из Return Value вызываем Abs (AbsoluteFloat).
Давайте теперь добавим анимации поворота на месте.
Возвращаемся в BP_ThirdPersonCharacter
2 пина должны быть свободны обязательно. Поэтому перенесем с Then 3 на Then 1.
Создаем переменную Previous Aim Yaw типа Float
С зажатым Alt вынесем в Event Graph
Еще одну переменную Aim Yaw Rate
Возвращаемся в ABP_Manny, находим где у нас Calc Pitch / Yaw и туда с зажатым Ctrl выносим CharacterRef, из него Get Aim Yaw Rate, выводим из него Promote to Variable и переменную так же и назовем Aim Yaw Rate.
Теперь самое время добавить анимации, заходим в AnimGraph, создаем новую State Machine и назовем ее Idle.
Зайдем в Main States -> Locomotion
Удалим Idle, т.к. у нас он будет другой.
Вернемся в Idle State, где удалили MM_Idle
Вытаскиваем, соединяем и называем просто Idle
Найдем и переименуем наши анимации
Укажем при каком условии перейдет в поворот, нажимаем на кругляшек
Откроется новое окно, с переменных вытягиваем RotateL? и соединим. Compile, Save
То же самое с RotateR? Compile, Save
Так же соединим повороты влево и вправо туда-обратно. Для TurnLeft to TurnRight добавим RotateR?
Для TurnRight to TurnLeft добавим RotateL?
Еще нам нужна логика для возврата из поворота в айдл
Теперь из TurnRight в Idle. Копируем из предыдущего, вставим, соединим и поменяем значения: больше, чем -5, но меньше, чем 34.
Ускорим немного анимацию, заходим в саму анимацию, например, TurnLeft и в Details -> Play Rate находим Bind и меняем его на Rotate Rate. И Loop Animation ставим галочку. Compile, Save.
Возвращаемся назад, заходим в TurnRight и так же в Details -> Play Rate находим Bind и меняем его на Rotate Rate. Compile, Save.
То есть для скорости вращения этой анимации мы закрепили к нашей переменной Rotate Rate, которую мы создавали ранее.
Настройка камеры персонажа
Камеру подкрутим, чтобы была ближе к персонажу.
Для этого зайдем в BP_ThirdPersonCharacter, найдем CameraBoom:
В Details меняем значения: Location Z ставим 60, Target Arm Length ставим 300
Это значит, что камера будет более плавнее следить за персонажем.
В будущем, при стрельбе, будем менять эти значения.
Ускорение персонажа на Shift
Сейчас добавим ускорение персонажу при нажатии на клавишу Shift.
Заходим в BP_ThirdPersonCharacter -> EventGraph, в пустом месте ПКМ и пишем Shift и выбираем Left Shift:
Создаем переменную Sprinting? типа Boolean
В Details у Character Movement - Max Walk Speed поставим 450
Замедление персонажа на Alt
Теперь сделаем обратную логику на Alt - замедление.
Скопируем ноды с ускорения. Соединим с Alt по типу Shift.
Теперь нам нужна еще одна переменная, назовем ее Hold?
Заменим Sprinting? на Hold? в обоих нодах.
Теперь, при нажатии на Alt, наш персонаж идет медленней.
Ограничение наклона камеры
Добавим 2 небольшие механики, которые нам понадобятся для последующей работы.
Первая механика - ограничить поворот камеры, чтобы она не смогла слишком сильно подниматься или опускаться.
Заходим в BP_ThirdPersonCharacter -> EventGraph, в пустом месте вызовем Event Begin Play, а если уже есть, то ставим после него Sequence и с него уже разветвление пойдет по событиям.
Вызовем ноду Get Player Camera Manager, из него вызовем Set View Pitch Max (ставим значение 40) и Set View Pitch Min (ставим -45)
Теперь камера ограничена, можно поменять, если потребуется, эти значения.
Замедление времени на клавишу для поиска багов
Это понадобится нам для отладки багов и для поиска идеальных значений разных механик. Назначим на любую кнопку.
В EventGraph нажимаем ПКМ, находим Input, в нем находим Keyboard Events и здесь находим любую кнопку, на которую хотим повесить механику.
Чаще всего можно написать просто название кнопки, н-р, X keyboard, но с некоторыми кнопками это не работает почему-то.
Далее из нее вызовем Flip Flop, из А вызовем Set Global Time Dilation, скопируем ее и на В. В А ставим значение 0,1, а в В ставим значение 1. Compile, Save.
При нажатии на Х время замедлится и мы можем посмотреть баги, значения, которые нам подойдут и т.д. Еще раз нажимая на Х, время вернется в "обычное русло". И так попеременно можно менять, благодаря переключателю Flip Flop.