Unreal engine 5
September 6, 2022

UE 5. Настройка движения камеры.

Продолжаю наращивать блюпринтами проект после реализации навигационной системы.

Прошлые статьи:

  1. https://teletype.in/@gonalulu.fm/85sDT58QIMx
  2. https://teletype.in/@gonalulu.fm/uVCTHboXnb7

Задачи на сегодня, исхожу из шаблона проекта Top Down:

  • приближение/удаление камеры для главного персонажа;
  • облет камерой персонажа;
  • регулирование угла наклона камеры.

Данные задачи относятся к управлению в игре. Поэтому предварительно надо заполнить настройки проекта вкладка Input. Blueprint будем создавать для объекта контроллера Content/TopDown/Blueprints/BP_TopDownController.

Настройки проекта (input):

Здесь добавлено несколько обработчиков, а именно:

  • SetMouseWheelUp - приближение камеры к персонажу;
  • SetMouseWheelDown - удаление камеры от персонажа;
  • SetMousePitch - смена угла наклона к персонажу;
  • SetMouseYaw - вращение вокруг персонажа.

В порядке очередности:

SetMouseWheelUp - срабатывает, когда колесико мышки крутится вверх.

По шагам, что тут происходит, после срабатывания события (прокрутить колесо мышки вверх), Получаю указатель на управляемую пешку, преобразовываю к объекту главного персонажа, получаю из персонажа объект SpringArm. Читаю параметр TargetArmLength - это длина нашего “плеча”, на котором висит камера, после чего модифицирую этот параметр и присваиваю обратно. В этом случае отнимаю 100 единиц на один щелчок колесика. НО, есть ограничение на 1000 единиц, ближе камеру приблизить нельзя. По простому: получили параметр, модифицировали, присвоили.

SetMouseWheelDown - все тоже самое, только камеру удаляем, т.е. увеличиваем параметр TargetArmLength. Ограничение в 3500 единиц. Скрин приводить не буду.

SetMousePitch - срабатывает при перемещении мышки от себя/ к себе (Y координата). Вот blueprint:

Страшно? Ну, не очень.

По шагам, что относится к заданной функциональности:

  • беру указатель на пешку, преобразовываю в объект главного персонажа (не обращаем внимание на “лишние” ноды), получаю объект SpringArm (“плечо”, на котором висит камера);
  • (тут внимательно) получаю вектор вращения плеча (текущий), это три параметра. Кому не понятно, поищите в гугле “Roll, Pitch, Yaw” - там на картинке с самолетом все станет ясно, кто и за что отвечает. В этом случае меня интересует параметр Pitch, что понятно из наименования события. Нода называется Get Relative Rotation и надо кликнуть ПКМ по выходному параметру и попросить развернуть выходное значение (Split Struct Pin);
  • прибавляем к Pitch некую дельту, в этом случае дельта указана в настройках проекта, вкладка input;
  • проверю попадание параметра в диапазон от -15 градусов до -60 градусов;
  • Make Rotator “собирает” все параметры в одну структуру;
  • Присваиваем новое значение поворота в плечо;
  • По простому - получили параметр, модифицировали, присвоили.

Ниже объясню ноды, которые пропустил.

SetMouseYaw - перемещение мышки вправо/влево (X координата). Все берем из предыдущего примера, только правим параметр Yaw.

Почти все работает. Только хотелось бы крутить камеру при зажатой правой кнопки мыши. Ок, делаем. И еще хотелось бы гасить курсор при нажатой правой кнопке мыши. И еще хотелось бы отключить перемещение курсора мыши, чтобы при вращении не упираться в границы экрана.

Для этого добавляем параметры к объекту контроллера (Variables):

LookModeOn Boolean - это флаг, который будет подсказывать, что игрок зажал кнопку.

MouseX, MouseY Integer - координаты курсора мышки.

Делаем обработчик события нажатия на ПКМ:

Это событие системное, его в настройках проекта прописывать не надо. При нажатой ПКМ работает верхняя ветка, когда отпускаем - нижняя ветка.

Нажата ПКМ: присваиваю True LookModeOn, отключаю отрисовку курсора мышки, запоминаю текущие координаты в переменные. Truncate тут лишние на самом деле, но что-то тут с типами напутано, получаю float, а присваивать надо integer. Хотя не исключаю, что я что-то не понял.

Отпускаю ПКМ: сбрасываю LookModeOn в False, устанавливаю курсор мышки по старым координатам, включаю отрисовку курсора.

Надеюсь, теперь стало понятнее по работе “пропущенных” нодов.

То есть, Pitch и Yaw модифицирую только при нажатой ПКМ (LookModeOn == True), Branch в начале как раз это проверяет. После выполнения обработчиков устанавливаю координаты курсора мышки по старым координатам, которые хранятся в параметрах. Возможно есть способ проще.

Итак, сделано приближение/удаление камеры, вращение вокруг персонажа, изменение угла наклона камеры, все функции снабжены ограничениями возможных значений.