- Unreal Engine Event Hit
- Event Actor Begin Overlap (End Overlap)
- Практика в Unreal Engine №1. Добавляем импульс к объекту, с которым столкнулся снаряд. Событие Event Hit
- Фильтрация объектов
- Добавление импульса к объекту
- Практика в Unreal Engine №2. Добавляем взрыв при столкновении объектов. Событие Event Hit
- Изменение кода добавления импульса
- Spawn Emitter at Location
- Эффект взрыва P_Explosion
- Практика в Unreal Engine №3. Замедляем игровое время по пересечению. События Event Actor Begin Overlap (End Overlap)
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим и разберём на нескольких практических примерах события столкновения и пересечения класса Actor в Unreal Engine (UE4, UE5), а именно события Event Hit, Event Actor Begin Overlap и Event Actor End Overlap.
Unreal Engine Event Hit
Unreal Engine Event Hit — событие столкновения. Вызывается в момент столкновения текущего Актора с другим объектом или же в момент столкновения другого объекта с текущим Актором. Данный процесс возможен, например, при передвижении персонажа или при перемещении объекта с помощью блюпринт функций с включённой опцией sweep (проверка столкновений). А также при симуляции физики.
Для вызова события Event Hit коллизии обоих объектов должны быть настроены на взаимное блокирующее взаимодействие (Block).
Для регистрации столкновений в результате симуляции физики у компонента, который будет сталкиваться, обязательно должны быть включены опции:
- Simulate Physics = True в разделе Details / Physics;
- Simulation Generates Hit Events = True в разделе Details / Collision.
Событие Event Hit содержит в себе множество выходящих параметров, характеризующих столкновение. В том числе и структуру результата столкновения Break Hit Result. Рассмотрим их подробнее.
Выходящие параметры:
- My Comp (ссылка на объект Primitive Component) — компонент, который непосредственно участвовал в столкновении. Принадлежит текущему Актору.
- Other (ссылка на объект Actor) — другой объект, который столкнулся с текущим Актором.
- Other Comp (ссылка на объект Primitive Component) — компонент, который непосредственно участвовал в столкновении. Принадлежит другому объекту, который столкнулся с текущим Актором.
- Self Moved (bool) — параметр, возвращающий информацию о том, находился ли текущий Актор в движении. True — Актор был в движении и спровоцировал столкновение. False — стоял на месте, а столкновение спровоцировал другой объект, при этом направления Hit Normal и Hit Impact Normal будут скорректированы, чтобы указать силу, с которой другой объект воздействовал на текущий Актор при столкновении.
- Hit Location (vector) — точка столкновения в координатах мирового пространства.
- Hit Normal (vector) — вектор направления столкновения (нормаль). Измеряется в мировых координатах.
- Normal Impulse (vector) — вектор силы, с которой столкнулись объекты. Возвращает значение только для объектов с симулируемой физикой. Если столкновение было в результате передвижения, а не по причине симуляции физики, то возвратится нулевое значение.
- Hit (struct) — структура, содержащая данные результата столкновения объектов. Для удобства, данная структура командой Break (через правую кнопку мыши) переходит в отдельную ноду Break Hit Result.
Break Hit Result в игровом движке Анрил Энджин представляет собой сложную структуру, включающую множество переменных, которые позволяют точно описать характер взаимодействия объектов в случае их столкновения (координаты, объекты, компоненты, нормаль и прочее).
Детальное описание этой ноды с разбором всех её параметров и примерами кода Вы можете изучить в статье: Break Hit Result
Работу с событием Event Hit в Unreal Engine мы разбёрем на практических примерах №1 и №2 ниже в данной статье.
Event Actor Begin Overlap (End Overlap)
Unreal Engine Event Actor Begin Overlap — событие начала пересечения текущего Актора с другим объектом.
Event Actor End Overlap в UE5 (UE4) — событие окончания пересечения текущего Актора с другим объектом.
Для вызова обоих событий Event Actor Begin Overlap и Event Actor End Overlap коллизии компонентов обоих пересекающихся объектов не должны быть настроены на игнорирование (Ignore), и при этом хотя бы у одного объекта коллизия должна быть настроена на пересекающее взаимодействие (Overlap).
Также в обязательном порядке у пересекающихся компонентов обоих объектов опция Generate Overlap Events в разделе Details / Collision должна быть включена. Правда, стоит также отметить, что по умолчанию в Unreal Engine она уже включена.
Выходящий параметр:
- Other Actor (ссылка на объект Actor) — другой объект, который пересекается с текущим Актором.
Работу с событиями Event Actor Begin Overlap и Event Actor End Overlap в Unreal Engine мы разбёрем на практическом примере №3 ниже в данной статье.
Практика в Unreal Engine №1. Добавляем импульс к объекту, с которым столкнулся снаряд. Событие Event Hit
Для текущей практики мы воспользуемся полностью готовым блюпринт кодом из стандартного шаблона игры от первого лица движка Unreal Engine (UE5). При этом разобрав весь код относительно события Event Hit, описываемого в данной статье.
В следующем же примере мы немного доработаем этот код, добавив в него некоторый функционал.
Задача: использовав обработку события столкновения, придать импульс к объекту, с которым столкнулся снаряд. После чего данный снаряд нужно удалить.
Итак, в шаблоне проекта игры от первого лица откроем Blueprint снаряда «BP_FirstPersonProjectile». В Event Graph которого мы найдём обработку одного единственного события — Event Hit. Напомню, данное событие вызывается в момент столкновения текущего Актора (снаряда Projectile) с другим объектом.
Фильтрация объектов
В нашем примере в момент столкновения снаряд должен взаимодействовать только с объектами, у которых включена симуляция физики (синие кубы). Поэтому необходимо отфильтровать данные объекты.
Для этого воспользуется выходным параметром Other Comp события Event Hit. Данный параметр возвращает компонент объекта, с которым столкнулся текущий Актор. При помощи ноды Branch отфильтруем эти объекты, подав во входной параметр Branch результат выполнения ноды Is Simulating Physics, которая в свою очередь, подключена к Other Comp события Event Hit. Нода Is Simulating Physics вернёт нам информацию, включена ли физика у компонента или нет.
При этом может возникнуть вопрос, почему мы проверяем именно компонент другого Актора, а не сам другой Актор?
Всё просто, потому что симуляция физики подключается именно у компонента Актора, а не у самого Актора.
Добавление импульса к объекту
После того как мы отфильтровали нужные нам объекты, добавим им импульс по направлению скорости текущего Актора (снаряда Projectile). Импульс мы можем добавить нодой Add Impulse at Location (добавить импульс по месторасположению). Для этого в ноду нужно подать несколько параметров.
Первый параметр — Target, то есть тот объект, которому нужно придать импульс. В качестве объекта добавим туда компонент объекта, с которым столкнулся снаряд. Опять же, добавляем именно компонент, а не Актор, так как импульс добавляется именно для физики, а она, в свою очередь, подключается у компонентов.
Далее нужно настроить параметр Impulse (сам импульс). А точнее вектор его скорости (направление и скорость). Как уже говорилось ранее, направление импульса будет таким же, как и направление самого снаряда. Только скорость будет выше.
Для расчета вектора импульса воспользуемся нодой Get Velocity, которая вернёт вектор направления скорости текущего Актора (снаряда). Далее увеличим эту скорость, умножив вектор на 100. Получившийся результат подадим в параметр Impulse ноды Add Impulse at Location.
Для заполнения последнего параметра Location (место, откуда должен начаться импульс) подадим координаты текущего Актора, которые вернет нода Get Actor Location.
Ну и последний пункт. После добавления импульса удаляем текущий Актор (снаряд) нодой Destroy Actor.
Скриншот
Код на BlueprintUE
Практика в Unreal Engine №2. Добавляем взрыв при столкновении объектов. Событие Event Hit
Продолжим работу с примером из предыдущей практики и немного доработаем код, добавив небольшой взрыв при столкновении снаряда с кубом, симулирующим физику.
Изменение кода добавления импульса
Но, прежде чем мы будем создавать взрыв при столкновении, я хотел бы немного изменить код добавления импульса. Дело в том, что код, который мы рассматривали в предыдущей практике, — это код из стандартного шаблона Unreal Engine, и я его нисколько не изменял, просто описал весь процесс, какой он есть.
В этой же практике мы внесём свои доработки, а именно изменим расчет Location начала импульса. В предыдущем примере в качестве координат начала импульса были взяты координаты самого Актора (снаряда). Но это не совсем правильно, так как координаты Актора вычисляются относительно его Pivot точки, которая находится в центре сферы снаряда. Для старта импульса лучше же взять координаты непосредственно самой точки столкновения. А это не что иное, как параметр Hit Location в событии Event Hit.
Итак, подадим в параметр Location ноды Add Impulse at Location координаты Hit Location.
Spawn Emitter at Location
Далее добавим эффект взрыва при столкновении. Сделать это можно с помощью ноды Spawn Emitter at Location. Разместим эту ноду сразу после добавления импульса. И после неё уже удалим текущий Актор нодой Destroy Actor.
В Spawn Emitter at Location нам также нужно настроить 3 параметра. Первое, что мы настроим, это Location, то есть месторасположение эффекта (нашего взрыва). Расположим взрыв на месте столкновения. Соответственно, подадим в этот параметр значение Hit Location из Event Hit.
Далее при размещении эффекта нужно настроить Rotation (поворот) в зависимости от направления столкновения. Но в нашем случае, по идее, для взрыва поворот можно не настраивать, потому что как его не поворачивай, всё равно будет один и тот же объёмный взрыв. Поворот понадобится, например, при размещении декали со следом пули на стене, чтобы след был правильно ориентирован относительно столкновения.
Но всё же, для примера, рассчитаем поворот и для взрыва. Итак, в событии Event Hit имеется параметр Hit Normal — вектор направления удара (нормаль). Основываясь на этом векторе при помощи ноды Rotation From X Vector, получим необходимый поворот по оси X относительно вектора нормали. Далее этот поворот подадим в параметр Rotation для спавна эффекта.
Эффект взрыва P_Explosion
И наконец, последнее, что необходимо сделать — это выбрать сам эффект взрыва. Для этого необходимо настроить параметр Emitter Template и выбрать эффект P_Explosion. Однако стоит отметить, что в стандартном шаблоне от первого лица в Unreal Engine этот эффект отсутствует.
Тем не менее, он доступен в пакете Starter Content, который можно добавить как при создании любого проекта в Unreal Engine, так и непосредственно в самом проекте. Для этого нужно перейти в Content Browser, в верхнем левом углу нажать кнопку Add и в появившемся меню выбрать пункт Add Feature or Content Pack. В открывшемся окне следует выбрать раздел Content и нажать на кнопку Starter Content. После этого эффект взрыва P_Explosion станет доступен для выбора.
Скриншот
Код на BlueprintUE
Практика в Unreal Engine №3. Замедляем игровое время по пересечению. События Event Actor Begin Overlap (End Overlap)
Задача: создать объём, попав в который у игрока замедлится игровое время. При выходе из него скорость течения времени должна восстановиться обратно.
Данный пример будем реализовывать в стандартном шаблоне игры Unreal Engine (UE5) от третьего лица.
Создадим пользовательский блюпринт BP_TimeDilation класса Actor. Данный объект будет играть роль объёма, попав в который, у игрока будет замедляться скорость течения времени. Далее весь код будем описывать именно в нём.
Добавим в этот Актор компонент Box Collision. Придадим коллизии компонента необходимые размеры, перейдя в настройки Details / Shape / Box Extend. А также установим для коллизии её видимость в игре, выключив параметр Details / Rendering / Hidden in Game.
Далее перейдем в Event Graph и добавим событие Event Actor Begin Overlap, которое вызывается по пересечению текущего Актора с другим объектом. По этому пересечению мы и будем замедлять время.
Но, нам нужно, чтобы регистрировалось пересечение только с игроком. Поэтому проверим Актор, который возвращается в выходном параметре Other Actor события Event Actor Begin Overlap. Он должен быть равен объекту, которым управляет в данный момент игрок. Этот объект мы можем получить функцией Get Player Character. Сравним оба объекта, и если они равны, то есть пересечение произвел игрок, то через поток True ноды Branch установим замедление времени на 70%.
Само замедление мы реализуем через функцию Set Global Time Dilation, установив в её параметре значение 0.3. То есть, скорость течения времени будет установлена на 30% от исходного состояния.
Далее по выходу из коллизии нам нужно вновь восстановить скорость течения игрового времени. За регистрацию окончания пересечения с другим объектом отвечает событие Event Actor End Overlap. Поэтому восстановим скорость времени по вызову данного события. Дальнейший код будет полностью совпадать с тем кодом, который я описывал для замедления времени. Единственное, у функции Set Global Time Dilation нужно установить её параметр на 1, то есть 100% скорости течения времени.
Скриншот
Код на BlueprintUE
Так как код у обоих событий полностью идентичен и отличается только значением параметра функции Set Global Time Dilation, то правильнее всего, чтобы не «копипастить» один и тот же код, инкапсулировать его в отдельную пользовательскую функцию, в которой вывести параметр замедления времени. И затем эту функцию просто вызывать в событиях Event Actor Begin Overlap и Event Actor End Overlap с разным значением параметра замедления времени. В данном же примере я решил не делать отдельных функций, чтобы не отвлекаться от темы текущей статьи.
На этом, с разбором событий столкновения и пересечения в данной статье мы закончили. Но, вы можете изучить другие многочисленные события игрового движка в нашей обобщающей статье: Unreal Engine Events.