Actor Component в Unreal Engine — разбираем Актор компонент в Blueprint UE5 (UE4)

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим и разберём класс Actor Component в Unreal Engine или, иначе говоря, Актор компонент Blueprint в UE5 (UE4). Обсудим, для чего он нужен, когда его использовать. Разберём функции этого класса, события и настройки. Ну и, конечно же, закрепим всё на практическом уроке, разработав свой собственный универсальный компонент для быстрой трассировки линий.

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

Component в Анрил Энджин

Для начала определимся, что такое Component. Если кратко, то компонент в Анрил Энджин — это часть функциональности, которую можно добавить к блюпринтам класса Actor и другим дочерним от него классам. При этом один и тот же компонент с одной и той же функциональностью можно использовать многократно в разных Actor, изменяя параметры и свойства этой функциональности.

Actor Component, Scene Component и Primitive ComponentСами компоненты также разделяются на классы. Среди них имеются 3 основных класса, от которых уже наследуются все остальные. А именно, Actor Component, дочерний от него Scene Component и Primitive Component, дочерний от Scene Component.

Узнать чем различаются все эти классы компонентов друг от друга, а также изучить более детально саму концепцию компонентов в движке Анрил Энджин Вы можете в отдельной статье: Unreal Engine Component.

Ну а в текущей статье мы остановимся на отдельном разборе класса Actor Component.

Unreal Engine Actor Component

Unreal Engine Actor ComponentUnreal Engine Actor Component — это базовый класс для всех компонентов, которые могут быть присоединены к Actor. Он предоставляет фундаментальные функции и свойства, необходимые для работы компонентов в рамках движка Анрил Энджин. Сам по себе ActorComponent не выполняет никакой специфической функциональности и служит основой для создания пользовательских компонентов, расширяющих возможности Actor.

У класса Actor Component отсутствует функциональность рендеринга и свойства трансформации. Следовательно, он не имеет визуального представления в игровом мире, а также физического местоположения, поворота или масштаба.

Класс Actor Component предназначен только для расчета логики без использования визуализации и трансформации. Применяется он исключительно в тех случаях, когда необходимо рассчитать и обработать какие-либо абстрактные действия, такие как перемещение, управление инвентарём, изменение свойств и атрибутов объектов, а также при реализации других нефизических концепций.

Например, данный класс можно использовать для создания следующих пользовательских компонентов:

  • управление здоровьем;
  • нанесение повреждения;
  • реализация передвижения;
  • создание логики инвентаря;
  • сбор ресурсов.

Ярким представителем готового компонента класса Actor Component в Unreal Engine является всем известный компонент передвижения Character Movement, доступный только в Blueprint-классе Character и отвечающий за логику передвижения двуногого персонажа.

Как создать и добавить в 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 class в контекстном меню Content Browser и в появившемся окне Pick Parent Class нажмите Actor Component

В Blueprint добавление любого готового компонента происходит в окне Components при нажатии кнопки «+Add». Пользовательские компоненты в раскрывающемся списке после нажатия «+Add» будут находиться в разделе Custom.

Пользовательские компоненты в окне Components находятся в разделе Custom
Пользовательские компоненты в окне Components находятся в разделе Custom

При этом, после добавления все компоненты класса Actor Component всегда будут находится ниже компонентов других классов (Scene и Primitive Component). А в Blueprint-классах Character ниже черты.

Компонент BP_MyActorComponent класса Actor Component находится ниже черты
Компонент BP_MyActorComponent класса Actor Component находится ниже черты

Функция Get Owner

Функция Get OwnerGet Owner — специализированная функция класса Actor Component, возвращающая ссылку на Актора-владельца текущего компонента. Эта функция открывает доступ к родительскому Актору изнутри самого компонента, позволяя ему взаимодействовать с поведением и данными своего владельца. Например, с помощью функции Get Owner можно получить доступ к свойствам Актора-владельца, его функциям или другим компонентам. Однако, чтобы избежать проблем со связностью и универсальностью кода, её использование должно быть разумным и осторожным.

Работу с функцией Get Owner мы будем разбирать в практическом уроке ниже в этой статье.

События класса Actor Component

В классе Actor Component, как и во всех других Blueprint-классах, имеются свои события (Events). Всего же в нём доступно 4 встроенных события:

