Найти тему
GameDevPadlik

Unreal Engine 4: Двигающийся по сцене шарик с коллизиями и регулировкой скорости на Blueprint.

Оглавление

Для запуска хаотично передвигающегося шарика или шариков по сцене, начнем с настроек коллизий на Акторе который летает по сцене.

Блок настроек коллизий Актора
Блок настроек коллизий Актора

Далее в компоненты Актора добавляем два параметра
1. Скорость (Speed) - тип данных Float
2. Направление (Direction) - тип данных Vector

Глазик на против компонента включает возможность редактирования параметров Актора со сцены.
Глазик на против компонента включает возможность редактирования параметров Актора со сцены.

Переходим к логике движения Актора в Blueprint

Полная логика движения Актора в Blueprint
Полная логика движения Актора в Blueprint

Начинаем все с Event Tick, который перетикает в ноду AddActorLocalOffset, эта нода получает данные о местоположении Актора каждый кадр путем перемножения данных (Скорости с направлением и направления с параметром Delta Second экшен ноды Event Tick). На выходе мы получаем новые координаты куда будет двигаться наш Актор. Чтобы мячик не улетал в космос я заблокировал ему ось Z, просто не передавая ей значение.

Расчет направления Актора в Blueprint
Расчет направления Актора в Blueprint

Далее из ноды AddActorLocalOffset мы выводим ноду с данными Breack Hit Result, из которой сразу в проверку выводим информацию о столкновении с объектом (Blocking Hit). И если движение нашего Актора заблокировано (Branch == true) мы устанавливаем параметру Direction новый вектор движения. Новый вектор задается через функцию Get Reflection Vector, который получает информацию о текущем направлении и меняет его.

Проверка на столкновение с объектом и изменение направления.
Проверка на столкновение с объектом и изменение направления.

Далее добавляем логику изменения скорости при столкновении с объектом.

Для начала добавим новый компонент в Акторе, minSpeed который позволит задать минимальную скорость движения нашего Актора.

-6

Далее добавляем блок изменения скорости при столкновении, для этого после проверки на столкновение Branch, ставим ноду Sequence, это просто разветвитель потока. Первый поток при зарегистрированном столкновении пойдет на нашу новую логику, а второй потом на наш предыдущий параметр SET который задает новое направление движения.

В логике изменения скорости, мы проверяем формулу (текущая скорость - (текущая скорость - 10%)) >= Минимальная скорость. Если скорость меньше или равна минимальной то мы записываем в новый параметр скорости результат из компонента minSpeed. А если выше минимальной то снижаем скорость на 10% и ждем следующего столкновения.

Логирование позволяет наглядно следить за изменением параметров.
Логирование позволяет наглядно следить за изменением параметров.

Замеченные баги и трудности.

Поскольку я заблокировал ось Z, то шарики не могут покидать свою плоскость. И у меня была проблема что шары сталкивались и застывали на месте при этом в логе шел бесконечный спам о столкновении с объектом. Либо шары меняли направление но скорость визуально была в разы ниже минимальной.

Эта трудность случилась из-за того что шарики были на разной высоте, по этому ось Z влияла при столкновении друг с другом. Если объектов много, высоту им лучше задать одну.

Настройка оси Z у движущихся Акторов
Настройка оси Z у движущихся Акторов
-9

Надеюсь у Вас всё получится, если будут другие варианты воплощения данной задачи, жду Ваши Блюпринты в комментариях.