1. 개요

오픈 월드 생존 게임을 개발 중이며, 메인 메뉴에서 인게임으로 넘어갈 때 자연스럽고 끊김 없는 레벨 전환을 구현하고 싶어서 레벨 로딩 방식에 대해 정리하게 되었습니다. 이를 위해 언리얼 엔진에서 제공하는 다양한 레벨 로딩 방식을 조사하였습니다.


2. 언리얼 엔진의 레벨 전환 방식들

  • OpenLevel(): 전통적인 동기적 방식, 전체 레벨 교체
  • Level Streaming: 비동기 방식, 필요한 레벨을 불러오거나 제거
  • Seamless Travel:서버와 클라이언트의 상태를 유지한 채 전환하는 방식

3. OpenLevel - 동기적 레벨 전환

  • Level을 완전히 교체하는 방식
  • 호출 시 현재 레벨 언로드 후 새로운 레벨 로드
  • 새로운 레벨 로딩 완료까지 화면 렌더링 멈춤
장점 단점
구현이 가장 간단함
클린 상태에서 로딩되므로 디버깅 용이
로딩중 화면 멈춤(로딩 화면 구현 필요)
메모리 재로딩 비용 큼
네트워크 게임에서 클라이언트 재연결 필요

4. Level Streaming - 비동기적 레벨 전환

  • 기존 레벨을 유지하고 백그라운드에서 다른 레벨 불러오기 가능
    • LoadStreamLevel() / UnloadStreamLevel() 함수
  • 원하는 시점에 해당 레벨을 보이게 만들거나 숨기기 가능
    • LoadStreamLevel() / LevelStreamingDynamic의 파라미터 조절
    • SetShouldBeVisible() / SetShouldBeLoaded() 함수로 처리
// 파라미터 조절 방식
LoadStreamLevel(LevelName = "Cave_Level",  
                MakeVisibleAfterLoad = false,  // ← 핵심!
                ShouldBlockOnLoad = false)

// 함수 사용 방식
if (StreamingLevel)
{
    StreamingLevel->SetShouldBeVisible(false);  // 일단 숨긴 상태로 로딩
    StreamingLevel->SetShouldBeLoaded(true);    // 로딩만 함

    // 나중에 이 타이밍에서 보이게 만들기
    StreamingLevel->SetShouldBeVisible(true);
}
장점 단점
비동기적 방식으로 자연스러운 로딩 가능
메모리 관리 효율적
레벨 간 의존성 주의 필요
면밀한 월드 구조 설계 필요

5. Seamless Travel - 네트워크 상태 유지 전환 방식

  • 서버가 맵 이동 시 클라이언트와의 연결 유지해야 할 때 사용
    • 매커니즘: Actor Preservation ("보존 가능한 액터" 목록을 만들고, 이 액터들을 파괴하지 않고 유지)
    • APlayerController를 유지한 채로 레벨 전환.
    • ServerTravel() 또는 ClientTravel()에서 ?Seamless 옵션 사용
  • Transition Map: 전환 중 임시로 로딩되는 맵. Seamless Travel 중 발생하는 공백을 보완
    • 목적: 원활한 레벨전환, 플레이어 상태 유지(캐릭터, 인벤토리 등), 경량화된 임시 맵
장점 단점
멀티플레이에서 상태 유지 가능
클라이언트 재접속 없이 전환 가능
여러 리소스를 병렬로 로딩 가능
Transition Map 구성 필요
디버깅 난이도 어려움

 

언리얼 엔진 공식 문서: Travellling in Multiplayer


6. BONUS: 더 부드러운 레벨 전환 방법

방법  설명
Preloading Assets 게임 시작 시 미리 로딩할 리소스를 AssetManager로 관리
LevelStreamingDynamic "동적"으로 원하는 시점에 로딩 → 전환
Camera Fade 연출 PlayerController->ClientStartCameraFade() 사용해서 전환 부드럽게 보이기