Actor Component Event Begin PlayСобытие Event Begin Play вызывается когда Actor Component начинает свою игру (работу). Если компонент является статическим, то вызов происходит перед соответствующим событием Begin Play его владельца-Актора. Данное событие обычно используется для инициализации переменных, настройки параметров и других операций, которые нужно выполнить при старте компонента.

Actor Component Event End PlayСобытие Event End Play вызывается, когда компонент заканчивает свою игру (работу). Обычно это происходит при уничтожении компонента функцией Destroy Component или при уничтожении всего владельца-Актора. Данное событие можно применять для сохранения состояния или окончания каких-либо процессов, например, завершения звуковых эффектов.

Выходящий параметр:
End Play Reason (enum) — перечисление, указывающее причину завершения работы Actor Component. Возможные варианты причин: Destroyed (уничтожен функцией Destroy); Level Transition (переход на другой уровень); End Play In Editor (окончание работы в редакторе); Removed From World (удалён из мира).

Actor Component Event TickСобытие Event Tick вызывается каждый кадр обновления игры, если в настройках компонента в меню Details включена подача тактового сигнала. Предназначено оно для выполнения определённого логического кода в цикле, который необходимо повторять каждый кадр расчёта и рендеринга игры. В тех же настройках меню Details имеется возможность регулировать частоту вызова данного события.

Выходящий параметр:
Delta Seconds (float) — период (время в секундах) между текущим и предыдущим вызовом этого события.

Детальное описание этого события с тонкостями его использования, настройками и примерами кода Вы можете изучить в статье: Событие Event Tick.

Actor Component Event Async Physics TickСобытие Event Async Physics Tick вызывается каждый кадр в отдельном асинхронном потоке обработки физики. Отлично подходит для расчёта физических симуляций.

* Отдельный асинхронный поток для физики позволяет избежать блокировки основного потока игры, что особенно важно для поддержания высокой частоты кадров.

По умолчанию вызов данного события отключен. Чтобы включить его, необходимо в настройках класса Details в разделе Physics установить для опции Async Physics Tick Enabled значение True.

Выходящие параметры:
Delta Seconds (float) — период (время в секундах) между текущим и предыдущим вызовом этого события.
Sim Seconds (float) — общее время симуляции в секундах с начала вызова события.

Настройки Details класса Actor Component

Настройки Details класса Actor Component
Настройки Details класса Actor Component

Component Tick:

  • Start with Tick Enabled (bool, по умолчанию True). Начать работу ActorComponent с включенным событием Event Tick.
  • Tick Interval (float, по умолчанию 0,0 сек). Частота срабатывания Event Tick (в секундах). Если значение отрицательное или равно 0, то Tick срабатывает каждый кадр.

Component Tick / Advanced:

  • Tick Even when Paused (bool, по умолчанию = False). Включить срабатывание Event Tick, когда игра стоит на паузе.
  • Allow Tick on Dedicated Server (bool, по умолчанию = True). Разрешить работу Event Tick на выделенном сервере.
  • Tick Group (по умолчанию During Physics). Определяет группу порядка срабатывания Tick при обновлении кадра. Возможные варианты групп: Pre Physics (перед симуляцией физики), During Physics (во время симуляции физики), Post Physics (после симуляции физики), Post Update Work (после всей работы). Более подробно про данные группы Вы можете изучить в отдельной статье: Tick Group Unreal Engine.

Tags:

  • Component Tags — пользовательский массив тегов для текущего объекта Actor Component. Теги используются для группировки и категоризации.

Component Replication:

  • Component Replicates (bool, по умолчанию False). Основной параметр, определяющий процесс репликации Actor Component. Если он установлен в значение True, то Компонент будет скопирован на другие сетевые клиенты, но при этом репликация также должна быть включена у Актора-владельца. В случае установки значения False репликация компонента производиться не будет.

Replication / Advanced:

  • Replicate Using Registered Sub Object List — включить копирование системой списка зарегистрированных подобъектов.

Репликация Actor Component в Unreal Engine — это процесс синхронизации состояния компонента между клиентом и сервером в многопользовательской игре.

В многопользовательской игре только сервер является «авторитетным» источником правды. Именно на нём происходят все значимые изменения свойств. Это означает, что если какой-либо Actor или его ActorComponent изменяет своё состояние (например, здоровье, позицию, активированность), то эти изменения должны быть переданы от сервера всем клиентам, чтобы игра выглядела одинаково для всех.

