이 문서에서는 액터 의 라이프사이클에 대해 다음 개요를 간략하게 소개합니다.
-
액터의 초기화 방법 등 액터를 인스턴스화하고 스폰하는 방법
-
액터를 PendingKill로 표시한 다음 가비지 컬렉션을 통해 제거하거나 소멸하는 방법
다음 플로 차트는 액터가 인스턴스화되는 주요 경로를 보여줍니다. 액터가 어떻게 생성되든 소멸 경로는 모두 같습니다.
라이프사이클 분해도

디스크에서 로드
디스크에서 로드(Load from Disk) 경로는 UEngine::LoadMap이 발생할 때나 레벨 스트리밍에서 UWorld::AddToWorld를 호출하는 경우처럼 이미 레벨에 있는 액터에 대해서 발생합니다.
- 패키지/레벨에 있는 액터가 디스크에서 로드됩니다.
- 디스크에서의 로드 완료 후 시리얼라이즈된 액터에서 PostLoad를 호출합니다. 커스텀 버전 관리와 픽스업 행동이 여기서 이루어져야 합니다. PostLoad는 PostActorCreated 와 상호 배타적입니다.
- 월드에서 UAISystemBase::InitializeActorsForPlay를 호출하여 액터를 준비하고 게임플레이를 시작합니다.
-
레벨에서 시리얼라이즈되지 않은 액터와 심리스 트래블 전환 처리에 대해 ULevel::RouteActorInitialize를 호출합니다.
- 액터의 컴포넌트에서 InitializeComponent를 호출하기 전에 AActor::PreInitializeComponents를 호출합니다.
- UActorComponent::InitializeComponent는 액터에 정의된 각 컴포넌트를 생성하는 헬퍼 함수입니다.
- AActor::PostInitializeComponents는 액터의 컴포넌트가 초기화된 후에 호출됩니다.
- 레벨이 시작될 때 AActor::BeginPlay가 호출됩니다.
에디터에서 플레이
에디터에서 플레이(Play in Editor) 경로에서는 액터를 디스크에서 로드하는 대신 에디터에서 복사합니다. 그런 다음 복사된 액터는 디스크에서 로드 경로에 설명된 흐름과 유사하게 초기화됩니다.
- 에디터의 액터가 새 월드에 복제됩니다.
- UObject::PostDuplicate를 호출합니다.
- UAISystemBase::InitializeActorsForPlay
-
초기화되지 않은 액터에 대해 ULevel::RouteActorInitialize를 호출하고 모든 심리스 트래블 전환 처리를 처리합니다.
1. 액터의 컴포넌트에서 InitializeComponent를 호출하기 전에 AActor::PreInitializeComponents를 호출합니다.
- UActorComponent::InitializeComponent는 액터에 정의된 각 컴포넌트를 생성하는 헬퍼 함수입니다.
- AActor::PostInitializeComponents는 액터의 컴포넌트가 초기화된 후에 호출됩니다.
- 레벨이 시작될 때 AActor::BeginPlay가 호출됩니다.
스폰
액터 인스턴스를 스폰할 때 따라가는 경로는 다음과 같습니다.
- UWorld::SpawnActor를 호출합니다.
- 액터가 월드에 스폰된 이후 AActor::PostSpawnInitialize가 호출됩니다.
- AActor::PostActorCreated는 생성 이후 스폰된 액터에 대해 호출되며, 모든 생성자 구현 동작은 여기로 이동해야 합니다. PostActorCreated는 PostLoad와 상호 배타적입니다.
- AActor::ExecuteConstruction:
- AActor::OnConstruction - 액터 생성, 블루프린트 액터의 컴포넌트 생성 및 블루프린트 변수가 초기화됩니다.
-
AActor::PostActorConstruction:
1. 액터의 컴포넌트에서 InitializeComponent를 호출하기 전에 AActor::PreInitializeComponents를 호출합니다.
- UActorComponent::InitializeComponent는 액터에 정의된 각 컴포넌트를 생성하는 헬퍼 함수입니다.
- AActor::PostInitializeComponents는 액터의 컴포넌트가 초기화된 후에 호출됩니다.
- UWorld::OnActorSpawned가 UWorld에서 브로드캐스트됩니다.
- AActor::BeginPlay가 호출됩니다.
디퍼드 스폰
'스폰 시 노출(Expose on Spawn)'로 설정된 프로퍼티가 있으면 액터는 디퍼드 스폰(Deferred Spawn)될 수 있습니다.
- UWorld::SpawnActorDeferred는 프로시저럴 액터 스폰을 위한 것으로, 블루프린트 컨스트럭션 스크립트 전에 추가적인 구성을 할 수 있습니다.
-
SpawnActor 안의 모든 일이 발생하지만, AActor::PostActorCreated 후에 다음과 같은 일이 일어납니다.
- 유효하지만 불완전한 액터 인스턴스로 다양한 '초기화 함수'를 구성하고 호출합니다.
- AActor::FinishSpawning가 액터를 마무리하기 위해 호출되며, SpawnActor 줄의 AActor::ExecuteConstruction에서 선택됩니다.
액터 라이프사이클 종료
액터를 소멸하는 방법은 여러가지가 있지만, 월드에서 제거하는 방법은 동일합니다. 게임플레이 도중 다음 함수를 호출할 수 있지만, 플레이 도중 실제로 소멸되지 않는 액터가 많으므로 완전히 선택 사항입니다(가비지 컬렉션 참조).
-
액터를 제거해야 하지만 게임플레이가 계속 진행 중일 때마다 게임에서 AActor::Destroy를 수동으로 호출합니다. 액터는 킬 보류 중(pending kill)으로 표시되고 레벨의 액터 배열에서 제거됩니다.
-
액터의 수명이 다해가는 것을 보장하기 위해 AActor::EndPlay가 여러 곳에서 호출됩니다. 플레이 도중 액터가 포함된 스트리밍 레벨이 언로드되면 이 메서드와 레벨 트랜지션이 호출됩니다.
-
EndPlay가 호출되는 경우는 다음과 같습니다.
- Destroy 에 대한 명시적 호출
- 에디터에서의 플레이가 종료된 경우
- 레벨 트랜지션(심리스 트래블 또는 로드 맵)
- 액터가 포함된 스트리밍 레벨이 언로드될 때
- 액터의 수명이 만료됨
- 애플리케이션 종료(모든 액터가 소멸됨)
발생 과정과 상관없이, 액터는 RF_PendingKill
로 표시되어 다음 가비지 컬렉션 주기 동안 UE가 메모리에서 할당 해제합니다. 또한, 보류 중인 킬을 수동으로 확인하는 대신 FWeakObjectPtr<AActor>
를 사용하는 것이 더 깔끔합니다.
액터는 EndPlay가 호출될 때 반드시 소멸되지 않을 수 있습니다. 예를 들어 s.ForceGCAfterLevelStreamedOut
이 false
이고 서브레벨이 빠르게 리로드되면 액터의 EndPlay가 호출되지만, 액터가 "부활"되어 기본값으로 초기화되지 않은 로컬 변수와 함께 이전에 존재했던 것과 똑같은 액터가 될 수 있습니다.
- AActor::OnDestroyed - Destroy에 대한 레거시 응답입니다. 레벨 전환 및 기타 게임 정리 함수에 의해 호출되므로 여기에 있는 로직을 EndPlay로 옮기는 것이 좋습니다.
가비지 컬렉션
오브젝트가 소멸로 표시되고 얼마 뒤에 가비지 컬렉션이 실제로 메모리에서 해당 오브젝트를 제거하여 사용 중이던 리소스를 모두 해제합니다.
오브젝트의 소멸 중에 다음과 같은 함수가 호출됩니다.
- UObject::BeginDestroy - 오브젝트가 메모리를 해제하고 그래픽 스레드 프록시 오브젝트와 같은 기타 멀티스레드 리소스를 처리할 기회입니다. 소멸과 관련된 대부분의 게임플레이 함수 기능은 앞서
EndPlay
에서 처리되어야 합니다. - UObject::IsReadyForFinishDestroy - 가비지 컬렉션 프로세스는 이 함수를 호출하여 오브젝트가 영구적으로 제거될 준비가 되었는지를 결정합니다.
false
가 반환되면, 이 함수는 다음 가비지 컬렉션 패스까지 실제 오브젝트 소멸을 연기할 수 있습니다. - UObject::FinishDestroy - 오브젝트가 실제로 소멸되므로, 내부 데이터 구조체를 해제할 마지막 기회입니다. 이 마지막 호출 후에 메모리가 해제됩니다.
고급 가비지 컬렉션
언리얼 엔진 의 가비지 컬렉션 프로세스에서는 모두 함께 소멸되는 오브젝트 클러스터를 빌드합니다. 클러스터를 빌드 하면 오브젝트를 개별적으로 삭제하는 것보다 가비지 컬렉션 관련 전체적인 메모리 교란이 줄어들고 총 소요 시간이 감소합니다. 오브젝트가 로드되면서 서브오브젝트가 생성될 수 있습니다. 오브젝트와 그 서브오브젝트를 가비지 컬렉터를 위해 단일 클러스터로 결합함으로써, 엔진은 전체 오브젝트가 해제될 준비가 될 때까지 클러스터에 사용되는 리소스 해제를 딜레이시켰다가, 모든 리소스를 한꺼번에 해제할 수 있습니다.
대부분의 프로젝트에서 가비지 컬렉션을 환경설정하거나 변경할 필요가 없지만, 일부 특정 경우에 가비지 컬렉터의 클러스터링
행동을 변경하여 효율을 개선할 수 있는데, 그 방법은 다음과 같습니다.
- 클러스터링(Clustering) - 클러스터링을 끕니다. 프로젝트 세팅(Project Setting) 의 가비지 컬렉션(Garbage Collection) 섹션에서 가비지 컬렉터 UObject 클러스터 생성(Create Garbage Collector UObject Clusters) 옵션을 false로 설정할 수 있습니다. 대부분의 프로젝트에서는 이 옵션을 비활성화하면 가비지 컬렉션 효율이 떨어지므로, 퍼포먼스 테스트 결과 이점이 있는 경우 비활성화하는 것이 좋습니다.

Clustering options for Garbage Collection within the Project Settings menu.