2026-06-30 TIL (87일차)
[UE] 멀티플레이어 맵 이동(Travel)
멀티플레이 게임에서 플레이어들을 데리고 로비에서 스테이지로, 혹은 다음 스테이지로 맵을 이동할 때 반드시 알아야 하는 두 가지 핵심 개념을 소개합니다.
1. 심리스 트래블 (Seamless Travel)이란?
게임모드(GameMode)에서 아래와 같이 설정할 수 있는 맵 이동 방식입니다.
1
bUseSeamlessTravel = true;
1. 심리스 트래블 (Seamless Travel)의 의미와 장점
게임모드에서 bUseSeamlessTravel = true; 로 설정했을 때 작동하는 방식입니다.
- 의미: 말 그대로 ‘끊김 없는(매끄러운)’ 맵 이동을 의미합니다.
- 장점 1. 네트워크 연결 유지: 맵을 넘어갈 때 서버와 클라이언트의 네트워크 연결(Connection)을 끊지 않고 그대로 유지합니다. 덕분에 로딩 중 튕김 현상(Timeout)을 획기적으로 줄여줍니다.
- 장점 2. 데이터 보존:
GameMode,PlayerController,PlayerState등의 특정 데이터를 새 맵으로 안전하게 들고 넘어갈 수 있습니다.
2. 만약 bUseSeamlessTravel = false; 라면 어떻게 될까?
이를 하드 트래블(Hard Travel)이라고 부르며, 언리얼 엔진의 기본 맵 이동 방식입니다. 심리스 트래블을 껐을 때 발생하는 일은 다음과 같습니다.
- 작동 방식 (재접속 과정):
- 서버가 이동을 시작하면, 모든 클라이언트의 네트워크 연결을 강제로 끊어버립니다(Disconnect).
- 현재 월드를 파괴하고 메모리에서 비웁니다.
- 새로운 월드를 로드합니다.
- 클라이언트들이 처음부터 다시 서버에 접속(Reconnect)하여 로그인 과정을 처음부터 다시 밟아야 합니다.
- 문제점:
- 데이터 증발:
GameInstance를 제외한 모든 데이터(PlayerState,PlayerController등)가 완전히 파괴되고 새로 생성되므로, 이전 맵에서 모은 점수나 역할 정보가 다 날아갑니다. - 튕김(Timeout) 위험: 맵 용량이 커서 로딩이 오래 걸리면, 클라이언트가 서버에 재접속하는 대기 시간을 초과해버려서 로비로 튕기는(미아가 되는) 현상이 매우 빈번하게 발생합니다.
- 데이터 증발:
3. ServerTravel과 ?listen 옵션의 비밀
방장이 클라이언트들을 이끌고 다음 맵으로 이동할 때 사용하는 함수와 필수 옵션입니다.
1
2
// 방장이 맵을 이동하면서 클라이언트들을 다 끌고 가는 명령
World->ServerTravel(Path + TEXT("?listen"));
ServerTravel과 ?listen 옵션의 비밀
방장이 클라이언트들을 이끌고 다음 맵으로 이동할 때 사용하는 함수와 필수 옵션입니다.
왜 굳이 ?listen 꼬리표를 붙여야 할까?
언리얼 엔진에서 유저 중 한 명이 방장이 되어 플레이하는 방식일 때, 방장이 ServerTravel로 맵을 열면 엔진은 기본적으로 이렇게 착각합니다.
엔진의 착각: “방장 혼자 싱글 플레이하러 가는구나 연결된 애들 끊어!” 결과: 클라이언트들의 연결이 다 끊어지고 로비로 튕겨버립니다.
?listen의 마법 같은 효과
맵 경로 뒤에 ?listen 옵션을 붙여주면, 엔진에게 다음과 같이 강력하게 지시하는 효과가 있습니다.
엔진에게 내리는 지시: “나 방장 혼자 가는 거 아니야! 새 맵으로 넘어가서도 계속 서버 통신 포트 열어두고(listen), 내 뒤에 따라오는 클라이언트들 계속 접속 상태로 유지해!”
결론: ?listen 옵션은 멀티플레이어 환경의 맵 이동에서 클라이언트들이 미아(Disconnect)가 되지 않도록 방장과 함께 데려가는 강력한 안전장치입니다.