UE 5. Настройка движения камеры.
Продолжаю наращивать блюпринтами проект после реализации навигационной системы.
Задачи на сегодня, исхожу из шаблона проекта Top Down:
- приближение/удаление камеры для главного персонажа;
- облет камерой персонажа;
- регулирование угла наклона камеры.
Данные задачи относятся к управлению в игре. Поэтому предварительно надо заполнить настройки проекта вкладка Input. Blueprint будем создавать для объекта контроллера Content/TopDown/Blueprints/BP_TopDownController.
Здесь добавлено несколько обработчиков, а именно:
- 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 в начале как раз это проверяет. После выполнения обработчиков устанавливаю координаты курсора мышки по старым координатам, которые хранятся в параметрах. Возможно есть способ проще.
Итак, сделано приближение/удаление камеры, вращение вокруг персонажа, изменение угла наклона камеры, все функции снабжены ограничениями возможных значений.