아래 글은 언리얼 엔진에서 멀티플레이어 게임 맵 전환(로비 → 실제 게임 맵)을 매끄럽게 처리하는 과정을 정리한 내용입니다.
**매끄러운 여행(Seamless Travel)**과 **비매끄러운 여행(Non-Seamless Travel)**의 차이, 로비 시스템 구현, 그리고 전환 레벨 설정까지 한눈에 살펴볼 수 있도록 구성했습니다.


1. 매끄러운 여행(Seamless Travel)이란?

매끄러운 여행 vs 비매끄러운 여행

  • 비매끄러운 여행(Non-Seamless Travel)
    • 클라이언트와 서버 간 연결을 완전히 끊었다가 새로운 맵에 재연결하는 방식입니다.
    • 맵 전환 시 Server에서 Client가 일시적으로 끊기고 다시 연결해 로딩 과정을 거칩니다.
    • 재연결 과정에서 서버를 찾지 못하거나 연결 실패 등의 문제가 발생하기 쉽습니다.
  • 매끄러운 여행(Seamless Travel)
    • 서버와 클라이언트의 연결을 유지한 채 맵만 전환합니다.
    • 재연결 문제를 줄이고 부드러운 플레이 경험을 제공합니다.
    • 언리얼 엔진에서는 bUseSeamlessTravel = true 설정을 통해 매끄러운 여행을 활성화할 수 있습니다.

시각 자료 제안:

  • “매끄러운 여행 vs 비매끄러운 여행” 비교 표
  • 여행 방식에 따른 서버/클라이언트 흐름 다이어그램

2. 전환 레벨(Transition Level)이 필요한 이유

언리얼 엔진에서 매끄러운 여행을 할 때는 중간에 **전환 레벨(Transition Map)**이 필요합니다.

  • 한 맵에서 다른 맵으로 바로 이동하려면 두 맵을 모두 메모리에 동시에 로드해야 하므로, 큰 자원 소모가 발생합니다.
  • 전환 레벨을 두면, 새 맵이 로드되는 동안 잠시 이 전환 레벨로 플레이어들을 대기시켜 자원 사용을 효율화합니다.
  • 프로젝트 설정( Edit > Project Settings )에서 Transition Map으로 지정해주면 됩니다.

시각 자료 제안:

  • 전환 레벨 삽입 전후의 로딩 흐름 표
  • 전환 레벨이 비어 있는 경우(혹은 간단한 로딩 화면 표시)의 예시 이미지

3. 로비 시스템 구현하기

3.1 로비 게임 모드(Lobby GameMode) 클래스 생성

  1. C++ 클래스 생성
    • GameModeBase / GameMode를 상속받는 로비 전용 클래스를 새로 만듭니다.
    • 예) LobbyGameMode.h / .cpp
  2. PostLogin 함수 재정의
    • PlayerCount가 특정 숫자(예: 2)에 도달하면 ServerTravel을 호출하여 모든 플레이어를 새로운 맵으로 이동시킵니다.
    • **bUseSeamlessTravel = true**로 설정해 매끄러운 여행을 활성화합니다.
  3. // LobbyGameMode.h UCLASS() class YOURPROJECT_API ALobbyGameMode : public AGameMode { GENERATED_BODY() public: virtual void PostLogin(APlayerController* NewPlayer) override; // ... 필요하다면 다른 변수나 함수 선언 }; // LobbyGameMode.cpp #include "LobbyGameMode.h" #include "GameFramework/GameStateBase.h" void ALobbyGameMode::PostLogin(APlayerController* NewPlayer) { Super::PostLogin(NewPlayer); // 현재 로비에 접속한 플레이어 수 확인 int32 PlayerCount = GameState->PlayerArray.Num(); UE_LOG(LogTemp, Warning, TEXT("Current Lobby Player Count: %d"), PlayerCount); // 예: 2명이 모이면 본 게임 맵으로 이동 if (PlayerCount >= 2) { // 매끄러운 여행을 위해 bUseSeamlessTravel 설정 bUseSeamlessTravel = true; // 서버가 새로운 맵으로 이동(Seamless Travel) UWorld* World = GetWorld(); if (World) { // 패스 예시: "/Game/Maps/BlasterMap?listen" // listen 옵션으로 서버 열기 World->ServerTravel(TEXT("/Game/Maps/BlasterMap?listen")); } } }
  4. 블루프린트 게임 모드
    • 위에서 만든 LobbyGameMode를 블루프린트로 확장한 뒤, 로비 레벨에서 해당 블루프린트를 GameMode Override로 설정합니다.
    • 로비 레벨: World Settings → GameMode Override → BP_LobbyGameMode

