Actor в Unreal Engine: разбираем класс Актор

Друзья, приветствую, с Вами Будуев Антон. В этой статье мы обсудим один из самых основополагающих Blueprint-классов в Unreal Engine (UE4, UE5) — класс Actor (Актор).

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

Unreal Engine Actor

Actor в Unreal Engine — это абсолютно любой объект, который можно разместить на игровом уровне. Это может быть как статичная 3D-модель, так и анимированный персонаж, камера, звуковой файл и многое другое. Таким образом, Актором является всё, что размещается на уровне. И не обязательно, чтобы этот объект отображался визуально.

Музыкальный Actor, размещённый на уровне в Unreal Engine
Музыкальный Actor, размещённый на уровне в Unreal Engine

Все Акторы поддерживают 3D-преобразования, такие как перемещение, вращение и масштабирование. Также объекты Actor могут быть добавлены на сцену как вручную, так и созданы или уничтожены с помощью кода на C++ или Blueprints.

Но, обращаю Ваше внимание, на самом деле объекты класса Actor не хранят информацию о 3D-преобразовании (местоположении, повороте и масштабировании). А вместо этого используют данную информацию из своего корневого scene-компонента. Иначе говоря, информация о трансформации (местоположение, поворот и масштабирование) содержится в scene root-component, который, в свою очередь, является обязательным компонентом любого Actor.

Базовые свойства Актора в Анрил Энджин

  • Components — к любому Актору можно присоединить особый тип объектов Unreal Engine Components (компоненты). Где каждый компонент содержит в себе определённый функционал (Static Mesh, Audio, Camera и другие).
  • Transform — любой Актор в игровом мире можно трансформировать (поменять местоположение, поворот и масштабирование).
  • Ticking — тик, это способ обновления объекта Actor в Unreal Engine, вызываемый по событию Event Tick. Все Акторы могут «тикать» каждый кадр FPS или с минимальным интервалом, заданным пользователем. Это позволяет выполнять любые необходимые вычисления или действия с повтором в частоту обновления кадров.
  • Replication — репликация по сети для многопользовательского режима (копирование свойств и данных между сервером и клиентами).
  • Damage — поддержка получения урона. Подробнее об уроне Вы можете прочитать в отдельной статье: Damage Unreal Engine.
  • Spawn — создание нового экземпляра класса.
  • Destroy — уничтожение экземпляра класса. Изучить функции уничтожения объектов Вы можете в статье: Unreal Engine Destroy.
  • Events — наличие базовых событий для взаимодействия с Актором (события пересечения, столкновения, урона, клика мышки, сенсорного касания и другие).

Blueprint Class Actor

Если к любому Актору добавить код логики, написанный на языке C++ или в скриптах Blueprints, то он будет классифицироваться как Blueprint Class Actor (изучить что такое Blueprint Class). Это позволит создать любой интерактивный объект, будь то открываемая дверь, машина или человеческий персонаж. Однако, в таком случае, весь функционал придётся описывать с нуля.

Но это совсем не обязательно, так как в движке Анрил Энджин есть множество заранее описанных классов для различных задач. В частности, существует множество классов, унаследованных от Actor, которые содержат свой определённый функционал.

То есть, в Unreal Engine класс Actor служит основой для множества других классов. Таких как Pawn, Character, Player Controller, Game Mode, Player State, Game State, Camera и многих других. Эти классы наследуют от Actor базовые свойства объектов, размещённых на уровне, включая трансформацию, репликацию и другие, о которых я упоминал ранее. Каждый из этих классов служит для выполнения конкретной своей задачи в рамках игры.

Сам же класс Actor в движке Unreal Engine (UE4, UE5) используется для создания неодушевленных объектов в игровом мире, которые наделены определенной логикой: открываемая дверь, зажигающаяся лампочка, подбираемый предмет и прочее.

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

Actor в Unreal Engine: разбираем класс АкторКак я уже упоминал ранее, одним из ключевых свойств, присущих Актору, является наличие базовых событий (Events). Эти события характерны не только для самого Actor, но и для всех последующих производных от него классов.

Вообще события — это ноды, вызываемые в Event Graph для запуска отдельной логической цепочки. Они позволяют объектам выполнять ряд действий в ответ на определённые события, происходящие в игре, например, при запуске игры, сбросе уровня или получении игроком урона.

