Line Trace и другие инструменты трассировки в Unreal Engine

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим инструменты трассировки в Unreal Engine (UE4, UE5) на примере Line Trace. А также подробно разберём методику настройки функции Line Trace By Channel, позволяющую в Анрил Энджин производить трассировку линии по определённому каналу.

В дополнении к этому рассмотрим и другие функции, позволяющие производить трассировку по профилю, по типам объектов, мульти трассировку, трассировку сферы, бокса и капсулы.

Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.

Unreal Engine Line Trace

Line Trace в Unreal Engine — это инструмент трассировки, который позволяет провести невидимую линию от одной точки до другой и узнать, пересекает ли эта линия какие-либо объекты в игровом мире. Если пересекает, то Line Trace возвращает подробную информацию об этом пересечении, а именно: об объекте, его материале, нормали поверхности и многом другом.

Технология Line Trace в Unreal Engine
Технология Line Trace в Unreal Engine

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

  • позволяет узнать, есть ли что-то между двумя объектами;
  • определяет, есть ли перед рукой персонажа поднимаемый предмет;
  • проверяет, куда можно переместить объект;
  • позволяет обнаружить, куда попадёт пуля;
  • проверяет, виден ли объект с текущей позиции камеры.

В Анрил Энджин есть целая группа функций языка Blueprint, позволяющих производить трассировку. В целом, они все плюс-минус похожи, различаясь друг от друга только небольшими деталями. Поэтому подробно мы обсудим только одну из них — Line Trace By Channel, разобрав все параметры, основу и принципы её работы. А у остальных функций уже рассмотрим детали.

Line Trace By Channel

Unreal Engine Line Trace By Channel
Unreal Engine Line Trace By Channel

В Unreal Engine функция Line Trace By Channel используется для трассировки линии в игровом пространстве, чтобы обнаружить объекты, с которыми линия пересекается, но только в рамках определённого канала трассировки, указанного в параметрах данной функции. Если происходит столкновение, функция возвращает подробную информацию о нём, такую как местоположение, нормаль или Актор, с которым произошло это столкновение.

Внимание! Данная функция фиксирует только первое попавшееся столкновение в рамках выбранного канала.

То есть, Trace Channel (канал трассировки) позволяет отфильтровать объекты для взаимодействия. Реакцию объектов на эти каналы можно настраивать отдельно в каждом объекте в его свойствах Collision. А Line Trace By Channel позволяет указать, по какому именно каналу необходимо провести трассировку (например, по каналу «Visibility»).

Кроме стандартных Trace Channels, таких как «Visibility» или «Camera», в свойствах проекта также можно создавать свои пользовательские каналы.

В целом же, подробно о каналах трассировки, их видах и создании своих пользовательских каналах Вы можете прочитать в отдельной статье: Collision Trace Channel.

Здесь же сосредоточимся на разборе самой функции, а именно, на её параметрах и методике работы с ней.

Параметры Line Trace By Channel

Входящие параметры

  • Start (vector) — координаты начальной точки линии;
  • End (vector) — координаты конечной точки линии;
  • Trace Channel (enum) — канал трассировки («Visibility», «Camera» или другие пользовательские каналы), определяющий тип объектов, с которыми будет происходить проверка на столкновение;
  • Trace Complex (bool) — включить для Trace Line обработку столкновения со сложной Complex коллизией объектов. Так как расчет сложной коллизии требует больших вычислительных ресурсов, то данная настройка используется редко. Только в исключительных случаях, где требуется высокая точность определения места столкновения. Более подробно о сложной коллизии Вы можете прочитать в отдельной статье: Complex Collision.
  • Actors to Ignore (array of actors) — массив Акторов, которых нужно игнорировать при проверке столкновений. Массив обычно указывается через ноду Make Array;
  • Draw Debug Type (enum) — отладочный режим (визуальная прорисовка Line Trace). None — отладка выключена, линия прорисовываться не будет. For One Frame — линия будет прорисовываться только в рамках одного фрейма (кадра). For Duration — линия будет отрисована определённое количество секунд, указанное в параметре Draw Time. Persistent — линия будет прорисована постоянно, пока запущена игра.
  • Ignore Self (bool) — игнорировать для пересечения Актора, выполняющего трассировку линии. Обычно данный параметр всегда оставляют включённым, чтобы не фиксировать пересечения Актора с самим собой же.
  • Trace Color (color) — цвет линии трассировки до столкновения с другим объектом в рамках Trace Channel.
  • Trace Hit Color (color) — цвет линии трассировки после столкновения с другим объектом в рамках Trace Channel.
  • Draw Time (float) — количество секунд для прорисовки Line Trace в отладочном режиме For Duration.

Исходящие параметры

  • Out Hit (structure) — фактическая информация о столкновении. Возвращается в форме подробной структуры. Обычно данную структуру расшифровывают отдельной специализированной нодой результата столкновения, изучить которую Вы можете в отдельной статье: Break Hit Result.
  • Return Value (bool) — возвращаемое значение функции при её отработке. Возвращает True, если произошло столкновение, в противном случае — False.

