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

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

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

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 — отменяет регистрацию и помечает компонент на удаление. Функция не может быть использована для уничтожения компонента, принадлежащего другому Актору, если только её не вызывает сам владелец.

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

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

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


наш Телеграм канал

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

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