아래 글은 언리얼 엔진에서 멀티플레이어 게임 맵 전환(로비 → 실제 게임 맵)을 매끄럽게 처리하는 과정을 정리한 내용입니다.
**매끄러운 여행(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) 클래스 생성
- C++ 클래스 생성
- GameModeBase / GameMode를 상속받는 로비 전용 클래스를 새로 만듭니다.
- 예) LobbyGameMode.h / .cpp
- PostLogin 함수 재정의
- PlayerCount가 특정 숫자(예: 2)에 도달하면 ServerTravel을 호출하여 모든 플레이어를 새로운 맵으로 이동시킵니다.
- **bUseSeamlessTravel = true**로 설정해 매끄러운 여행을 활성화합니다.
- // 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")); } } }
- 블루프린트 게임 모드
- 위에서 만든 LobbyGameMode를 블루프린트로 확장한 뒤, 로비 레벨에서 해당 블루프린트를 GameMode Override로 설정합니다.
- 로비 레벨: World Settings → GameMode Override → BP_LobbyGameMode
4. 본 게임 맵(BlasterMap) & 게임 모드 설정
4.1 새 맵 복사 & 설정
- 샘플 레벨(예: “LearningKitGamesShowcase”)을 복사하여,
- 이름: BlasterMap
- 폴더: Maps/BlasterMap
- 게임모드: 새 GameMode 블루프린트(BP_BlasterGameMode)를 만들어서 적용
- 레벨 디자인(장애물, 캐릭터 스폰 지점, 아이템 배치 등)을 자유롭게 구성
4.2 테스트하기
- 로비 맵에서 플레이어 1인(host)이 게임을 호스팅
- 다른 컴퓨터(플레이어 2)가 같은 세션에 Join
- **PostLogin**에서 PlayerCount == 2 확인
- ServerTravel("/Game/Maps/BlasterMap?listen") 호출
- 두 플레이어가 매끄럽게 BlasterMap으로 이동
5. 전환 레벨(Transition Map) 구체 설정
- 빈 레벨을 만들어 TransitionMap으로 저장
- Edit > Project Settings > Maps & Modes > Transition Map에서 해당 레벨 지정
- ServerTravel 시 내부적으로 TransitionMap을 거쳐 새 맵이 로드됨
- 플레이어 입장에선 끊김 없이 부드럽게 새 맵으로 전환
팁: 전환 맵에는 큰 지형이나 복잡한 오브젝트가 필요 없습니다. 최대한 간단하거나 로딩 UI만 두는 형태를 추천합니다.
6. 실전 팁 & 마무리
- 플레이어 수 동적 설정
- 현재 예시에서는 if (PlayerCount == 2)처럼 하드코딩했지만,
- 실제 프로젝트에서는 블루프린트 변수(예: MaxLobbyPlayers)를 두어 유연하게 조절합니다.
- 테스트 환경
- 멀티플레이어 테스트 시, 다른 PC 또는 가상머신 등 여러 사용자 환경에서 접속을 시도해야 합니다.
- -log 옵션으로 실행하거나, Server / Client 구분하여 여러 파이라이 제어하는 것도 방법입니다.
- 레벨 최적화
- 매끄러운 전환은 편리하지만, 맵 로딩 시간 자체를 단축하기 위해선 최적화(라이트맵, LOD, Assets 관리)가 중요합니다.
- 순간적으로 전환 맵에서 대기하는 동안에도 뒷단에서는 다음 맵 로딩에 필요한 리소스를 효율적으로 할당할 수 있습니다.
- 메뉴 맵 및 로비 맵 꾸미기
- 사용자가 초기 접속 시 첫인상을 좌우하는 맵(예: 메뉴 맵, 로비 맵)은 최소한의 오브젝트로 깔끔하게 구성해도 되고,
- “게임 세계관”을 표현하고 싶다면 씬 연출을 살짝 넣어 매력적으로 꾸미는 방법도 좋습니다.
결론
- **매끄러운 여행(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 |