События можно использовать в Blueprints для реализации новых функций, а также для переопределения или дополнения функций по умолчанию. В рамках одного EventGraph можно использовать любое количество событий, но только по одному каждого типа.

В блюпринтах Actor, в разделе «Function / Override», находятся все события, которые можно переопределить в данном классе. Иначе говоря, в этих событиях по умолчанию уже описана определённая системная логика, которую Вы, исходя из Ваших потребностей, можете изменить.

Так как базовых событий в классе Actor в UE5 (UE4) достаточно много, то я их рассмотрел в отдельной статье. В ней Вы найдёте их подробное описание и узнаете о тонкостях использования: Events Unreal Engine.

Настройки класса Actor в меню Details в Unreal Engine (class Defaults)

Настройки класса Actor в меню Details в Unreal Engine
Настройки класса Actor в меню Details в Unreal Engine

Actor Tick:

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

Actor Tick / Advanced:

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

Replication:

  • Only Relevant to Owner (bool, по умолчанию False). Если установлено значение True, то Actor будет доступен только клиенту-владельцу. Другие удалённые клиенты не смогут получить к нему доступ. В случае установки значения False, Актор будет реплицироваться на всех клиентах.
  • Always Relevant (bool, по умолчанию False). Этот параметр указывает на то, что Actor всегда будет реплицироваться всем сетевым клиентам, независимо от ситуации. Он переопределяет свойство «Only Relevant to Owner».
  • Replicate Movement (bool, по умолчанию False). Копировать ли с сервера на клиенты свойства Актора, связанные с его перемещением и расположением.
  • Net Load on Client (bool, по умолчанию True). Определяет возможность загрузки Актора на сетевых клиентах сразу при загрузке карты.
  • Net Use Owner Relevancy (bool, по умолчанию False). Если у Актора имеется действующий владелец, то Актор копирует приоритет своего владельца.
  • Replicates (bool, по умолчанию False). Это основной параметр, определяющий процесс репликации. Если он установлен в значение True, то Actor будет скопирован на другие сетевые клиенты. В случае установки значения False репликация производиться не будет.
  • Net Dormancy — режим ожидания Актора, параметр серверной оптимизации. Он позволяет сэкономить несколько миллисекунд процессорного времени на кадр, что особенно важно, когда в проекте присутствует множество реплицированных Акторов, которые длительное время остаются неизменными. На выбор имеются несколько вариантов настройки: Never — Актор никогда не спит; Awake (по умолчанию) — может быть в режиме ожидания, но в настоящее время активный; Dormant All — Актор находится в режиме бездействия для всех соединений; Dormant Partial — Актор может бездействовать для некоторых соединений; Initial — Actor, когда был помещён на карту, изначально бездействует для всех соединений.
  • Net Cull Distance Squared (float, по умолчанию 225000000,0). Максимальное расстояние от точки просмотра клиента до Актора, на котором Actor остаётся актуальным и реплицируется для этого клиента. Параметр позволяет снизить нагрузку на сеть, не обновляя Акторы, которых клиент уже не видит.
  • Net Update Frequency (float, по умолчанию 100,0). Частота обновления репликации Actor (в секунду).
  • Min Net Update Frequency (float, по умолчанию 2,0). Минимальная частота обновления. Используется для определения скорости, при которой следует замедлить работу, если свойства репликации меняются редко.
  • Net Priority (float, по умолчанию 1,0). Приоритет текущего Actor перед другими в очереди репликации. Чем выше приоритет, тем чаще будет производится репликация по сравнению с другими Акторами в ситуации низкой пропускной способности или большой загрузки сети.
  • Physics Replication Mode — режимы репликации физики. Существуют 3 режима для выбора. Default (по умолчанию) — устаревший режим репликации, но до сих пор установленный по умолчанию, так как другие режимы находятся еще в стадии разработки и тестирования. Predictive Interpolation (предсказательная интерполяция) — работает, изменяя скорость каждого объекта на клиенте, чтобы она соответствовала скорости объекта на сервере в это время. Resimulation (ресимуляция) — режим физического моделирования через предсказание физики на клиенте.

Репликация в Unreal Engine (UE4, UE5) — это процесс передачи копированных данных с сервера на клиент в многопользовательских играх (создание копии данных). Когда происходит репликация объекта, он существует как минимум сразу в двух копиях: одна на сервере, а другая копия на сетевом клиенте.

