언리얼엔진(UE)

[UE] 액터 생애주기(Actor Life Cycle)

2h1824 2025. 2. 5. 22:29

1. 개요

Actor들을 다루는 과정에서 Tick함수나 생성자를 사용할 때, 어떤 것들은 생성자에서 초기화해주는 것이 좋고 어떤 것들은 Tick함수에서는 해서는 안되고 이래저래 제약사항이 있거나 더 나은 방식이 따로 있다는 것들을 알게 되니 아무래도 이러한 것들을 전반적으로 파악하고 있어야 Actor를 다룰 때 조금 더 편할 것이라는 생각이 들었다. 그래서 이러한 함수들의 역할에 직접적인 영향을 주는 액터 생애주기에 대해 알아보았다.

2. Actor Life Cycle

Actor가 생성되고, 월드에서 실행되며, 제거될 때까지의 흐름

 

액터의 라이프사이클 분해도(출처: 언리얼엔진 공식 커뮤니티)

Actor의 LifeCycle

  1. 생성 : 생성자(Constructor)
    • C++클래스 객체가 메모리에 생성될 때 단 한 번 호출
    • 월드에 등록된 상태가 아니라서 다른 액터나 월드 관련 기능 호출이 힘듬
    • 컴포넌트 생성 및 기본 변수 초기화를 하기에 적합
  2. 초기화 : PostInitializeComponents()
    • 액터의 모든 컴포넌트가 생성/초기화된 뒤 자동 호출
    • 컴포넌트가 준비된 상태이니 컴포넌트 간 상호작용 초기화 코드를 작성하기에 적합
  3. 게임 시작 : BeginPlay()
    • 게임이 시작되거나 런타임 중 액터가 새로 생성(Spawn)될 때 한 번 호출
    • 이 시점에서는 월드 및 액터들이 준비된 상태 ㅡ> 상호작용 코드 작성에 적합
    • AI, 게임 모드, 플레이어 컨트롤러 등 다른 시스템과의 연동도 이 시점에 처리하기 적합
  4. 실행 중 : Tick, 이벤트(OnHit, OnOverlap, OnInput 등)
    • Tick은 매 프레임마다 호출되면서 실시간 업데이트가 필요한 동작들을 처리(이동, 물리 연산)
    • Hit, Overlap, Input 등의 이벤트 관련 함수들도 이때 호출
  5. 종료 및 제거 : EndPlay(), Destroy(), Destroyed()
    • EndPlay()
      • Destroy()가 호출되거나 게임이 종료될 때 호출
      • 에디터에서 플레이 종료
      • 레벨 트랜지션 및 언로드
      • 자원 해제, 데이터 저장, UI 업데이트 등의 작업 수행 가능
    • Destroy() (액터 제거 요청)
      • 호출 시 액터가 즉시 제거되지 않고, 다음 프레임에서 제거ㅡ> PendingKill 상태
      • IsPendingKill()을 호출하여 액터가 제거 대기 중인지 확인 가능
    • Destroyed() (액터가 완전히 제거될 때 실행)
      • Destroy()가 호출된 후, 실제로 액터가 삭제될 때 실행
      • EndPlay() 이후에 호출 
      • 자식 액터 및 관련 리소스 정리하기 적합
    • Garbage Collection (GC) (메모리에서 완전 제거)
      • Destroy() 호출 후 PendingKill 상태가 되면 이후 GC가 메모리에서 완전히 제거

1. 에디터에서 플레이 

  1. 에디터의 액터가 새 월드로 복제 ㅡ> UObject::PostDuplicate 호출
  2. UAISystemBase::InitializeActorsForPlay 호출 (액터들의 게임 시작을 위한 초기화)
  3. 초기화되지 않은 액터들에 대해 ULevel::RouteActorINitiailize 호출 및 심리스 트래블 전환 처리
    1. 액터의 컴포넌트에서 InitializeComponent 호출 전에 AActor::PreInitializeComponents 호출
    2. 이어서 UActorComponent::InitializeComponent() 호출해 액터의 각 컴포넌트를 초기화
    3. AActor::PostInitializeComponents는 액터의 컴포넌트가 초기화된 후 호출
      이 시점에서 액터의 모든 컴포넌특 정상 동작 가능 ㅡ> 컴포넌트 간의 상호작용 설정 가능
  4. 레벨이 시작될 때 AActor::BeginPlay() 호출

