[TIL 45일차] <언리얼 C++> 액터의 라이프 사이클

2026. 4. 8. 17:23TIL

언리얼 C++을 공부하는 중 Constructor, BeginPlay, Tick 같은 기본 함수들을 자주 보게 되었다.

이 함수들을 정리하면서 적당한 위치와 시기에 사용하는 것이 중요하다는 것을 알았다.

 

이제 이 함수를 알아보려고 한다.


액터 라이프 사이클

액터의 흐름은 대략 이렇다.

더보기

생성 -> 컴포넌트 초기화 -> 게임 시작 시점 진입 -> 필요하면 매 프레임 업데이트 -> 제거 또는 레벨에서 빠짐

각 함수들을 알아보자.

 


생성자 (Constructor)

생성자는 액터 객체가 만들어질 때 가장 먼저 만나는 구간이다. (게임 시작 전)

이 단계에서는 일반적으로 액터의 기본 틀을 잡는 작업을 한다.

 

CreateDefaultSubobject로 루트 컴포넌트나 메시 컴포넌트를 만들고, 기본값을 세팅하는 코드를 넣기 좋다.

 

하지만 이 시점은 실제 게임 월드에서 완전히 준비된 상태가 아니므로, 다른 액터를 찾거나 게임 진행 중인 상황을 전제로 한 작업은 피하는 것이 좋다.

 


PostInitializeComponents()

이 함수는 이름 그대로 컴포넌트 초기화가 끝난 뒤 호출되는 단계이다.

 

그래서 생성자에서 만들어진 컴포넌트들을 실제로 서로 연결하거나, 컴포넌트 상태를 한 번 더 정리하는 용도로 이해하면 된다.

 

즉, 생성자가 부품 만들기라면 PostInitializeComponents()는 부품들이 준비된 후 연결 상태를 점검하는 구간이다.

 


BeginPlay()

이 함수는 레벨이 실제로 틱을 시작할 때, 즉 게임을 실제로 플레이하면 호출되는 함수이다.

 

보통 PostInitializeComponents() 직후에 바로 이어진다. 그래서 월드에 접근하거나, 다른 액터를 참조하거나, 게임모드, 플레이어, AI 같은 다른 시스템과 연결하는 초기화는 여기에서 처리하는 것이 자연스럽다.

 

즉, BeginPlay()는 게임이 진짜 시작된 뒤 한 번 실행하는 준비 함수이다.


Tick(float DeltaTime)

Tick()은 매 프레임 호출되는 업데이트 함수이다.

 

이 함수는 액터가 틱을 사용할 수 있도록 따로 설정해야 한다.

 

보통 BeginPlay() 이후에 틱을 시작하며, 틱 함수는 프레임 내 호출 시점과 활성화 여부를 조정할 수 있다.

 

이동, 추적, 실시간 회전처럼 매 프레임 계산이 필요한 로직에 유용하다.


Destroyed() / EndPlay()

Destroyed() 함수는 액터가 파괴될 때 실행되는 함수이고, EndPlay()는 액터가 삭제되거나 레벨에서 제거될 때 호출되는 함수이다.

 

최근엔 Destroyed의 기능이 EndPlay로 통합되었다고 한다.

 

실무적으로 중요한 정리 작업은 EndPlay() 중심으로 생각하는 편이 더 안전하다.

타이머 해제, 외부 이벤트 바인딩 해제, 상태 저장, 레벨 종료 시점 정리 같은 것들이다.

 


정리

  • Constructor : 컴포넌트 생성, 기본값 세팅
  • PostInitializeComponenets() : 컴포넌트 초기화 완료 후 연결 / 점검
  • BeginPlay() : 게임 시작 후 실제 초기화
  • Tick() : 매 프레임 갱신
  • EndPlay() : 종료 시 정리 작업