- Unreal Engine Line Trace
- Line Trace By Channel
- Параметры Line Trace By Channel
- Входящие параметры
- Исходящие параметры
- Практика в Unreal Engine: Стандартная методика работы с Line Trace By Channel
- Создание Актора для трассировки линии
- Функция Line Trace By Channel
- Расчёт параметра Start
- Расчёт параметра End
- Другие параметры Line Trace By Channel
- Другие разновидности функций Line Trace
- Line Trace By Profile
- Line Trace For Objects
- Multi Line Trace
- Sphere Trace
- Box Trace
- Capsule Trace
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим инструменты трассировки в Unreal Engine (UE4, UE5) на примере Line Trace. А также подробно разберём методику настройки функции Line Trace By Channel, позволяющую в Анрил Энджин производить трассировку линии по определённому каналу.
В дополнении к этому рассмотрим и другие функции, позволяющие производить трассировку по профилю, по типам объектов, мульти трассировку, трассировку сферы, бокса и капсулы.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Unreal Engine Line Trace
Line Trace в Unreal Engine — это инструмент трассировки, который позволяет провести невидимую линию от одной точки до другой и узнать, пересекает ли эта линия какие-либо объекты в игровом мире. Если пересекает, то Line Trace возвращает подробную информацию об этом пересечении, а именно: об объекте, его материале, нормали поверхности и многом другом.
Данная технология широко используется в играх для создания взаимодействий, обнаружения препятствий, механики стрельбы и других задач, например:
- позволяет узнать, есть ли что-то между двумя объектами;
- определяет, есть ли перед рукой персонажа поднимаемый предмет;
- проверяет, куда можно переместить объект;
- позволяет обнаружить, куда попадёт пуля;
- проверяет, виден ли объект с текущей позиции камеры.
В Анрил Энджин есть целая группа функций языка Blueprint, позволяющих производить трассировку. В целом, они все плюс-минус похожи, различаясь друг от друга только небольшими деталями. Поэтому подробно мы обсудим только одну из них — Line Trace By Channel, разобрав все параметры, основу и принципы её работы. А у остальных функций уже рассмотрим детали.
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 от третьего лица. Для визуального удобства добавим внутрь Актора куб.
Функция Line Trace By Channel
Во вкладке Event Graph созданного Актора добавим функцию Line Trace By Channel по вызову события Event Tick. То есть, таким образом мы на каждом тике будем из нашего Актора выпускать трассировочную линию.
Расчёт параметра Start
Рассчитаем параметр Start — начальную точку трассировочной линии.
В качестве начальной точки линии используются координаты какого-либо элемента внутри Актора. Если Line Trace выпускается из главного персонажа (игрока), то в качестве такого элемента обычно берут координаты камеры, через которую игрок наблюдает за игровым миром. Либо же, используют центровую точку самого Актора.
В нашем случае мы воспользуемся центровой точкой куба, который мы разместили в нашем Акторе ранее.
Итак, нодой Get Cube получим ссылку на этот куб, и функцией Get World Location получим расположение этого куба в мировых координатах. Что, в нашем случае и будет являться стартовой точкой для Line Trace.
Скриншот
Код на BlueprintUE
Расчёт параметра End
Расчёт параметра End, конечной точки трассировочной линии, немного сложнее. Суть тут такая. Всё вычисление также ориентируется на стартовую точку линии. От координат стартовой точки мы рассчитаем направление, по которому необходимо проложить линию, и после добавим необходимую длину линии, тем самым мы получим точку End.
Итак, в качестве стартовой точки в нашем примере мы используем куб. Рассчитаем направление относительно него. Направлять линию мы будем вперед. Поэтому, используя функцию Get World Rotation, получим поворот куба относительно мировых координат. Далее, от этого поворота функцией Get Forward Vector получим вектор направления вперед. Именно по этому вектору мы и направим нашу линию.
Так как полученный вектор единичный, то есть имеет длину, равную 1, то необходимо увеличить его длину. Для этого этот вектор просто умножим на 1000. Тем самым длина нашей трассировочной линии будет равняться 1000 см.
Далее этот вектор «Вперед» длиной 1000 добавим к координатам стартовой точки. В итоге мы получим координаты точки End, отложенной от точки Start по направлению вперед на расстоянии 1000 см.
Скриншот
Код на BlueprintUE
Другие параметры Line Trace By Channel
Параметр Trace Channel оставим как был по умолчанию, то есть учитывать пересечения линии будем по каналу «Visibility».
Trace Complex оставим выключенным, так как нам не нужно использовать вычисление пересечений по сложным коллизиям.
Actors to Ignore оставим пустым, так как нам не нужно игнорировать никакие акторы. Но если Вы всё же захотите добавить какие-то акторы для игнорирования, то обычно это делается через ноду Make Array, внутрь которой Вы уже сможете добавить любое количество Акторов для игнорирования пересечения.
Draw Debug Type — установим на значение For One Frame. Таким образом линия будет визуализироваться только в течение одного кадра. А это нам и нужно, так как изначально функция Line Trace By Channel у нас запускается по событию Event Tick, то есть каждый кадр. И выпущенная линия будет видна только этот один кадр. В следующий кадр уже будет построена новая линия.
Ignore Self — оставим, как был по умолчанию, включённым, чтобы игнорировать пересечение Актора с собой же, то есть с нашим кубом.
Остальные настройки для отладочного режима оставим по умолчанию.
В итоге получим следующий код, настраивающий функцию Line Trace By Channel. Данный код у Вас будет повторятся при каждом использовании данной функции. С той лишь разницей, что будет меняться исходный объект, от которого Вы будете получать координаты в мировом пространстве. Ну а также будет различаться длина самой линии.
Скриншот
Код на BlueprintUE
Другие разновидности функций Line Trace
Line Trace By Profile
Line Trace By Profile — осуществляет трассировку линии, фильтруя объекты для столкновения по профилю (пресету) коллизии. Подробнее о пресетах коллизии Вы можете прочитать в статье: Collision Presets. Необходимый профиль выбирается в параметре Profile Name. Функция фиксирует только первое попавшееся столкновение в рамках выбранного профиля.
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) — данные функции точно также осуществляют трассировку линии по каналу, профилю или по типам объектов, но в данном случае фиксируются пересечения уже не с одним первым попавшимся объектом, а с многими объектами на всей протяжённости линии до первого блокирующего столкновения.
То есть, данные функции возвращают массив пересечений Out Hits с объектами, с которыми линия пересеклась (у данных объектов должна быть установлена реакция на пересечение с Line Trace, как Overlap). До первого пересечения линии с объектом, у которого реакция на пересечение с Line Trace, будет установлена как Block.
Sphere Trace
Функции Sphere Trace (By Channel, By Profile, For Objects), Multi Sphere Trace (By Channel, By Profile, For Objects) — работают точно по такому же принципу как соответствующие функции Line Trace, только выпускают не трассировочную линию, а длинную объёмную сферу.
Для настройки самой сферы в этих функциях существует отдельный параметр Radius (float), который задаёт радиус трассировочной сферы.
Требуются такие функции тогда, когда нужно поймать пересечение с объектом не в одной точке, которая даёт линия, а в более широком объёмном пространстве.
Box Trace
Функции 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.
Требуются такие функции тогда, когда нужно поймать пересечение с объектом не в одной точке, которая даёт линия, а в более широком объёмном пространстве.
Capsule Trace
Функции 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) — высота капсулы.
Требуются такие функции тогда, когда нужно поймать пересечение с объектом не в одной точке, которая даёт линия, а в более широком объёмном пространстве.
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.