2. Load from Disk (파일로 게임 실행)

  1. 액터가 디스크에서 로드 ㅡ> 아직 액터들은 초기화되지 않음
  2. 액터에서 PostLoad 호출 ㅡ> 커스텀 버전 관리 및 데이터 수정
  3. 월드에서 UAISystemBase::InitializeActorsForPlay 호출하여 액터 준비 및 게임플레이 시작
  4. ULevel::RouteActorInitialize() 호출 ㅡ> 에디터에서와 동일
  5. 레벨이 시작될 때 AActor::BeginPlay() 호출

3. Spawn (스폰)

  1. UWorld::SpawnActor 호출 
  2. 액터가 월드에 스폰된 이후 AActor::PostSpawnInitialize 호출 ㅡ> 기본적인 속성 초기화 및 Transform 설정
  3. AActor::PostActorCreated() 호출 ㅡ> 모든 생성자 로직을 이곳에서 수행하는 것이 좋음
  4. AActor::ExecuteContruction() 호출
  5. 액터의 OnConstruction()이 호출됨 ㅡ> 액터 생성, 블루프린트 액터의 변수 초기화 및 컴포넌트 생성이 이루어짐
  6. AActor::PostActorConstruction 호출 ㅡ> 에디터에서 플레이 3-1, 3-2, 3-3 과 동일한 과정 수행
  7. UWorld::OnActorSpawned가 UWolrd에서 호출 ㅡ> UWorld가 액터가 정상 생성되었다고 브로드캐스트
  8. AActor::BeginPlay() 호출

4. Deferred Spawn 

'스폰 시 노출(Expose on Spawn)'으로 설정된 프로퍼티가 있으면 Deferred Spawn으로 처리

ㅡ> 설정된 변수를 설정하고 나중에 스폰 완료 가능

  1. UWorld::SpawnActorDeferred 호출 
  2. Spawn의 2~3단계와 동일한 작업 
  3. 유효하지만 불완전한 액터 인스턴스로 다양한 '초기화 함수'를 구성하고 호출
  4. AActor::FinishSpawning() 호출 
  5. Spawn의 5단계부터 동일한 과정 수행

3. 정리

오늘은 액터의 생명주기에 대해 알아보았다. 우선 친근한 내용은 아니라 그리 눈에 들어오는 느낌은 아니었지만 얼추 액터의 생성과정에서 절차가 어떤 방식으로 이루어져 있는지에 대해서는 감이 오는 것 같다. 이를 참고해서 앞으로 액터를 다룰 때에는 액터의 초기화 같은 작업들을 어느 부분에서 수행하는게 좋을지 한 번 더 생각해 보는 시간을 가질 수 있을 것 같다. 


참고자료

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-actor-lifecycle

https://hmmterestinguri.tistory.com/69

 

언리얼 엔진 Actor의 라이프 사이클

언리얼 엔진에서 Actor는 게임 도중에 언제든지 생성(Spawn)될 수 있고, 필요 없어지면 파괴(Destroy)될 수 있다. 이를 Actor 라이프 사이클이라 부르며, 이 과정을 이해하면 게임 로직을 보다 효율적이

hmmterestinguri.tistory.com

https://dlaiml.tistory.com/entry/UE5-Actor-Lifecycle-%EC%95%A1%ED%84%B0-%EC%83%9D%EC%95%A0%EC%A3%BC%EA%B8%B0

 

[UE5] Actor Lifecycle (액터 생애주기)

Actor Lifecycle언리얼 엔진에서 기능을 추가할 때, 어느 클래스에 해당 기능을 추가할 것인가, 해당 클래스의 어느 함수를 Override하고 그 함수의 호출 시점은 어떻게 되는가는 항상 고민하는 부분이

dlaiml.tistory.com

https://mynameiskgws.tistory.com/7

 

UE5 - 액터의 라이프사이클

언리얼 엔진에서 제공하는 다양한 클래스들은 내부 GC(Garbage Collection)을 통해 메모리를 관리한다는 것을 지난 포스팅을 통해 알게되었습니다.※ UE5 - Garbage Collection  이에 추가적으로 레벨에 스

mynameiskgws.tistory.com