4. 본 게임 맵(BlasterMap) & 게임 모드 설정

4.1 새 맵 복사 & 설정

  • 샘플 레벨(예: “LearningKitGamesShowcase”)을 복사하여,
    • 이름: BlasterMap
    • 폴더: Maps/BlasterMap
  • 게임모드: 새 GameMode 블루프린트(BP_BlasterGameMode)를 만들어서 적용
  • 레벨 디자인(장애물, 캐릭터 스폰 지점, 아이템 배치 등)을 자유롭게 구성

4.2 테스트하기

  1. 로비 맵에서 플레이어 1인(host)이 게임을 호스팅
  2. 다른 컴퓨터(플레이어 2)가 같은 세션에 Join
  3. **PostLogin**에서 PlayerCount == 2 확인
  4. ServerTravel("/Game/Maps/BlasterMap?listen") 호출
  5. 두 플레이어가 매끄럽게 BlasterMap으로 이동

5. 전환 레벨(Transition Map) 구체 설정

  1. 빈 레벨을 만들어 TransitionMap으로 저장
  2. Edit > Project Settings > Maps & Modes > Transition Map에서 해당 레벨 지정
  3. ServerTravel 시 내부적으로 TransitionMap을 거쳐 새 맵이 로드됨
  4. 플레이어 입장에선 끊김 없이 부드럽게 새 맵으로 전환

: 전환 맵에는 큰 지형이나 복잡한 오브젝트가 필요 없습니다. 최대한 간단하거나 로딩 UI만 두는 형태를 추천합니다.


6. 실전 팁 & 마무리

  1. 플레이어 수 동적 설정
    • 현재 예시에서는 if (PlayerCount == 2)처럼 하드코딩했지만,
    • 실제 프로젝트에서는 블루프린트 변수(예: MaxLobbyPlayers)를 두어 유연하게 조절합니다.
  2. 테스트 환경
    • 멀티플레이어 테스트 시, 다른 PC 또는 가상머신 등 여러 사용자 환경에서 접속을 시도해야 합니다.
    • -log 옵션으로 실행하거나, Server / Client 구분하여 여러 파이라이 제어하는 것도 방법입니다.
  3. 레벨 최적화
    • 매끄러운 전환은 편리하지만, 맵 로딩 시간 자체를 단축하기 위해선 최적화(라이트맵, LOD, Assets 관리)가 중요합니다.
    • 순간적으로 전환 맵에서 대기하는 동안에도 뒷단에서는 다음 맵 로딩에 필요한 리소스를 효율적으로 할당할 수 있습니다.
  4. 메뉴 맵 및 로비 맵 꾸미기
    • 사용자가 초기 접속 시 첫인상을 좌우하는 맵(예: 메뉴 맵, 로비 맵)은 최소한의 오브젝트로 깔끔하게 구성해도 되고,
    • “게임 세계관”을 표현하고 싶다면 씬 연출을 살짝 넣어 매력적으로 꾸미는 방법도 좋습니다.

결론

  • **매끄러운 여행(Seamless Travel)**은 멀티플레이어 게임에서 자연스러운 맵 전환을 보장하는 핵심 기술입니다.
  • **전환 레벨(Transition Map)**을 활용하면, 큰 맵 로딩 시 발생하는 자원 부담을 분산할 수 있어 원활한 플레이 경험을 제공합니다.
  • LobbyGameMode에서 PostLogin 후 플레이어 수를 확인해, **서버에서 ServerTravel**을 호출하면 모든 클라이언트가 자연스럽게 다음 맵으로 이동합니다.
  • 이 과정을 통해 “로비 → 본 게임 맵” 연결 구조를 손쉽게 구현할 수 있으니, 프로토타이핑 단계에서 꼭 적용해보세요.

추가 팁:

  • 패키징 후 스팀 환경이나 LAN 환경에서 실제 여러 대의 컴퓨터로 테스트하는 과정을 꼭 거쳐보세요.
  • 접속 타이밍, 네트워크 불안정 상황 등을 점검하여 버그를 미리 잡는 것이 중요합니다.

以上!
이 글로 매끄러운 여행로비 시스템의 큰 흐름이 이해되길 바라며, 궁금한 점은 언제든 댓글이나 문의로 남겨주세요.
즐거운 언리얼 개발 되시길 바랍니다!

'UnraealEngine > Multiplayer Shooter' 카테고리의 다른 글

46.Variable Replication  (0) 2025.03.13
44~46  (0) 2025.03.13
42.Network Role  (0) 2025.03.12
25. Join Sessions from the Menu  (0) 2025.03.12
22. Callbacks to our Subsystem Functions  (0) 2025.03.12

+ Recent posts