Репликация Actor Component тесно связана с репликацией Actor, которому он принадлежит. Если Actor не реплицируется, то и его компоненты не могут быть реплицированы.

Activation:

  • Auto Activate (bool, по умолчанию False). Включить автоматическую активацию компонента. Также активировать Actor Component можно через код.

Variable:

  • Editable when Inherited (bool, по умолчанию True). Включить изменение компонента при его наследовании от родительского класса.

Cooking:

  • Is Editor Only (bool, по умолчанию False). Параметр, который позволяет создавать Actor Component, доступный только в редакторе.

Asset User Data / Advanced:

  • Asset User Data — массив пользовательских данных, хранимых вместе с Actor Component.
  • Asset User Data Editor Only — массив пользовательских данных, предназначенных только для редактора, хранимых вместе с Actor Component.

Navigation / Advanced:

  • Can Ever Affect Navigation — включить влияние Actor Component на навигацию.

Практический урок в Unreal Engine: создаём компонент трассировки на основе Actor Component

При программировании любой игры для многих объектов приходится создавать трассировочные линии.
* Что такое трассировка, зачем она нужна и как её создать, Вы можете узнать в отдельной статье: Unreal Engine Line Trace.

Процесс создания линии трассировки, с одной стороны, не является сложным. Однако, с другой стороны, он требует времени. А так как трассировка необходима для многих объектов, приходится повторять свои действия для каждого из них.

Мы можем значительно облегчить себе задачу, используя Components. Именно для этого они и созданы в Unreal Engine. Описав трассировку всего один раз в компоненте, мы можем применять его ко многим объектам. Что позволит значительно ускорить процесс подключения линий трассировки, экономя время.

Задача: при помощи класса Actor Component создать универсальный компонент для трассировки линий как из центра всего Актора, так и из центра любого компонента этого Актора.

Практический урок в Unreal Engine: создаём универсальный Actor Component, выпускающий Line Trace как из центра Актора, так и из центра любого компонента
Практический урок в 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

  1. Создадим внутри компонента BPC_LineTrace первую пользовательскую функцию LT_ActorPoint, которая будет выпускать Line Trace из центра Актора.

    Пользовательская функция LT_ActorPoint внутри компонента BPC_LineTrace класса Actor Component
    Пользовательская функция LT_ActorPoint внутри компонента BPC_LineTrace класса Actor Component
  2. Добавим в эту функцию ноду Line Trace By Channel, непосредственно которая и будет генерировать саму трассировку.

    Добавим ноду Line Trace By Channel, непосредственно генерирующую трассировку
    Добавим ноду Line Trace By Channel, непосредственно генерирующую трассировку
  3. Транслируем основные настройки 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
    Транслируем основные настройки Line Trace By Channel в нашу функцию LT_ActorPoint
  4. Для того чтобы мы могли настраивать длину линии трассировки, введём в нашей функции LT_ActorPoint ещё один параметр Length типа float и в настройках по умолчанию установим значение 500.

    Установим параметр Length типа float со значением 500
    Установим параметр Length типа float со значением 500

Ну и последнее, настроим параметры Start и End (начала и конца линии) в Line Trace By Channel. Напоминаю, подробнее о настройке этих параметров Вы можете узнать в отдельной статье: Line Trace. Единственное, разница в коде данной практики и той статьи заключается в Акторе, от которого мы будем вычислять положение точек. В данном случае мы возьмём ссылку на Actor, владельца нашего компонента, которую возвратит нода Get Owner. Таким образом положение трассировочной линии будет зависеть от Актора-владельца компонента.

Скриншот

Практический урок в Unreal Engine: Пользовательская функция LT_ActorPoint внутри компонента BPC_LineTrace класса Actor Component, создающая Line Trace из центра Актора
Практический урок в Unreal Engine: Пользовательская функция LT_ActorPoint внутри компонента BPC_LineTrace класса Actor Component, создающая Line Trace из центра Актора

Код на BlueprintUE

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


