Функция Destroy Component в Unreal Engine

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

Также рекомендую скачать мою бесплатную книгу по Blueprint для Unreal Engine.

Основная цель книги — дать общий, целостный и понятный обзор системы Blueprint. Книга предлагает взгляд с высоты «птичьего полёта» — ясную и чёткую карту игрового мира Unreal Engine, которая поможет увидеть ключевые взаимосвязи и понять, как устроена система визуального скриптинга.

Зарегистрироваться в ЛК и скачать книгу [Blueprints. Взгляд с высоты «птичьего полёта»]

Destroy Component

Blueprint-функция Destroy Component класса Actor Component в Unreal Engine (UE4, UE5)
Blueprint-функция Destroy Component класса Actor Component в Unreal Engine (UE4, UE5)

Blueprint-функция Destroy Component в Unreal Engine — метод класса Actor Component, который удаляет компонент из массива компонентов Актора-владельца, снимает регистрацию компонента в системе, помечает объект для удаления сборщиком мусора (Pending Kill), а также вызывает событие End Play.

Функция доступна как в C++, так и в Blueprints и может быть вызвана только Актором-владельцем или самим компонентом.

Перевод официальной справки: функция Destroy Component — отменяет регистрацию и помечает компонент на удаление. Функция не может быть использована для уничтожения компонента, принадлежащего другому Актору, если только её не вызывает сам владелец.

В исходном коде функция объявлена как виртуальная и может быть переопределена в дочерних классах. Вызов функции не приводит к немедленному освобождению памяти — объект продолжает существовать до срабатывания сборщика мусора.

Наш канал «Unreal Engine — это просто» в Telegram и MAX: осторожно, подписка на канал вызывает желание открыть Unreal Editor ;)

Destroy Component используется для корректного удаления компонентов во время выполнения игры, когда требуется динамически управлять составом компонентов Актора. Это позволяет освобождать ресурсы, завершать обработку событий и предотвращать утечки памяти при удалении временных или ненужных компонентов.

Параметры функции

  • Target (Actor Component) — указатель на компонент, объект которого необходимо удалить (уничтожить) из игрового мира.
  • bPromoteChildren (bool) — параметр, доступный в версии C++. Является флагом, определяющим, что происходит с дочерними компонентами удаляемого компонента (на практике используется начиная с класса Scene Component, в рамках которого возможно прикрепление компонентов друг к другу):
    False (значение по умолчанию): при уничтожении компонента все его дочерние компоненты не удаляются, а остаются в иерархии Актора, но их родителем становится родитель удаляемого компонента. То есть дочерние компоненты «поднимаются» на уровень выше, сохраняясь в структуре сцены.
    True: дочерние компоненты также уничтожаются вместе с родительским компонентом. То есть происходит рекурсивное удаление всей иерархии компонентов, начиная с указанного.

Тонкости применения функции

  1. Функция не может быть вызвана произвольно из любого места. Она работает только внутри Актора-владельца компонента или в самом удаляемом компоненте.
  2. После вызова компонент считается «уничтоженным», но физическое удаление из памяти происходит позже через систему Garbage Collection.
  3. В Blueprint функция доступна только через специализированную функцию-обёртку K2_DestroyComponent, в которой отсутствует параметр bPromoteChildren. По своей сути, при вызове ноды Destroy Component в Blueprints, вызывается K2_DestroyComponent без параметров, которая, в свою очередь, вызывает DestroyComponent() на C++, с параметром bPromoteChildren == false (значение по умолчанию). Это означает, что в Blueprint нода Destroy Component удаляет только текущий компонент, оставляя все дочерние компоненты и поднимая их на уровень выше в иерархии прикрепления.

Как Destroy Component работает внутри

Кратко рассмотрим, как функция Destroy Component работает внутри движка Unreal Engine.

  1. Проверяется, не находится ли компонент уже в процессе уничтожения. Если это действительно так, то есть ранее для компонента функция уже вызывалась, то далее функция ничего не делает и процесс выходит из функции.
  2. Устанавливается флаг bIsBeingDestroyed = true, означающий, что компонент находится в процессе уничтожения, и гарантирующий (при помощи пункта 1), что при повторном вызове функции процесс выполнения далее не пойдёт.
  3. Производится запуск внутреннего метода EndPlay (внутри которого в качестве причины окончания игры компонента указывается причина Destroyed), который в свою очередь, кроме реализации своего внутреннего функционала, запускает событие End Play в Blueprint.
  4. Если компонент находился в состоянии «инициализированный», вызывается внутренний метод UninitializeComponent(), помечающий компонент неинициализированным.
  5. Флаг bIsReadyForReplication (готов для репликации) устанавливается в False, так как компонент больше не участвует в репликации.
  6. Если компонент до сих пор зарегистрирован в системе, вызывается внутренний метод UnregisterComponent(), отменяющий регистрацию компонента.
  7. Функцией GetOwner() получается владеющий компонентом Актор и если он существует, то компонент удаляется из массива компонентов Актора-владельца.
  8. Производится вызов внутреннего метода MarkAsGarbage(), который помечает компонент как «подлежащий удалению» (Pending Kill).

Ключевые понятия, связанные с функцией

  • Replication (репликация) — передача состояния компонента по сети; при уничтожении репликация прекращается.
  • MarkAsGarbage() — функция в Unreal Engine, помечающая объект как подлежащий удалению системой сборки мусора (Garbage Collection).
  • Garbage Collection (сборка мусора) — это система автоматического управления памятью в Unreal Engine (процесс, при котором движок автоматически удаляет объекты, больше не используемые в игре, чтобы освободить память):
    • объект с помощью MarkAsGarbage() помечается как «подлежащий удалению» (Pending Kill);
    • на следующем цикле сборки мусора проверяется, на какие из таких объектов ещё существуют ссылки;
    • если ссылок нет — помеченные объекты уничтожается и память освобождается.

Практический урок в Unreal Engine

В качестве практики можете изучить урок, где создаётся точечный урон для персонажа с раздельным учётом повреждения головы, тела и защитного щита. При этом используется рассматриваемая функция Destroy Component. Перейти к практике >>

Практика использования функции Destroy Component в Unreal Engine
Практика использования функции Destroy Component в Unreal Engine

Напоминаю про мою бесплатную книгу по Blueprint для Unreal Engine.

Основная цель книги — дать общий, целостный и понятный обзор системы Blueprint. Книга предлагает взгляд с высоты «птичьего полёта» — ясную и чёткую карту игрового мира Unreal Engine, которая поможет увидеть ключевые взаимосвязи и понять, как устроена система визуального скриптинга.

Зарегистрироваться в ЛК и скачать книгу [Blueprints. Взгляд с высоты «птичьего полёта»]

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