Replication / Advanced:

  • Call Pre Replication (bool, по умолчанию True). Вызов перед репликацией.
  • Call Pre Replication for Replay (bool, по умолчанию True). Позволяет запускать предварительную репликацию для воспроизведения.
  • Replay Rewindable (bool, по умолчанию False). Это свойство отвечает за то, как будет вести себя воспроизведение при перемотке. Если установлено значение True, то Актор будет уничтожен только во время ручной прокрутки, если воспроизведение настроено на время до его существования. В противном случае будет вызвана функция RewindForReplay, если Actor нуждается в сбросе.
  • Replicate Using Registered Sub Object List (bool, по умолчанию False). Если установлено значение True, то система репликации будет использовать только зарегистрированные подобъекты и список реплицированных компонентов Actor. Если установлено значение False, система репликации вызовет виртуальную функцию ReplicateSubobjects(), в которой подобъекты и компоненты Actor нужно реплицировать вручную.

Replication / Replicated Movement:

  • Location Quantization Level (по умолчанию Round Whole Number) — позволяет настроить уровень сжатия для вектора копированного месторасположения. Внимание! Менять значение по умолчанию только в случае появления визуальных артефактов. Доступно 3 значения на выбор: Round Whole Number (каждый компонент вектора округляется до ближайшего целого числа); Round One Decimal (округление каждого компонента вектора до одного знака после запятой); Round Two Decimal (округление каждого компонента вектора до двух знаков после запятой);
  • Velocity Quantization Level (по умолчанию Round Whole Number) — позволяет настроить уровень сжатия для вектора копированной скорости. Внимание! Менять значение по умолчанию только в случае появления визуальных артефактов. Доступно 3 значения на выбор: Round Whole Number (каждый компонент вектора округляется до ближайшего целого числа); Round One Decimal (округление каждого компонента вектора до одного знака после запятой); Round Two Decimal (округление каждого компонента вектора до двух знаков после запятой).
  • Rotation Quantization Level (по умолчанию Byte Components) — позволяет настроить уровень сжатия для вектора копированного поворота. Внимание! Менять значение по умолчанию только в случае появления визуальных артефактов. Доступно 2 значения на выбор: Byte Components (каждый компонент Rotation будет сжат до 8 бит); Short Components (каждый компонент Rotation будет сжат до 16 бит).

Rendering:

  • Actor Hidden In Game (bool, по умолчанию False). Скрыть Актор в игре. При этом он будет отображаться только в редакторе.
  • Editor Billboard Scale (float, по умолчанию 1.0). Масштаб по умолчанию для Billboard в редакторе Анрил Энджин.

Collision:

  • Generate Overlap Events During Level Streaming (bool, по умолчанию False). Параметр, позволяющий генерировать события пересечения Begin Overlap и End Overlap у объекта во время потоковой загрузки уровня.
  • Update Overlaps Method During Level Streaming — параметр для инициализации состояния пересечения при загрузке во время потоковой передачи уровня. Доступно 4 значения на выбор: Use Config Default — используется значение по умолчанию, заданное исходным классом или указанное в файле .ini. Always Update — всегда обновлять пересечения при инициализации. Only Update Movable — обновлять пересечения только в том случае, если корневой компонент имеет подвижность Movable. Never Update — вообще не обновлять статус пересечения при инициализации.

В Unreal Engine коллизия (collision) представляет собой упрощённую невидимую геометрию, которая сохраняет общую форму 3D-модели, но при этом содержит меньшее количество полигонов. Коллизия необходима для того, чтобы регистрировать события пересечения/перекрытия (overlap) или касания/удара (hit) разных объектов друг с другом. И на основе данных событий выстраивать взаимодействие этих объектов.

Collision / Advanced:

  • Relevant for Level Bounds (bool, по умолчанию True). Включить границы компонентов Актора в ограничительную область уровня.

Actor:

  • Can be Damaged (bool, по умолчанию True). Разрешить для текущего Актора получение урона.
  • Initial Life Span (float, по умолчанию 0.0). Этот параметр позволяет задать заранее определённый срок существования Актора, по истечении которого он будет автоматически уничтожен. Это обеспечивает эффективное управление памятью и освобождение ресурсов. Если значение установлено на 0, то объект будет существовать вечно.
  • Spawn Collision Handling Method (по умолчанию Always Spawn, Ignore Collisions) — параметр, отвечающий за порядок создания объекта (Spawn) в ситуации, когда его коллизия пересекается с другим объектом. Существует 4 варианта на выбор: Always Spawn, Ignore Collisions — Актор будет создан в любом случае, независимо от пересечений коллизий. Try To Adjust Location, But Always Spawn — Актор попытается найти ближайшее место без коллизии (на основе компонентов формы), но создан будет в любом случае, даже если такое место не найдено. Try To Adjust Location, Don’t Spawn If Still Colliding — Актор попытается найти ближайшее место без коллизии (на основе компонентов формы), и будет создан только в том случае, если такое место будет найдено. Do Not Spawn — объект не будет создан вообще.