Функция LT_ComponentPoint

  1. Сделаем копию функции LT_ActorPoint и на её основе создадим внутри компонента BPC_LineTrace вторую пользовательскую функцию LT_ComponentPoint, которая будет выпускать Line Trace из центра любого компонента. Данная функция будет похожа на первую, только в качестве объекта, от которого будет вестись расчет координат линии, уже будет выступать не Актор-владелец текущего компонента, а компонент, который мы подадим во входящие параметры данной функции. Поэтому дополним ноду нашей функции LT_ComponentPoint ещё одним входящим параметром с именем Component и типом Object Reference Scene Component. Тип компонента обязательно должен быть Scene Component, так как нам от этого компонента нужно будет брать координаты в мире, а они имеются у компонентов этого класса и дочерних от него.

    Добавим в функцию LT_ComponentPoint ещё один входящий параметр с именем Component и типом Object Reference Scene Component
    Добавим в функцию LT_ComponentPoint ещё один входящий параметр с именем Component и типом Object Reference Scene Component
  2. Изменим в скопированной функции код расчета параметров Start и End, заменив ноды Get Actor Location и Get Actor Rotation на соответствующие ноды для компонентов Get World Location и Get World Rotation. В остальном вторая функция будет аналогична первой.

    Скриншот

    Практический урок в Unreal Engine: Пользовательская функция LT_ComponentPoint внутри компонента BPC_LineTrace класса Actor Component, создающая Line Trace из центра любого компонента
    Практический урок в Unreal Engine: Пользовательская функция LT_ComponentPoint внутри компонента BPC_LineTrace класса Actor Component, создающая Line Trace из центра любого компонента

    Код на BlueprintUE

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


Добавление компонента BPC_LineTrace класса Actor Component в многочисленные объекты движка Unreal Engine

  1. Теперь нам осталось немногое — подключить наш компонент к различным объектам и протестировать его работу. Для этого создадим два блюпринта класса Actor: BP_Sphere — с компонентом сферы и BP_Cube_Sphere — с двумя компонентами куба и сферы.

    Создадим два блюпринта класса Actor: BP_Sphere — с компонентом сферы и BP_Cube_Sphere — с двумя компонентами куба и сферы
    Создадим два блюпринта класса Actor: BP_Sphere — с компонентом сферы и BP_Cube_Sphere — с двумя компонентами куба и сферы
  2. Добавим наш компонент BPC_LineTrace к обоим Акторам.
  3. В Акторе BP_Sphere протестируем работу компонента BPC_LineTrace, выпуская трассировочную линию из центра всего Актора. Для этого в Event Graph Актора BP_Sphere нодой Get BPC Line Trace получим ссылку на наш компонент и далее из него вызовем функцию LT_ActorPoint. Введём соответствующие настройки трассировки: Trace ChannelVisibility; Draw Debug TypeFor One Frame и Length500. И подключим эту функцию на событие Event Tick. Таким образом, на каждом тике из Актора BP_Sphere будет выпускаться линия трассировки.

    Вызов функции LT_ActorPoint Актор-компонента BPC_LineTrace
    Вызов функции LT_ActorPoint Актор-компонента BPC_LineTrace
  4. В Акторе BP_Cube_Sphere протестируем работу компонента BPC_LineTrace, выпуская трассировочную линию из центра двух компонентов — Cube и Sphere. Код будет практически таким же, как и в пункте 3, только у компонента BPC_LineTrace вызывать уже будем функцию LT_ComponentPoint, во входящий параметр Component которой, подадим ссылки на компоненты Cube и Sphere. В результате на каждом тике из обоих компонентов Актора BP_Cube_Sphere будут выпускаться линии трассировки.

    Вызов функции LT_ComponentPoint Актор-компонента BPC_LineTrace
    Вызов функции LT_ComponentPoint Актор-компонента BPC_LineTrace

Таким образом, описав в компоненте логику один раз, её можно очень быстро подключать ко многим объектам, экономя при этом время. В этом и кроется суть компонентов движка Unreal Engine и компонентов класса Actor Component в частности.

Функции класса Actor Component

  1. Get Owner — возвращает ссылку на Актора-владельца текущего компонента.
  2. Activate — активирует компонент.
  3. Deactivate — деактивирует компонент.
  4. Is Active — возвращает информацию о том, активирован или нет текущий компонент.
  5. Set Active — устанавливает настройки активации у компонента (активирован или нет).
  6. Toggle Active — переключатель активированности компонента (активировать / деактивировать).
  7. Destroy Component — уничтожает объект компонента.
  8. Is Component Being Destroyed — проверяет, находится ли объект компонента в процессе уничтожения.
  9. Component Has Tag — проверяет у компонента наличие определённого тега.

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

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

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