본문 바로가기

프로그래밍/언리얼엔진

액터의 수명 주기(Actor Life Cycle)

아래 사진은 액터가 레벨에 어떻게 생성, 소멸 되는지를 나타낸 표


대표적인 수명 주기

스폰

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

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

게임플레이 도중

이는 완벽히 옵션인데, 많은 액터가 플레이 도중에는 실제로 죽지 않을 것이기 때문입니다.

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

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

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

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

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

 

 

소멸

오브젝트가 소멸 마킹된 이후에는, 가비지 컬렉션이 일어날 때 메모리에서 실제로 제거되어 사용중이던 리소스가 해제됩니다.

오브젝트의 소멸 도중 호출되는 함수는 다음과 같습니다:

  1. BeginDestroy 소멸 시작 - 여기서 오브젝트의 메모리를 해제하고 기타 (그래픽 스레드 프록시 오브젝트 등의) 멀티스레드 리소스 처리를 할 수 있습니다. 소멸 예정 관련 대부분의 게임플레이 함수성은 더욱 일찍 EndPlay 에서 처리되었을 것입니다.
  2. IsReadyForFinishDestroy 소멸 마무리 준비 여부 - 가비지 컬렉션 프로세스는 이 함수를 호출하여 오브젝트 할당을 영구히 해제할 준비가 되었는지 여부를 결정합니다. false 를 반환하면, 이 함수는 다음 가비지 컬렉션 패스까지 실제 오브젝트 소멸 작업을 유예시킵니다.
  3. FinishDestroy 소멸 마무리 - 오브젝트가 곧 소멸되므로, 내부 데이터 구조체를 해제시킬 마지막 기회입니다. 메모리 해제 이전 마지막 호출입니다.

출처 : 액터의 생명 주기 

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