1) Constructor
3-4. 액터 라이프 사이클
액터를 제대로 다루려면 먼저 언제 어떤 함수가 호출되는지를 이해해야 합니다. 같은 코드라도 어느 단계에 두느냐에 따라 동작이 완전히 달라지기 때문입니다. 이 페이지에서는 액터가 생성되어 소멸하기까지의 전체 흐름을 살펴보고, 각 단계에 어떤 코드를 두는 것이 좋은지 정리합니다.
핵심 단계는 Constructor, OnConstruction, BeginPlay, Tick, EndPlay로 나눌 수 있으며, 이 다섯 지점만 명확히 구분해도 대부분의 액터 구조가 깔끔해집니다.
전체 흐름
섹션 제목: “전체 흐름”액터 라이프 사이클은 상황(에디터 배치, 런타임 스폰, 레벨 전환 등)에 따라 세부 호출이 조금씩 달라집니다. 하지만 실무에서 가장 자주 마주치는 핵심 흐름은 다음 순서를 따릅니다.
2) OnConstruction
3) BeginPlay
4) Tick
5) EndPlay → Destroyed
OnConstruction은 Constructor 다음, 그리고 에디터에서 값이 변경될 때마다 추가로 호출된다는 점이 특징입니다. 따라서 게임이 실행되는 동안 한 번만 실행하고 싶은 로직을 여기에 두면 의도치 않게 여러 번 실행될 수 있으니 주의하세요.
단계별 역할
섹션 제목: “단계별 역할”각 단계에서 무엇을 해야 하고 무엇을 피해야 하는지 정리하면 다음과 같습니다.
Constructor에서 할 일
- 기본 컴포넌트 생성 (
CreateDefaultSubobject) - 루트 및 부착 관계 설정 (
SetRootComponent,SetupAttachment) - 기본값 설정 (플래그, 초기 파라미터)
BeginPlay에서 할 일
- 실행 중에 필요한 참조 연결
- 타이머 시작, Delegate 바인딩
- 플레이 상태에 기반한 초기 로직 시작
Tick에서 주의할 점
- 불필요한 연산은 Tick에서 제거
- 조건부 Tick 활성화 고려
- 가능하면 타이머나 이벤트로 대체
EndPlay에서 할 일
- 타이머와 Delegate 정리
- 외부 포인터 및 참조 해제
- 종료 사유(Reason)에 기반한 분기 처리
C++ 예시
섹션 제목: “C++ 예시”아래 예시는 라이프 사이클의 핵심 지점이 실제로 어떤 순서로 호출되는지 확인하기 위한 최소 구조입니다. 헤더에서는 오버라이드할 가상 함수들을 선언하고, 소스에서는 각 함수에 로그를 남겨 호출 순서를 직접 눈으로 확인합니다.
UCLASS()class UNREALTUTORIAL_API AItem : public AActor{ GENERATED_BODY()
public: AItem();
protected: virtual void OnConstruction(const FTransform& Transform) override; virtual void BeginPlay() override; virtual void Tick(float DeltaTime) override; virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;};AItem::AItem(){ PrimaryActorTick.bCanEverTick = true;}
void AItem::OnConstruction(const FTransform& Transform){ Super::OnConstruction(Transform); UE_LOG(LogTemp, Log, TEXT("OnConstruction"));}
void AItem::BeginPlay(){ Super::BeginPlay(); UE_LOG(LogTemp, Warning, TEXT("BeginPlay"));}
void AItem::Tick(float DeltaTime){ Super::Tick(DeltaTime);}
void AItem::EndPlay(const EEndPlayReason::Type EndPlayReason){ Super::EndPlay(EndPlayReason); UE_LOG(LogTemp, Warning, TEXT("EndPlay"));}각 오버라이드 함수의 첫 줄에서 Super:: 버전을 반드시 호출해야 한다는 점을 기억하세요. 부모 클래스가 수행하는 기본 초기화와 정리를 건너뛰면, 컴포넌트 등록이나 월드 정리 같은 엔진 내부 동작이 누락되어 예기치 않은 버그로 이어질 수 있습니다.
실무 팁
섹션 제목: “실무 팁”초기화 위치를 섞지 않기
Tick 남용 주의
EndPlay 정리 습관화
로그로 호출 순서 확인
UE_LOG를 찍어 호출 순서를 확인하면 대부분 빠르게 원인을 찾을 수 있습니다.