Actor / Advanced:

  • Find Camera Component when View Target (bool, по умолчанию True). Если параметр установлен в значение True, то при использовании Актора в качестве цели просмотра он будет искать свой собственный компонент камеры.
  • Ignores Origin Shifting (bool, по умолчанию False). Параметр, который определяет, должен ли текущий Actor игнорироваться при смещении координат мира. По умолчанию это свойство отключено для всех объектов. Обычно же его используют для глобальных объектов, которые не должны смещаться, например, для скайбокса.
  • Can be in Cluster (bool, по умолчанию False). Включить данный объект в кластер, для группировки объектов, которые при уничтожении нужно удалить из памяти все сразу.
  • Pivot Offset — сместить в локальном пространстве положение опорной точки (Pivot) у текущего объекта. Изменение возможно по 3 осям: X, Y, Z. Используется только в редакторе.
  • Layers — слои, к которым принадлежит текущий Actor.
  • Tags — пользовательский массив тегов для текущего объекта. Теги используются для группировки и категоризации.

Input:

  • Block Input (bool, по умолчанию False). Блокировка входящих данных. Параметр устанавливает, будут ли игнорироваться все входящие данные в стеке ниже этого Актора.
  • Auto Receive Input — включить автоматическую регистрацию текущего Actor для получения входящих данных от Игрока. По умолчанию Disabled — отключено. Для того, чтобы включить, необходимо выбрать номер Игрока (Player 0-7).
  • Input Priority (int, по умолчанию 0). Приоритет компонента ввода Актора при внесении его в стек обработки входящих данных.

HLOD:

  • Include Actor in HLOD (bool, по умолчанию True). Включить текущий объект в иерархическую систему уровней детализации (HLOD).
  • HLOD Layer — слой HLOD, в который должен быть включён текущий объект.

HLOD (High-Level Of Detail) — это технология, которая оптимизирует процесс группировки соседних объектов, упрощая их и объединяя в один статический mesh, когда они находятся на достаточном для этого расстоянии. Такое объединение позволяет снизить уровень детализации геометрии, а также объединить множество материалов всех объектов в один общий материал.

Physics:

  • Async Physics Tick Enabled (bool, по умолчанию False). Запускает физическое моделирование в отдельном потоке с фиксированным интервалом такта (Tick).

Level Instance:

Is Main World Only (bool, по умолчанию False). Этот параметр указывает, что объект будет загружаться только в основном мире (на постоянном уровне), а не через экземпляры этого уровня.

Cooking:

  • Is Editor Only Actor (bool, по умолчанию False). Параметр который позволяет создавать Акторов, доступных только в редакторе.
  • Generate Optimized Blueprint Component Data (bool, по умолчанию False). Этот параметр позволяет создавать оптимизированные данные компонентов, что ускоряет процесс построения Blueprint во время выполнения. Однако следует помнить, что активация данной опции может привести к увеличению общего объема памяти, занимаемой Blueprint в конечной сборке.

Cooking в Unreal Engine — это один из этапов процесса упаковки игрового проекта. На этом этапе контент адаптируют (подготавливают) под конкретные требования платформы, на которой будет запускаться игра.

World Partition:

  • Runtime Grid — параметр, определяющий в какую сетку сегментирования будет помещён Actor. Если выбрать «None», сетка будет выбрана автоматически системой разбиения.
  • Is Spatially Loaded (bool, по умолчанию True). Параметр, который определяет, будет ли Актор загружаться с ориентацией в пространстве при помещении его в сегментированный мир.

World Partition в Unreal Engine — система автоматического управления данными и потоковой передачи уровней на основе расстояния. Она представляет комплексное решение для управления обширными мирами. Система избавляет от необходимости дробить большие уровни на более мелкие, сохраняя мир на одном постоянном уровне, который делится на ячейки сетки. Кроме того, World Partition включает автоматическую систему потоковой передачи, которая загружает и выгружает эти ячейки в зависимости от их удалённости от источника передачи.

