본문 바로가기
게임 개발/Unreal Engine

[Unreal Engine] 액터의 수명주기(Actor Lifecycle)

by 불타는홍당무 2021. 12. 29.

UDN 링크 : https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/ActorLifecycle/

 

액터의 수명 주기

액터가 로드 또는 스폰된 후 결국 죽을 때 벌어지는 일에 대해서입니다.

docs.unrealengine.com

디스크에서 로드

이미 레벨에 있는 액터에 대해서, LoadMap 이 발생했을 때나 (스트리밍 또는 서브 레벨에서) AddToWorld 가 호출되었을 때 발생합니다.

  1. 패키지/레벨에 있는 액터가 디스크에서 로드됩니다.
  2. PostLoad : 디스크에서의 로드 완료 후 serialize 된 액터에 의해 호출됩니다. 커스텀 버전이나 픽스 작업은 이 곳에 와야 합니다. PostLoad  PostActorCreated 와 상호 배제됩니다.
  3. InitializeActorsForPlay
  4. RouteActorInitialize 초기화되지 않은 액터에 대해 호출됩니다 (심리스 트래블 전환 처리)
    1. PreInitializeComponents - 액터의 컴포넌트에 InitializeComponent 를 호출하기 전 호출합니다.
    2. InitializeComponent - 액터에 정의된 각 컴포넌트 생성용 헬퍼 함수입니다.
    3. PostInitializeComponents - 액터의 컴포넌트 초기화 완료 후 호출됩니다.
  5. BeginPlay - 레벨이 시작되면 호출됩니다.

스폰

액터를 스폰(인스턴싱)할 때 따르게 되는 경로입니다.

  1. SpawnActor이 호출됩니다.
  2. PostSpawnInitialize가 호출됩니다.
  3. PostActorCreated - 스폰된 액터의 생성 이후에 호출됩니다. 생성자같은 것이 여기에 와야 합니다. PostActorCreated PostLoad와 상호 배제적입니다.
  4. ExecuteConstruction:
    • OnConstruction - 액터의 생성 지점으로, 블루프린트 액터가 컴포넌트를 만들고 블루프린트 변수를 초기화시키는 곳입니다.
  5. PostActorConstruction :
    1. PreInitializeComponents 액터의 컴포넌트에서 InitializeComponent가 호출되기 전에 호출됩니다.
    2. InitializeComponent 액터에 정의된 컴포넌트 각각의 생성을 돕는 함수입니다.
    3. PostInitializeComponents 액터의 컴포넌트 초기화가 완료된 이후 호출됩니다.
  6. OnActorSpawned 가 UWorld 에 Broadcast됩니다.
  7. BeginPlay 가 호출됩니다.

디퍼드 스폰

"Expose on Spawn" 설정된 프로퍼티가 있으면 액터는 디퍼드(유예시켜 나중에 한 번에 몰아서) 스폰이 가능합니다.

  1. SpawnActorDeferred - 액터의 절차적 생성을 뜻하는 것으로, 블루프린트 컨스트럭션 스크립트 이전 추가적인 구성이 가능합니다.
  2. SpawnActor 안의 모든 것이 일어나지만, PostActorCreated (액터 생성 이후) 뒤에는 다음과 같은 일이 일어납니다:
    1. 유효하지만 완료되지는 않은 액터 인스턴스로 다양한 "초기화 함수" 구성 / 호출을 합니다.
    2. FinishSpawningActor - 액터를 마무리시키기 위해 호출되며, SpawnActor (액터 스폰) 줄의 ExecuteConstruction (생성 실행)을 집어듭니다.

소멸

1. Destroy - 액터를 제거해야겠다 싶지만 게임플레이가 계속 진행중일 때 게임에서 수동으로 호출됩니다. 액터는 킬 대기 상태로 마킹되며, 레벨의 액터 배열에서 제거됩니다.

2. EndPlay - 액터의 수명이 막바지에 다다랐음을 보증하기 위해 여러 곳에서 호출됩니다. 플레이 도중에는 Destroy (소멸)이나, Level Transition (레벨 전환)이나, 액터가 들어있는 스트리밍 레벨이 언로드되면 이 함수가 발동됩니다. EndPlay 가 호출되는 경우는 다음과 같습니다:

  • Destroy 명시적 호출
  • 에디터에서 플레이 종료
  • Level Transition (심리스 트래블 또는 맵 로드)
  • 액터가 들어있는 스트리밍 레벨 언로드
  • 액터의 수명 만료
  • 어플리케이션 종료 (모든 액터 소멸)

어떻게 발생했는지와는 상관없이, 액터는 RF_PendingKill 마킹되어 다음 가비지 컬렉션 주기 동안 deallocate (할당 해제)됩니다. 또한 pending kill (킬 대기상태)를 수동 검사하기 보다는, 보다 깔끔한 FWeakObjectPtr<AActor> 사용을 추천합니다.

3. OnDestroy - Destory (소멸)에 대한 구식(legacy) 반응입니다. 여기 있는 것들은 Level Transition (레벨 전환)이나 기타 게임 정리용 함수에 호출되는 EndPlay (플레이 종료)에 옮기는 것이 좋을 것입니다.