Друзья, приветствую, с Вами Будуев Антон. В данной статье мы разберём класс Actor Component в Unreal Engine (UE5, UE4) или, иначе говоря, Актор компонент. Обсудим, для чего он нужен, когда его использовать. Разберём функции этого класса, события и настройки. Ну и, конечно же, закрепим всё на практическом уроке, разработав свой собственный универсальный компонент для быстрой трассировки линий.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Component в Анрил Энджин
Для начала определимся, что такое Component. Если кратко, то компонент в Анрил Энджин — это часть функциональности, которую можно добавить к объектам класса Actor и другим дочерним от него классам. При этом один и тот же компонент с одной и той же функциональностью можно использовать многократно в разных Actor, изменяя параметры и свойства этой функциональности.
Сами компоненты также разделяются на классы. Среди них имеются 3 основных класса, от которых уже наследуются все остальные. А именно, Actor Component, дочерний от него Scene Component и Primitive Component, дочерний от Scene Component.
Узнать чем различаются все эти классы компонентов друг от друга, а также изучить более детально саму концепцию компонентов в движке Анрил Энджин Вы можете в отдельной статье: Unreal Engine Component.
Ну а в текущей статье мы остановимся на отдельном разборе класса Actor Component.
Actor Component
Actor Component(Актор-компонент) — это базовый класс для всех компонентов в Unreal Engine, которые могут быть присоединены к Actor. Он предоставляет фундаментальные функции и свойства, необходимые для работы компонентов в рамках движка Анрил Энджин (регистрация, создание и уничтожение компонентов, тиковое обновление, сетевая репликация, взаимодействие с редактором). Сам по себе данный класс не выполняет никакой специфической функциональности, но служит основой для создания других классов компонентов, расширяющих возможности Actor.
У класса Actor Component отсутствует функциональность рендеринга и свойства трансформации. Следовательно, он не имеет визуального представления в игровом мире, а также физического местоположения, поворота или масштаба.
Перевод официальной справки: класс Actor Component — это базовый класс для компонентов, определяющих повторно используемое поведение, которое можно добавлять к различным типам Акторов.
Класс Actor Component предназначен только для расчета логики без использования визуализации и трансформации. Применяется он исключительно в тех случаях, когда необходимо рассчитать и обработать какие-либо абстрактные действия, такие как перемещение, управление инвентарём, изменение свойств и атрибутов объектов, а также при реализации других нефизических концепций.
Например, данный класс можно использовать для создания следующих пользовательских компонентов:
управление здоровьем;
нанесение повреждения;
реализация передвижения;
создание логики инвентаря;
сбор ресурсов.
Ярким представителем готового компонента класса Actor Component в Unreal Engine является всем известный компонент передвижения Character Movement, доступный только в Blueprint-классе Character и отвечающий за логику передвижения двуногого персонажа.
Ключевые особенности Actor Component
Create — функционал создания и регистрации компонентов;
Begin Play, End Play — события начала и окончания работы компонента;
Tick — функционал обновления компонента при каждом такте игры;
Destroy — функционал уничтожения объекта компонента;
Replication — поддержка репликации компонентов (при включенной репликации Актора-владельца);
Tags — поддержка тегов для категоризации;
Navigation — возможность влияния компонента на навигацию;
Get Owner — наличие функции, возвращающей ссылку на Актора-владельца.
Наследование класса
Actor Component унаследован от:
Object — базовый класс для всех объектов в Unreal Engine;
Interface_AssetUserData — интерфейс, позволяющий хранить пользовательские данные (AssetUserData).
Основные потомки класса:
Scene Component — компоненты с позицией и ориентацией в пространстве;
Primitive Component — базовый класс для визуальных и физических компонентов;
другие специализированные компоненты, расширяющие функциональность Акторов.
Функция Get Owner
Функция Get Owner в Unreal Engine
Get Owner — специализированная функция класса Actor Component, возвращающая ссылку на Актора-владельца текущего компонента. Эта функция открывает доступ к родительскому Актору изнутри самого компонента, позволяя ему взаимодействовать с поведением и данными своего владельца. Например, с помощью функции Get Owner можно получить доступ к свойствам Актора-владельца, его функциям или другим компонентам. Однако, чтобы избежать проблем со связностью и универсальностью кода, её использование должно быть разумным и осторожным.
Работу с функцией Get Owner мы будем разбирать в практическом уроке ниже в этой статье.
События класса Actor Component
В классе Actor Component, как и во всех других Blueprint-классах, имеются свои события (Events). Всего же в нём доступно 4 встроенных события:
Событие Event Begin Play вызывается когда Actor Component начинает свою игру (работу). Если компонент является статическим, то вызов происходит перед соответствующим событием Begin Play его владельца-Актора. Данное событие обычно используется для инициализации переменных, настройки параметров и других операций, которые нужно выполнить при старте компонента.
Событие Event End Play вызывается, когда компонент заканчивает свою игру (работу). Обычно это происходит при уничтожении компонента функцией Destroy Component или при уничтожении всего владельца-Актора. Данное событие можно применять для сохранения состояния или окончания каких-либо процессов, например, завершения звуковых эффектов.
Возвращаемый параметр: End Play Reason(enum) — перечисление, указывающее причину завершения работы Actor Component. Возможные варианты причин: — Destroyed(уничтожен функцией Destroy); — Level Transition(переход на другой уровень); — End Play In Editor(окончание работы в редакторе); — Removed From World(удалён из мира).
Событие Event Tick вызывается каждый кадр обновления игры, если в настройках компонента в меню Details включена подача тактового сигнала. Предназначено оно для выполнения определённого логического кода в цикле, который необходимо повторять каждый кадр расчёта и рендеринга игры. В тех же настройках меню Details имеется возможность регулировать частоту вызова данного события.
Возвращаемый параметр: Delta Seconds(float) — период (время в секундах) между текущим и предыдущим вызовом этого события.
Детальное описание этого события с тонкостями его использования, настройками и примерами кода Вы можете изучить в статье: Событие Event Tick.
Событие Event Async Physics Tick вызывается каждый кадр в отдельном асинхронном потоке обработки физики. Отлично подходит для расчёта физических симуляций.
* Отдельный асинхронный поток для физики позволяет избежать блокировки основного потока игры, что особенно важно для поддержания высокой частоты кадров.
По умолчанию вызов данного события отключен. Чтобы включить его, необходимо в настройках класса Details в разделе Physics установить для опции Async Physics Tick Enabled значение True.
Возвращаемые параметры: Delta Seconds(float) — период (время в секундах) между текущим и предыдущим вызовом этого события. Sim Seconds(float) — общее время симуляции в секундах с начала вызова события.
Как создать и добавить в Blueprint компонент на основе класса Actor Component
В Unreal Engine процесс создания пользовательских компонентов на основе класса Actor Component аналогичен созданию любых других Blueprint-классов. А именно, необходимо кликнуть по кнопке Blueprint class в контекстном меню Content Browser и в появившемся окне Pick Parent Class выбрать Actor Component. Новый файл компонента будет создан в текущей папке Content Browser.
Чтобы создать Актор-компонент, выберите Blueprint class в контекстном меню Content Browser и в появившемся окне Pick Parent Class нажмите Actor Component
В Blueprint добавление любого готового компонента происходит в окне Components при нажатии кнопки +Add. Пользовательские компоненты в раскрывающемся списке после нажатия +Add будут находиться в разделе Custom.
Пользовательские компоненты в окне Components находятся в разделе Custom
При этом, после добавления все компоненты класса Actor Component всегда будут находится ниже компонентов других классов (Scene и Primitive Component). А в Blueprint-классах Character ниже черты.
Компонент BP_MyActorComponent класса Actor Component находится ниже черты
Настройки Details класса Actor Component
Настройки Details класса Actor Component
Component Tick
Start with Tick Enabled(bool, по умолчанию True) — определяет, будет ли тик компонента включён при запуске. Если значение True, компонент начинает свою работу с активированным тиком (обновлением каждый кадр).
Tick Interval(float, по умолчанию 0,0 сек) — интервал между тиками компонента в секундах. Определяет, как часто компонент будет обновляться (например,0.1 = 10раз в секунду).
Tick Even when Paused(bool, по умолчанию = False) — определяет, тикать ли компоненту, когда игра поставлена на паузу. Если значение True, компонент продолжает обновляться даже во время паузы.
Allow Tick on Dedicated Server(bool, по умолчанию = True) — определяет, будет ли тик компонента работать на выделенном сервере. Если значение True, тик компонента будет работать на выделенном сервере.
Tick Group(по умолчанию During Physics) — определяет группу порядка срабатывания Tick при обновлении кадра. Позволяет задать, когда именно будет происходить тик относительно других систем движка. Возможные варианты групп:
Pre Physics(перед симуляцией физики);
During Physics(во время симуляции физики);
Post Physics(после симуляции физики);
Post Update Work(после всей работы).
Более подробно про данные группы Вы можете изучить в отдельной статье: Tick Group Unreal Engine.
Tags
Component Tags — массив тегов, который используется для группировки и категоризации компонентов в Unreal Engine. Эти теги можно назначать компоненту вручную и затем использовать для удобного поиска, фильтрации или логики в коде и Blueprints. Благодаря возможности доступа из скриптов, теги позволяют гибко организовывать компоненты по смысловым признакам без необходимости создавать отдельные переменные или структуры.
Component Replication
Component Replicates(bool, по умолчанию False) — параметр, который определяет, будет ли данный компонент участвовать в сетевой репликации в Unreal Engine. Использование параметра необходимо, когда компонент содержит важные для геймплея данные или логику, которые должны быть одинаковыми у всех игроков в многопользовательской игре.
True: компонент будет участвовать в сетевой репликации — его состояние и события будут автоматически синхронизироваться между сервером и клиентами. При этом для корректной работы репликации сам владеющий Actor также должен иметь включённую репликацию.
False: компонент не будет реплицироваться и останется локальным, его данные и события не будут передаваться по сети.
Replicate Using Registered Sub Object List — параметр, который определяет способ репликации дочерних объектов (Sub Object) компонента. Использование этого параметра удобно для оптимизации сетевой репликации и упрощения кода, особенно когда количество дочерних объектов фиксировано и известно заранее.
True: система репликации будет автоматически реплицировать только те дочерние объекты, которые были явно зарегистрированы в списке зарегистрированных Sub Object. Это упрощает и оптимизирует процесс репликации, так как не требует ручного управления каждым Sub Object.
False: система вызовет виртуальную функцию ReplicateSubObjects(), где разработчик должен самостоятельно реализовать логику репликации всех необходимых дочерних объектов вручную, что даёт больше гибкости, но требует дополнительного кода и контроля.
Репликация Actor Component в Unreal Engine — это процесс синхронизации состояния компонента между клиентом и сервером в многопользовательской игре.
В многопользовательской игре только сервер является «авторитетным» источником правды. Именно на нём происходят все значимые изменения свойств. Это означает, что если какой-либо Actor или его ActorComponent изменяет своё состояние (например, здоровье, позицию, активированность), то эти изменения должны быть переданы от сервера всем клиентам, чтобы игра выглядела одинаково для всех.
Репликация Actor Component тесно связана с репликацией Actor, которому он принадлежит. Если Actor не реплицируется, то и его компоненты не могут быть реплицированы.
Activation
Auto Activate(bool, по умолчанию False) — определяет, будет ли компонент автоматически активирован сразу после создания или его нужно активировать явно. Это удобно для управления поведением компонентов, которые должны работать только при определённых условиях, а не сразу при запуске. Например, аудиокомпоненты или системы частиц часто используют автоактивацию, чтобы сразу начать проигрывать звук или эффект. В то же время, если нужна более тонкая логика включения — компонент можно оставить неактивным и активировать программно в нужный момент.
True: компонент автоматически активируется сразу после создания и начинает выполнять свою логику без дополнительного вмешательства.
False: компонент остаётся неактивным после создания и требует явного вызова функции Activate для начала работы.
Variable
Editable when Inherited(bool, по умолчанию True) — параметр, который определяет, можно ли изменять этот компонент в дочерних классах Actor, унаследованных от родительского. Свойство полезно для контроля над тем, какие компоненты можно настраивать в дочерних классах, обеспечивая структурированность и предотвращая нежелательные изменения базовых компонентов.
True: компонент можно модифицировать в наследуемых классах Actor, что даёт гибкость при создании вариаций и кастомизации. То есть разработчик может переопределять его свойства или настройки в производных классах или экземплярах.
False: компонент считается неизменяемым при наследовании, его свойства фиксируются на уровне родительского класса.
Cooking
Is Editor Only(bool, по умолчанию False) — параметр, который указывает, будет ли компонент исключён из сборок игры, предназначенных для запуска вне редактора Unreal Engine. Применяется для компонентов, которые нужны только для разработки, отладки или визуализации в редакторе, но не должны влиять на производительность или функциональность финальной игры.
True: компонент существует только в редакторе и не включается в сборки игры вне редактора, что помогает уменьшить размер игры и исключить ненужные для конечного пользователя элементы.
False: компонент включается во все сборки, включая релизные версии.
Asset User Data
Asset User Data — массив пользовательских данных, которые могут быть сохранены вместе с компонентом в Unreal Engine. Этот параметр позволяет добавлять к компоненту дополнительные данные или метаданные в виде объектов, наследующихся от Asset User Data, что даёт гибкость для расширения функционала и хранения информации, не влияющей напрямую на логику компонента.
Asset User Data Editor Only — массив пользовательских данных, который существует только в редакторской сборке Unreal Engine. Этот параметр используется для хранения дополнительной информации, необходимой исключительно в редакторе, и не включается в финальные игровые билды, что помогает уменьшить размер и повысить производительность релизной версии.
Navigation
Can Ever Affect Navigation — параметр, который указывает, может ли данный компонент потенциально влиять на систему навигации в Unreal Engine. Свойство полезно для оптимизации и точного контроля навигации, позволяя исключить из расчётов компоненты, которые не должны влиять на движение AI, и наоборот — включить те, которые создают препятствия или зоны интереса.
True: компонент будет учитываться при построении навигационных данных (NavMesh), например, как препятствие или элемент, изменяющий путь для AI-персонажей.
False: компонент игнорируется системой навигации и не влияет на пути и поведение AI.
Практический урок в Unreal Engine: создаём компонент трассировки на основе Actor Component
При программировании любой игры для многих объектов приходится создавать трассировочные линии. * Что такое трассировка, зачем она нужна и как её создать, Вы можете узнать в отдельной статье: Unreal Engine Line Trace.
Процесс создания линии трассировки, с одной стороны, не является сложным. Однако, с другой стороны, он требует времени. А так как трассировка необходима для многих объектов, приходится повторять свои действия для каждого из них.
Мы можем значительно облегчить себе задачу, используя Components. Именно для этого они и созданы в Unreal Engine. Описав трассировку всего один раз в компоненте, мы можем применять его ко многим объектам. Что позволит значительно ускорить процесс подключения линий трассировки, экономя время.
Задача: при помощи класса Actor Component создать универсальный компонент для трассировки линий как из центра всего Актора, так и из центра любого компонента этого Актора.
Практический урок в Unreal Engine: создаём универсальный Actor Component, выпускающий Line Trace как из центра Актора, так и из центра любого компонента
В данной практике код создания Line Trace детально описываться не будет, так как он подробно разобран в отдельной статье: Line Trace By Channel. Здесь же мы более подробно остановимся именно на текущей теме — Actor Component.
Итак, прежде чем создавать свой компонент, нужно определиться, на основе какого класса его создавать. Если в Вашем компоненте нужно рассчитать только какую-то логику, не используя рендеринг графики и трансформации объекта, то тогда нужно выбирать класс Actor Component. В нашем случае как раз он нам и нужен, так как ни рендеринг графики, ни трансформации объекта нам не нужны. Соответственно, создадим в Unreal Engine на основе Actor Component свой пользовательский компонент BPC_LineTrace(BPC — сокращение Blueprint Component), создающий трассировочную линию.
Компонент у нас будет универсальный, содержащий в себе 2 пользовательские функции. Первая функция LT_ActorPoint будет выпускать трассировочную линию из центра Актора (Pivot Point Actor), вторая функция LT_ComponentPoint — из центра любого компонента (Pivot Point Component). Соответственно, если нам нужна будет трассировка от Актора, мы воспользуемся функцией LT_ActorPoint. Если же от компонента, то функцией LT_ComponentPoint.
Функция LT_ActorPoint
Создадим внутри компонента BPC_LineTrace первую пользовательскую функцию LT_ActorPoint, которая будет выпускать Line Trace из центра Актора.
Пользовательская функция LT_ActorPoint внутри компонента BPC_LineTrace класса Actor Component
Добавим в эту функцию ноду Line Trace By Channel, непосредственно которая и будет генерировать саму трассировку.
Скриншот
Добавим ноду Line Trace By Channel, непосредственно генерирующую трассировку
Код на BlueprintUE
Если код отображается без связей, нажмите сверху кода на кнопку «Graph»
Транслируем основные настройки Line Trace By Channel в нашу функцию LT_ActorPoint, чтобы при вызове функции мы могли настраивать трассировочную линию. А именно, параметры: Trace Channel, Trace Complex, Actors to Ignore, Draw Debug Type, Ignore Self и Draw Time. Для этого кликнем мышкой по каждому параметру и, не отпуская мыши, перенесём его на ноду нашей функции LT_ActorPoint. То же самое сделаем и с возвращаемыми параметрами Out Hit и Return Value, чтобы наша функция возвращала результаты столкновения трассировочной линии. Для этого перенесём их в ноду Return Node.
Скриншот
Транслируем основные настройки Line Trace By Channel в нашу функцию LT_ActorPoint
Код на BlueprintUE
Если код отображается без связей, нажмите сверху кода на кнопку «Graph»
Для того чтобы мы могли настраивать длину линии трассировки, введём в нашей функции LT_ActorPoint ещё один параметр Length типа float и в настройках по умолчанию установим значение 500.
Установим параметр Length типа float со значением 500
Ну и последнее, настроим параметры Start и End(начала и конца линии) в Line Trace By Channel. Напоминаю, подробнее о настройке этих параметров Вы можете узнать в отдельной статье: Line Trace. Единственное, разница в коде данной практики и той статьи заключается в Акторе, от которого мы будем вычислять положение точек. В данном случае мы возьмём ссылку на Actor, владельца нашего компонента, которую возвратит нода Get Owner и от неё функциями Get Actor Location и Get Actor Rotation получим соответствующие значения координат местоположения и вращения Актора. Таким образом положение трассировочной линии будет зависеть от Актора-владельца компонента.
Скриншот
Практический урок в Unreal Engine: Пользовательская функция LT_ActorPoint внутри компонента BPC_LineTrace класса Actor Component, создающая Line Trace из центра Актора
Код на BlueprintUE
Если код отображается без связей, нажмите сверху кода на кнопку «Graph»
Функция LT_ComponentPoint
Сделаем копию функции LT_ActorPoint и на её основе создадим внутри компонента BPC_LineTrace вторую пользовательскую функцию LT_ComponentPoint, которая будет выпускать Line Trace из центра любого компонента.
Данная функция будет похожа на первую, только в качестве объекта, от которого будет вестись расчет координат линии, уже будет выступать не Актор-владелец текущего компонента, а компонент, который мы подадим во входящие параметры данной функции. Поэтому дополним ноду нашей функции LT_ComponentPoint ещё одним входящим параметром с именем Component и типом Object Reference Scene Component. Тип компонента обязательно должен быть Scene Component, так как нам от этого компонента нужно будет брать координаты в мире, а они имеются у компонентов этого класса и дочерних от него.
Добавим в функцию LT_ComponentPoint ещё один входящий параметр с именем Component и типом Object Reference Scene Component
Практический урок в Unreal Engine: Пользовательская функция LT_ComponentPoint внутри компонента BPC_LineTrace класса Actor Component, создающая Line Trace из центра любого компонента
Код на BlueprintUE
Если код отображается без связей, нажмите сверху кода на кнопку «Graph»
Добавление компонента BPC_LineTrace класса Actor Component в многочисленные объекты движка Unreal Engine
Теперь нам осталось немногое — подключить наш компонент к различным объектам и протестировать его работу. Для этого создадим два блюпринта класса Actor: BP_Sphere — с компонентом сферы и BP_Cube_Sphere — с двумя компонентами куба и сферы.
Создадим два блюпринта класса Actor: BP_Sphere — с компонентом сферы и BP_Cube_Sphere — с двумя компонентами куба и сферы
Добавим наш компонент BPC_LineTrace к обоим Акторам.
В Акторе BP_Sphere протестируем работу компонента BPC_LineTrace, выпуская трассировочную линию из центра всего Актора. Для этого в Event Graph Актора BP_Sphere нодой Get BPC Line Trace получим ссылку на наш компонент и далее из него вызовем функцию LT_ActorPoint. Введём соответствующие настройки трассировки: Trace Channel — Visibility; Draw Debug Type — For One Frame и Length — 500. И подключим эту функцию на событие Event Tick. Таким образом, на каждом тике из Актора BP_Sphere будет выпускаться линия трассировки.
Скриншот
Вызов функции LT_ActorPoint Актор-компонента BPC_LineTrace
Код на BlueprintUE
Если код отображается без связей, нажмите сверху кода на кнопку «Graph»
В Акторе BP_Cube_Sphere протестируем работу компонента BPC_LineTrace, выпуская трассировочную линию из центра двух компонентов — Cube и Sphere. Код будет практически таким же, как и в пункте 3, только у компонента BPC_LineTrace вызывать уже будем функцию LT_ComponentPoint, во входящий параметр Component которой, подадим ссылки на компоненты Cube и Sphere. В результате на каждом тике из обоих компонентов Актора BP_Cube_Sphere будут выпускаться линии трассировки.
Скриншот
Вызов функции LT_ComponentPoint Актор-компонента BPC_LineTrace
Код на BlueprintUE
Если код отображается без связей, нажмите сверху кода на кнопку «Graph»
Таким образом, описав в компоненте логику один раз, её можно очень быстро подключать ко многим объектам, экономя при этом время. В этом и кроется суть компонентов движка Unreal Engine и компонентов класса Actor Component в частности.
Функции класса Actor Component
Управление активностью компонента
Функции управления активностью компонента
Activate — активирует компонент (если он не был активным ранее).
Deactivate — деактивирует компонент, останавливая его работу и отключая все связанные действия.
Set Active — устанавливает новое состояние активности компонента.
Set Auto Activate — определяет, будет ли компонент автоматически активирован при начале игры.
Toggle Active — переключает текущее состояние активности компонента
Is Active — возвращает текущее состояние активности компонента.
Управление тиками (Tick)
Функции управления тиками (Tick)
Event Tick — вызывается каждый кадр, если компонент имеет включённый тик. Используется для логики обновления.
Get Owner — возвращает владельца компонента (Актора), к которому он привязан.
Set Is Replicated — устанавливает, будет ли компонент реплицироваться по сети.
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Оцените статью
( 2 оценки, среднее 5 из 5 )
Поделитесь этой статьей со своими знакомыми в социальных сетях, возможно, эта статья кому-то будет полезна