- Unreal Engine Break Hit Result
- Break Hit Result — описание выходных параметров
- Blocking Hit
- Initial Overlap
- Time
- Distance
- Location и Impact Point
- Normal и Impact Normal
- PhysMat
- Hit Actor и Component
- Hit Bone Name
- Hit Item, Element Index и Face Index
- Trace Start и Trace End
- Практика в Unreal Engine: Используем структуру Break Hit Result для определения столкновения с определённой частью персонажа
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим Break Hit Result — ноду результата столкновения в Unreal Engine (UE4, UE5). Разберём все её параметры. А также закрепим работу с этой нодой на практике, реализовав удаление персонажа при столкновении линии трассировки только с его головой.
Unreal Engine Break Hit Result
В Unreal Engine нода Break Hit Result отвечает за обработку столкновений. Сама по себе данная нода отдельно никогда не используется, а применяется во многих блюпринт-функциях Анрил Энджин как нода, разделяющая выходной пин столкновения (Hit Info, Out Hit). Она задействована в событиях столкновения, в функциях перемещения объектов или трассировки (Line Trace). В общем, везде, где потенциально возможны столкновения объектов и требуется получить информацию о них.
Break Hit Result представляет собой сложную структуру, включающую множество переменных, которые позволяют точно описать характер взаимодействия объектов в случае их столкновения (координаты, объекты, компоненты, нормаль и прочее).
Так как нода результата столкновения используется в различных функциях языка Blueprint, то не все её параметры всегда задействованы. Например, параметры Trace Start и Trace And возвращают информацию только тогда, когда нода применяется в функциях трассировки. Если же вызвать Break Hit Result в событиях столкновения, то эти переменные будут пустыми.
Рассмотрим каждый параметр отдельно.
Break Hit Result — описание выходных параметров
Blocking Hit
Blocking Hit (bool) — возвращает информацию о том, было ли вообще блокирующее столкновение текущего объекта с другим объектом. Соответственно, True — столкновение было, False — столкновения не было.
Данный параметр используют как некий фильтр через ноду Branch. То есть, результат параметра подают в Branch и по ветке True продолжают обработку столкновения.
Initial Overlap
Initial Overlap (bool) — возвращает информацию о том, было ли начальное перекрытие перед фактом столкновения объектов. В этом случае фиксация столкновения происходит уже тогда, когда объекты были пересечены друг с другом.
При Initial Overlap = True некоторые другие параметры Break Hit Result необходимо интерпретировать иначе. Например, значение времени будет равно нулю, точка столкновения (impact point) будет совпадать с местоположением (location). Это происходит потому, что событие столкновения началось мгновенно, когда объекты уже находились в состоянии пересечения.
Time
Time (float) — время в долях от начала перемещения до столкновения (в диапазоне от 0 до 1). Где 0 — начало отсчета, 1 — конечная точка перемещения объекта или конец линии трассировки. Число между 0 и 1 — время столкновения.
Иначе говоря, 1 — это 100% времени построения всей линии трассировки или перемещения объекта без столкновения. Соответственно, если столкновение было в 65% от 1, то Time вернет значение 0.65.
* Если параметр Initial Overlap = True, то Time = 0.
Distance
Distance (float) — реальная дистанция в юнитах (см) от начала перемещения или начала линии трассировки до столкновения. Не может быть больше, чем расстояние перемещения объекта или длина Line Trace.
* Если Initial Overlap = True, то Distance = 0.
Location и Impact Point
Location (vector) — точка столкновения в координатах мирового пространства.
Impact Point (vector) — фактическая точка столкновения в координатах мирового пространства.
В большинстве случаев значение параметра будет равно Location. Различие состоит в методах расчета самой точки. Например, при использовании сложной Complex коллизии, Impact Point даст более точный расчет.
Normal и Impact Normal
Normal (vector) — направление удара. Вектор нормали поверхности, с которой произошло столкновение. Измеряется в мировых координатах. Используется, например, для правильного позиционирования декали на поверхности (расположение и вращение декали столкновения пули со стеной).
Impact Normal (vector) — более точный расчёт вектора нормали поверхности, с которой произошло столкновение, в мировом пространстве.
PhysMat
PhysMat (ссылка на объект Physical Material) — физический материал, по которому был нанесён удар при столкновении. Если такого материала нет, возвращается None.
В качестве примера использования данного параметра можно привести ситуацию, когда нужно определить физический материал, по которому передвигается персонаж. И если персонаж передвигается, допустим, по физическому материалу травы или металлической решетки, воспроизводить соответствующий звук.
Hit Actor и Component
Hit Actor (ссылка на объект Actor) — Актор, с которым произошло столкновение.
Hit Actor используется, чтобы иметь возможность коммуницировать с объектом, с которым произошло столкновение. Например, можно вызвать интерфейсную функцию в этом Акторе.
* Данный параметр будем использовать на практическом примере ниже в статье.
Hit Component (ссылка на объект Primitive Component) — конкретный компонент Актора, с которым произошло столкновение.
Hit Bone Name
Hit Bone Name (name) — имя кости Skeletal Mesh, с которой произошло столкновение.
Если скелета нет вообще, возвращается None.
* Данный параметр будем использовать на практическом примере ниже в статье.
Bone Name (name) — название кости Skeletal Mesh, задетой при трассировке.
Если скелета нет вообще, возвращается None.
Hit Item, Element Index и Face Index
Hit Item (int) — указывает, какой элемент примитива был задет.
Element Index (int) — возвращает индекс задетой части примитива, если он состоит из нескольких частей.
Face Index (int) — возвращает индекс задетой грани, если столкновение произошло с сеткой из треугольников или ландшафтом.
Trace Start и Trace End
Trace Start (vector) — координаты стартовой точки линии трассировки.
Trace End (vector) — координаты последней точки линии трассировки.
Практика в Unreal Engine: Используем структуру Break Hit Result для определения столкновения с определённой частью персонажа
Задача: при помощи Line Trace и ноды результата столкновения Break Hit Result реализовать удаление персонажа при столкновении линии трассировки только с его головой.
Для решения нашей задачи мы будем использовать стандартный шаблон от первого лица в Unreal Engine. Кроме того, на уровень нужно добавить персонажа «BP_ThirdPersonCharacter» из шаблона от третьего лица. Именно этого персонажа мы и будем удалять из игрового уровня, когда LineTrace коснется его головы.
Весь код будет написан в Event Graph персонажа от первого лица «BP_FirstPersonCharacter». Этот персонаж, за которого играет игрок, будет выпускать необходимый нам LineTrace.
- Добавим в игру событие Debug F, которое будет срабатывать, когда игрок нажимает клавишу F. Именно при нажатии клавиши F мы запустим LineTrace.
- Добавим ноду Line Trace By Channel, которая создаёт линии трассировки по определённому каналу. В качестве такого канала в параметре Trace Channel выберем значение Visibility. Кроме того, чтобы увидеть саму линию трассировки, установим параметр Draw Debug Type в значение Persistent (постоянный).
- Чтобы персонаж «BP_ThirdPersonCharacter» реагировал на линию трассировки через канал видимости, откройте этого персонажа и перейдите к его компоненту Mesh. В настройках этого компонента выберите раздел Details и затем Collision. В параметрах Collision Presets установите значение Custom. Затем перейдите в раздел Collision Responses и установите флажок Block для канала Visibility. Это действие заблокирует LineTrace через указанный канал.
- Настроим входные параметры функции Line Trace By Channel, а именно начальную и конечную точки для линии трассировки (Start и End). В качестве координат начальной точки мы используем положение камеры игрока. Для этого воспользуемся нодой Get First Person Camera, которая вернёт ссылку на объект камеры. Затем, с помощью ноды Get World Location, получим местоположение камеры в мировых координатах. Эти координаты мы передадим в качестве параметра для начальной точки.
- Для определения конечной точки End мы также воспользуемся координатами камеры, но переместим их на 500 сантиметров вперёд. Для начала нам необходимо получить вектор направления вперёд. Для этого используем ноду Get First Person Camera, чтобы получить ссылку на объект камеры. Затем с помощью ноды Get World Rotation получим поворот камеры в мировых координатах. И наконец, с помощью ноды Get Forward Vector вернём вектор направления вперёд для камеры. Теперь мы можем перенести эти координаты на 500 сантиметров вперёд, умножив предыдущий результат вектора на 500. Получившееся значение добавим к координатам положения камеры. В результате получим вторую точку End, которая будет построена на основе координат камеры, но смещена на 500 сантиметров вперёд.
- Из Out Hit ноды Line Trace By Channel вызовем ноду результата столкновения Break Hit Result.
- Затем соединим параметр «Блокирующее столкновение» (Blocking Hit) из Break Hit Result с нодой Branch. Если значение этого параметра равно «Истина» (True), то процесс будет продолжен. Это значит, что процесс продолжится только тогда, когда у LineTrace произойдёт блокирующее столкновение.
- После этого проверим, произошло ли столкновение с костью «head» (голова) скелета персонажа. Если параметр Hit Bone Name будет соответствовать «head», то мы продолжим процесс. В противном случае, если значение будет любым другим, включая значение «None», мы не будем предпринимать никаких действий.
- На последнем шаге, после завершения всех проверок на столкновения, мы удалим Актор, с которым столкнулся LineTrace. Для этого используем ноду Destroy Actor, на вход которой подадим Актор, возвращенный параметром Hit Actor из ноды Break Hit Result.
Скриншот
Код на BlueprintUE
Таким образом, при помощи выходных параметров ноды Break Hit Result в Unreal Engine мы обработали результаты столкновения и по необходимым условиям продолжили дальнейший код, а именно удалили персонажа при столкновении линии трассировки с его костью «head».