Практика в Unreal Engine: Стандартная методика работы с Line Trace By Channel

Основная сложность в применении функции Line Trace By Channel — это расчет начальной и конечной точек Line Trace. На самом деле, эта функция в Unreal Engine используется достаточно часто. И во всех случаях методика работы с этой функцией, а именно методика расчёта точек Start и End, везде практически одинаковая, с той лишь разницей, что меняются исходные переменные длины линии и её координат. Но обо всём по порядку.

Создание Актора для трассировки линии

Создадим Актор класса Actor с именем BP_LineTrace. В данном случае у меня в примере используется проект шаблона игры UE5 от третьего лица. Для визуального удобства добавим внутрь Актора куб.

Актор BP_LineTrace
Актор BP_LineTrace

Функция Line Trace By Channel

Во вкладке Event Graph созданного Актора добавим функцию Line Trace By Channel по вызову события Event Tick. То есть, таким образом мы на каждом тике будем из нашего Актора выпускать трассировочную линию.

Добавим функцию Line Trace By Channel по вызову события Event Tick
Добавим функцию Line Trace By Channel по вызову события Event Tick

Расчёт параметра Start

Рассчитаем параметр Start — начальную точку трассировочной линии.

В качестве начальной точки линии используются координаты какого-либо элемента внутри Актора. Если Line Trace выпускается из главного персонажа (игрока), то в качестве такого элемента обычно берут координаты камеры, через которую игрок наблюдает за игровым миром. Либо же, используют центровую точку самого Актора.

В нашем случае мы воспользуемся центровой точкой куба, который мы разместили в нашем Акторе ранее.

Итак, нодой Get Cube получим ссылку на этот куб, и функцией Get World Location получим расположение этого куба в мировых координатах. Что, в нашем случае и будет являться стартовой точкой для Line Trace.

Скриншот

Расчёт параметра Start для Line Trace
Расчёт параметра Start для Line Trace

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Расчёт параметра End

Расчёт параметра End, конечной точки трассировочной линии, немного сложнее. Суть тут такая. Всё вычисление также ориентируется на стартовую точку линии. От координат стартовой точки мы рассчитаем направление, по которому необходимо проложить линию, и после добавим необходимую длину линии, тем самым мы получим точку End.

Итак, в качестве стартовой точки в нашем примере мы используем куб. Рассчитаем направление относительно него. Направлять линию мы будем вперед. Поэтому, используя функцию Get World Rotation, получим поворот куба относительно мировых координат. Далее, от этого поворота функцией Get Forward Vector получим вектор направления вперед. Именно по этому вектору мы и направим нашу линию.

Так как полученный вектор единичный, то есть имеет длину, равную 1, то необходимо увеличить его длину. Для этого этот вектор просто умножим на 1000. Тем самым длина нашей трассировочной линии будет равняться 1000 см.

Далее этот вектор «Вперед» длиной 1000 добавим к координатам стартовой точки. В итоге мы получим координаты точки End, отложенной от точки Start по направлению вперед на расстоянии 1000 см.

Скриншот

Расчёт параметра End для Line Trace
Расчёт параметра End для Line Trace

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Другие параметры Line Trace By Channel

Параметр Trace Channel оставим как был по умолчанию, то есть учитывать пересечения линии будем по каналу «Visibility».

Trace Complex оставим выключенным, так как нам не нужно использовать вычисление пересечений по сложным коллизиям.

Actors to Ignore оставим пустым, так как нам не нужно игнорировать никакие акторы. Но если Вы всё же захотите добавить какие-то акторы для игнорирования, то обычно это делается через ноду Make Array, внутрь которой Вы уже сможете добавить любое количество Акторов для игнорирования пересечения.

Добавляем Акторы для игнорирования пересечения через ноду Make Array
Добавляем Акторы для игнорирования пересечения через ноду Make Array

Draw Debug Type — установим на значение For One Frame. Таким образом линия будет визуализироваться только в течение одного кадра. А это нам и нужно, так как изначально функция Line Trace By Channel у нас запускается по событию Event Tick, то есть каждый кадр. И выпущенная линия будет видна только этот один кадр. В следующий кадр уже будет построена новая линия.

Ignore Self — оставим, как был по умолчанию, включённым, чтобы игнорировать пересечение Актора с собой же, то есть с нашим кубом.

Остальные настройки для отладочного режима оставим по умолчанию.

В итоге получим следующий код, настраивающий функцию Line Trace By Channel. Данный код у Вас будет повторятся при каждом использовании данной функции. С той лишь разницей, что будет меняться исходный объект, от которого Вы будете получать координаты в мировом пространстве. Ну а также будет различаться длина самой линии.

Скриншот

