나만의 작은 도서관

[TIL][C++] 251103 MMO 서버 개발 128일차: [언리얼] 월드(UWorld)와 레벨(ULevel)의 관계 재정리, 월드(UWorld)와 게임 인스턴스와의 관계는 종속 관계인가? 본문

Today I Learn

[TIL][C++] 251103 MMO 서버 개발 128일차: [언리얼] 월드(UWorld)와 레벨(ULevel)의 관계 재정리, 월드(UWorld)와 게임 인스턴스와의 관계는 종속 관계인가?

pledge24 2025. 11. 3. 23:55
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

[언리얼] 월드(UWorld)와 레벨(ULevel)의 관계 재정리

월드(UWorld)

  • 게임이 실행되는 전체 환경과 관리 시스템. 게임 플레이를 진행하는 월드는 항상 하나만 존재한다.

 

 

레벨(ULevel)

  • 월드를 구성하는 실제 환경 데이터의 집합. Map과 같은 개념이며, 배치된 모든 오브젝트(Ex. 캐릭터, 카메라, 조명 등)를 포함하고 관리한다.

 


월드 == 레벨? ⇒ X

  • 월드는 레벨이 아니다. 에디터에서 볼 때는 이 둘의 역할이 비슷해 보이지만, 그건 우리가 월드에 하나의 레벨만 운영했기 때문이다.
  • 월드는 게임 실행 중 실제로 동작하는 레벨들의 집합과 그 상태를 관리하는 최상위 객체이다. 즉, 여러 개의 레벨을 가질 수 있다는 것. 요약하자면,
    • Level = 맵
    • World = 여러 레벨로 구성되어 있는 실제 세계(또는 실행 환경)

 

월드가 가지는 레벨의 구조

https://kyoun.tistory.com/138

  • 월드는 한 개의 Persistent Level(기본 레벨)과 여러 개의 Sub Level(스트리밍 레벨)을 가진다.

 

Persistent Level과 Sub Level이란?

  • Persistent Level
    • 월드가 로드될 때 가장 먼저 로드되고 항상 메모리에 유지되는 기본 레벨.
    • 월드의 중심 허브 역할을 하는 레벨이며, GameMode, GameState, PlayerStart 등을 관리한다.
  • Sub-Level
    • Persistent Level에 추가로 로드되는 레벨.
    • 대규모 월드를 구성하기 위해 사용하며, 지형, 건물, 특정 구역의 액터 등 특정 지역 또는 데이터를 분리하여 관리하기 위해 사용한다.
    • 로드 / 언로드에 자유로우며, 반드시 Persistent Level에 종속되어 로드되어야 한다.

 

 

Persistent Level과 Sub Level 구분법

  • Sub Level은 사용자가 직접 추가해야 생긴다. 따라서, 새로운 Level 파일(.umap)을 생성했다면 해당 Level 파일은 Persistent Level만 있고 Sub Level은 없다.

 


[언리얼] 월드(UWorld)와 게임 인스턴스와의 관계는 종속 관계인가?

 

게임인스턴스(UGameInstance)

  • 게임인스턴스(UGameInstance)는 게임이 시작되어 종료될 때까지 메모리에 단 하나만 존재하는 싱글톤(Singleton) 객체이다.

 

월드(UWorld)는 Persistent Level이 전환될 때마다 파괴된다.

  • 게임플레이시 진행 중인 월드는 유일하게 존재하지만, 완전한 레벨 전환(Persistent Level)의 전환이 발생하면, 해당 월드는 파괴된다.
  • 즉, 게임을 하는 도중 월드 객체는 계속 파괴되고 생성되고를 반복한다.

 

결론적으로 게임인스턴스와 월드는 종속관계가 아니다.

  • 이 둘은 직접적인 종속 관계가 아니다. 다만, 게임인스턴스가 상위 개념이고, 월드는 하위 개념이므로, 월드가 게임인스턴스에 종속되어 존재하기는 한다.
    • 간단하게 생각하면 “게임인스턴스가 월드매니저 역할을 한다”라고 할 수 있다.

 

서로가 서로를 알 수 있는 맥락이다.

  • 게임인스턴스는 현재 실행 중인 월드를,
  • 월드는 게임인스턴스를 알 수 있다.
GameInstance::GetWorld();
GetWorld()->GetGameInstance();
// 월드에 배치된 액터들도 전역 객체인 게임인스턴스에 접근 가능
AActor::GetGameInstance()
  • 대충 World에 종속되는 모든 객체들은 GameInstance에 접근 가능하다고 보면 된다.