언리얼 엔진을 사용하다 보면 GetWorld()라는 함수를 자주 마주하게 된다.

특히 액터를 스폰하거나 월드와 관련된 작업을 할 때 필수적으로 사용되는 함수이기 때문에, 이를 제대로 이해하는 것은 필수적이다.

이 글에서는 UWorld란 무엇인지, GetWorld()는 왜 쓰이는지, 어떤 클래스에서 사용할 수 있는지에 대해 정리해본다.

UWorld는 무엇인가?

UWorld는 언리얼 엔진에서 게임 실행 컨텍스트 전체를 아우르는 클래스이다.

하나의 레벨(맵)은 하나의 UWorld 객체로 표현되며, 이 안에는 다음과 같은 요소들이 포함된다:

  • 현재 로드된 레벨 정보
  • 월드에 존재하는 모든 액터 목록
  • 씬(Scene) 구성 정보
  • 물리 및 AI 시스템
  • 틱 처리, 타이머, 네트워크 처리 등

즉, UWorld는 “이 게임이 지금 실행되고 있는 세계”를 구체적으로 나타내는 핵심 객체라고 볼 수 있다.

GetWorld()는 왜 필요한가?

GetWorld()는 현재 객체가 속해 있는 UWorld에 접근하기 위한 함수이다.

언리얼 엔진의 대부분의 기능은 결국 월드 컨텍스트를 기반으로 동작하기 때문에, UWorld*를 얻는 것은 매우 중요하다.

예를 들어, 액터를 생성하고 싶다면 다음과 같이 코드를 작성하게 된다:

UWorld* World = GetWorld();
if (World)
{
    World->SpawnActor<AEnemy>(EnemyClass, Location, Rotation);
}

여기서 GetWorld()를 통해 현재 액터 또는 컴포넌트가 속한 월드를 받아오는 것이 핵심이다.

어떤 클래스에서 GetWorld()를 사용할 수 있는가?

GetWorld()는 모든 클래스에서 자동으로 제공되는 것은 아니다.

언리얼의 클래스 구조에 따라 일부 클래스는 기본적으로 이를 구현하고 있으며, 다른 클래스는 수동으로 구현해야 한다.

클래스 종류 GetWorld() 사용 가능 여부 설명
AActor ✅ 사용 가능 자체적으로 구현되어 있음
UActorComponent ✅ 사용 가능 GetOwner()->GetWorld() 방식으로 구현
UUserWidget ✅ 사용 가능 위젯이 어느 월드에 배치되었는지에 따라 결정됨
UGameInstance ⭕ 일부 상황에서 가능 기본적으로는 정의되어 있지 않지만 우회적으로 접근 가능
UObject (기본) ❌ 직접 구현 필요 GetWorld() 미정의, 명시적 구현 필요

만약 커스텀 UObject에서 GetWorld()를 사용하고 싶다면, 다음과 같이 직접 구현해야 한다:

UWorld* UMyObject::GetWorld() const
{
    return CachedWorld; // 또는 외부에서 전달받은 UWorld 포인터
}

GWorld는 무엇인가?

GWorldUWorld* 타입의 전역 변수로, 현재 사용 중인 월드에 직접 접근할 수 있게 해준다.

하지만 이는 디버깅이나 특수한 테스트 상황에서만 사용해야 하며, 일반적인 게임 로직에서는 GetWorld()를 사용하는 것이 훨씬 안전하고 권장된다.

마무리

언리얼 엔진에서의 UWorld는 단순히 레벨을 나타내는 객체를 넘어, 게임 전반의 실행 컨텍스트를 포함한 매우 중요한 역할을 한다.

그리고 이를 얻기 위한 창구인 GetWorld()는 언리얼 프로젝트 전반에 걸쳐 자주 쓰이는 기본 중의 기본이다.

이 구조를 제대로 이해하고 있어야만 액터를 생성하고, 씬을 조작하고, 다양한 게임 로직을 정확히 구현할 수 있게 된다.

댓글남기기