Базовая настройка Line Trace By Channel в Unreal Engine (UE4, UE5)
Базовая настройка Line Trace By Channel в Unreal Engine (UE4, UE5)

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Другие разновидности функций Line Trace

Line Trace By Profile

Line Trace By Profile
Line Trace By Profile

Line Trace By Profile — осуществляет трассировку линии, фильтруя объекты для столкновения по профилю (пресету) коллизии. Подробнее о пресетах коллизии Вы можете прочитать в статье: Collision Presets. Необходимый профиль выбирается в параметре Profile Name. Функция фиксирует только первое попавшееся столкновение в рамках выбранного профиля.

Line Trace For Objects

Line Trace For Objects
Line Trace For Objects

Line Trace For Objects — осуществляет трассировку линии, фильтруя объекты для столкновения по типам объектов с точки зрения коллизии. Подробнее о типах объектов Вы можете прочитать в статье: Object Types. Необходимые типы объектов выбираются в параметре Object Types через ноду Make Array, которая создаёт массив из требуемых типов объектов для учёта столкновения. Функция фиксирует только первое попавшееся столкновение в рамках выбранных типов объектов.

Multi Line Trace

Multi Line Trace (By Channel, By Profile, For Objects)
Multi Line Trace (By Channel, By Profile, For Objects)

Multi Line Trace (By Channel, By Profile, For Objects) — данные функции точно также осуществляют трассировку линии по каналу, профилю или по типам объектов, но в данном случае фиксируются пересечения уже не с одним первым попавшимся объектом, а с многими объектами на всей протяжённости линии до первого блокирующего столкновения.

То есть, данные функции возвращают массив пересечений Out Hits с объектами, с которыми линия пересеклась (у данных объектов должна быть установлена реакция на пересечение с Line Trace, как Overlap). До первого пересечения линии с объектом, у которого реакция на пересечение с Line Trace, будет установлена как Block.

Правила возврата массива объектов для Multi Line Trace
Правила возврата массива объектов для Multi Line Trace

Sphere Trace

Sphere Trace (By Channel, By Profile, For Objects), Multi Sphere Trace (By Channel, By Profile, For Objects)
Sphere Trace (By Channel, By Profile, For Objects), Multi Sphere Trace (By Channel, By Profile, For Objects)

Функции Sphere Trace (By Channel, By Profile, For Objects), Multi Sphere Trace (By Channel, By Profile, For Objects) — работают точно по такому же принципу как соответствующие функции Line Trace, только выпускают не трассировочную линию, а длинную объёмную сферу.

Для настройки самой сферы в этих функциях существует отдельный параметр Radius (float), который задаёт радиус трассировочной сферы.

Требуются такие функции тогда, когда нужно поймать пересечение с объектом не в одной точке, которая даёт линия, а в более широком объёмном пространстве.

Результат работы Sphere Trace
Результат работы Sphere Trace

Box Trace

Box Trace (By Channel, By Profile, For Objects), Multi Box Trace (By Channel, By Profile, For Objects)
Box Trace (By Channel, By Profile, For Objects), Multi Box Trace (By Channel, By Profile, For Objects)

Функции Box Trace (By Channel, By Profile, For Objects), Multi Box Trace (By Channel, By Profile, For Objects) — работают точно по такому же принципу как соответствующие функции Line Trace, только выпускают не трассировочную линию, а длинный объёмный бокс.

Для настройки бокса в этих функциях имеются 2 отдельных параметра:

  • Half Size — размер бокса по осям;
  • Orientation — поворот бокса относительно осей X, Y, Z.

Требуются такие функции тогда, когда нужно поймать пересечение с объектом не в одной точке, которая даёт линия, а в более широком объёмном пространстве.

Результат работы Box Trace
Результат работы Box Trace

Capsule Trace

Capsule Trace (By Channel, By Profile, For Objects), Multi Capsule Trace (By Channel, By Profile, For Objects)
Capsule Trace (By Channel, By Profile, For Objects), Multi Capsule Trace (By Channel, By Profile, For Objects)

Функции Capsule Trace (By Channel, By Profile, For Objects), Multi Capsule Trace (By Channel, By Profile, For Objects) — работают точно по такому же принципу как соответствующие функции Line Trace, только выпускают не трассировочную линию, а объёмную капсулу.

Для настройки капсулы в этих функциях имеются 2 отдельных параметра:

  • Radius (float) — радиус капсулы;
  • Half Height (float) — высота капсулы.

Требуются такие функции тогда, когда нужно поймать пересечение с объектом не в одной точке, которая даёт линия, а в более широком объёмном пространстве.

Результат работы Capsule Trace
Результат работы Capsule Trace

Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.

Оцените статью
( 2 оценки, среднее 5 из 5 )
Поделитесь этой статьей со своими знакомыми в социальных сетях, возможно, эта статья кому-то будет полезна
Unreal Engine - это просто
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.