[UE5] Actor 생명주기와 GameInstance

Jaeyoung Ko·2025년 2월 17일

공식문서 참고

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-actor-lifecycle?application_version=5.4

Actor 인스턴스를 스폰하게 되면,

  1. UWorld::SpawnActor 로 월드에 스폰

  2. 이후 AActor::PostSpawnInitialize 가 호출

  3. AActor::PostActorCreated는 생성 이후 스폰된 액터에 대해 호출되며, 모든 생성자 구현이 이 곳으로 이동한다. (PostLoad와 상호 배타적)

  4. AActor::ExecuteConstruction 호출

  5. AActor::OnConstruction 으로 액터 생성, 블루프린트 액터의 컴포넌트 생성 및 블루프린트 변수 초기화

  6. AActor::PostActorConstruction

  • AActor::PreInitializeComponents
  • UActorComponent::InitializeComponent : 액터에 정의된 각 컴포넌트를 생성
  • AActor::PostInitializeComponents : 액터 컴포넌트가 초기화된 후에 호출
  1. UWorld::OnActorSpawned가 UWorld에서 브로드캐스트

  2. AActor::BeginPlay 호출

의 과정을 거치게 된다.




사실상, 개발 단계에서 가장 자주 사용해서 우리가 주목할 부분은

constructor, PostInitializeComponents, BeginPlay 세 가지로 축약해볼 수 있다.



간단하게 보면,

constructor

액터 생성 시 호출되어, 가장 기본적으로 component에 대한 생성 및 초기화, 변수에 대한 초기화, 기본 설정 등의 작업을 한다.

PostInitializeComponents

모든 컴포넌트 초기화 후, BeginPlay 이전 시점으로,

컴포넌트 간 상호 작용 설정, 애니메이션 설정을 담당한다.

필자의 프로젝트로 따지면

void AMIRACharacter::PostInitializeComponents()
{
	Super::PostInitializeComponents();

	// initializing for anim montage
	MIRAAnim = Cast<UMIRAAnimInstance>(GetMesh()->GetAnimInstance());
	if (!MIRAAnim) return;

	// binding logics to anim notify
	MIRAAnim->OnSaveAttackCheck.AddLambda([this]() -> void {
		SaveAttackCombo();
	});
	MIRAAnim->OnResetComboCheck.AddLambda([this]() -> void {
		ResetAttackCombo();
	});
	MIRAAnim->OnAttackHitCheck.AddUObject(this, &AMIRACharacter::AttackCheck);
}

이렇게 초기화된 컴포넌트에 접근하여 처리한다.

BeginPlay

월드에 등록이 된다는 것이 큰 부분으로, 안전하게 월드에 접근 할 수 있다.

따라서 게임 시작 관련 설정 중 월드에 대해 접근하여 다른 액터 참조 초기화 같은 부분을 담당한다.




GC

UObject가 소멸로 표시된 후에 가비지 컬렉션을 통해 메모리에서 해당 오브젝트를 제거하여 사용 중인 리소스를 모두 해제시킨다.

UObject::BeginDestroy

  • 오브젝트가 메모리를 해제하고 그래픽 스레드 프록시 오브젝트와 같은 기타 멀티스레드 리소스를 처리할 기회입니다. 소멸과 관련된 대부분의 게임플레이 함수 기능은 앞서 EndPlay 에서 처리되어야 합니다.

UObject::IsReadyForFinishDestroy

  • 가비지 컬렉션 프로세스는 이 함수를 호출하여 오브젝트가 영구적으로 제거될 준비가 되었는지를 결정합니다. false 가 반환되면, 이 함수는 다음 가비지 컬렉션 패스까지 실제 오브젝트 소멸을 연기할 수 있습니다.

UObject::FinishDestroy

  • 오브젝트가 실제로 소멸되므로, 내부 데이터 구조체를 해제할 마지막 기회입니다. 이 마지막 호출 후에 메모리가 해제됩니다.






Game Instance


언리얼 엔진에서 Game Instance 는 게임의 시작부터 종료까지 전체 수명 주기 동안 단 하나로 유지되는 객체이다.


놀랍게도, 공식 문서에서조차 정확히 자세히 다루고 있는 레퍼런스가 존재하지 않는다. 다만, 게임 인스턴스는 게임 데이터를 저장하는 공간으로서의 역할을 주로 하는 것 같다.


즉, 주요 역할은

  • 전역 데이터 관리
  • 게임 시스템 관리
  • 레벨 간 데이터 공유
  • 게임 흐름 제어

등으로 사용된다.



Game Instance 는 게임 전체에서 접근 가능한 데이터에 대한 저장과 관리에 사용된다. 싱글톤처럼 존재하기 때문에 게임 내 어디서든 접근하여 데이터를 읽고 쓸 수 있다.

레벨이 변경될 때 파괴되지 않고 유지되므로, 레벨 간 데이터 공유에도 유용하게 사용할 수 있다.

공식문서의 게임 흐름 개요 에 따르면 게임 인스턴스는 공식적으로 게임 플레이가 시작되기 전, 먼저 게임 인스턴스를 Create한 후 Init을 진행하게 된다.

profile
안녕하세요, 고재영입니다. 언제나 즐겁게 살려고 노력합니다.

0개의 댓글