Практика в Unreal Engine: работа с базовой функциональностью Актора — изменение Transform (Scale)

Объект Unreal Engine Актор

Для начала давайте в игровом мире создадим простой Актор. Для этого в Unreal Editor перейдём в меню Quickly add to the project / Shapes и добавим объект Cube. Этой операцией мы создали в игровом мире простой Актор (объект с формой куба).

Создание в Unreal Editor Актора Cube (куб)
Создание в Unreal Editor Актора Cube (куб)

У текущего добавленного объекта Cube имеются все основные свойства, относящиеся к Акторам. Среди которых — свойство Transform (трансформация объекта: местоположение, поворот и масштаб). Давайте изменим данному Актору его масштаб. Для этого выделим объект куба и перейдём в меню Details. И в разделе Transform изменим Scale (масштаб) по оси Y на 3. Данной операцией мы увеличили куб по оси Y в 3 раза.

Изменение масштаба Актора Cube
Изменение масштаба Актора Cube

Так как это простой Актор, не имеющий никакой логики, то изменение масштаба для него возможно только в ручном режиме в Unreal Editor. В запущенной игре данный Актор останется в этих же размерах (увеличенный по оси Y в 3 раза) без возможности каких-либо других изменений в самой игре.

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

Blueprint-класс Actor

Превратим наш простой Актор в Blueprint класс Actor. Для этого выделим объект куба и перейдём во вкладку Details. Далее нажмём кнопку Converts this actor.

Кнопка Converts this actor in Blueprint Class
Кнопка Converts this actor in Blueprint Class

Откроется новое небольшое окно Create Blueprint From Selection, в котором мы можем выбрать класс и наименование для нашего нового блюпринта. Выберем первый пункт New Subclass. В разделе Parent Class выберем StaticMeshClass. Имя Blueprint name оставим по умолчанию — Cube_Blueprint. После нажмём кнопку Select.

Создание Blueprint-класса Actor в Unreal Engine на основе простого объекта Актора
Создание Blueprint-класса Actor в Unreal Engine на основе простого объекта Актора

Данной операцией мы конвертировали обычной объект Актор в блюпринт класса Actor, содержащий в себе StaticMesh с 3D-моделью куба и вкладку Event Graph, в которой мы можем описать логику изменения состояния нашего объекта непосредственно в самой игре. При чём сам файл блюпринта был создан в текущей папке Content Browser.

Далее перейдём во вкладку Event Graph созданного блюпринта и воспользуемся находящимся в этой вкладке событием Event Tick. По вызову этого события мы будем изменять масштаб нашего куба.

Event Tick срабатывает каждый кадр обновления игры, что для наших целей — очень часто. Ограничим частоту вызова этого события.

Перейдём во вкладку Details самого Актора. И в разделе Actor Tick установим в параметре Tick Interval (secs) интервал между вызовами Event Tick в 1 секунду. Таким образом, теперь данное событие будет вызываться только 1 раз за секунду.

Устанавливаем в Details Actor интервал между вызовами события Event Tick
Устанавливаем в Details Actor интервал между вызовами события Event Tick

Далее по каждому вызову этого события нодой Set Actor Scale 3D будем изменять масштаб Актора по всем 3 осям (X, Y, Z) в случайных значениях между 0.5 и 3. Для генерации случайных значений воспользуемся нодой Random Float in Range, в которой в качестве минимального значения установим 0.5, а максимального 3. Данная нода при каждом своём вызове будет возвращать случайное число между 0.5 и 3 в формате типа float.

Для того чтобы случайное число в формате типа float подключить к ноде Set Actor Scale 3D, разделим параметр New Scale 3D этой функции на 3 раздельных float параметра для каждой из осей (X, Y, Z). Для этого через правую клавишу мыши кликнем по данному параметру и выберем пункт Split Struct Pin. Далее подключим Random Float in Range к каждому входу New Scale 3D (X, Y, Z).

Скриншот

Практика в Unreal Engine: изменяем каждую секунду масштаб Actor
Практика в Unreal Engine: изменяем каждую секунду масштаб Actor

Код на BlueprintUE

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


Таким образом, конвертировав обычный Актор движка Анрил Энджин в объект блюпринт-класса Actor и настроив внутри него определённым способом логику, мы смогли изменять свойства этого объекта, а именно, его масштаба, непосредственно в самой игре.

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

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

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