Post

2026-06-30 TIL (87일차)

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)이라고 부르며, 언리얼 엔진의 기본 맵 이동 방식입니다. 심리스 트래블을 껐을 때 발생하는 일은 다음과 같습니다.

  • 작동 방식 (재접속 과정):
    1. 서버가 이동을 시작하면, 모든 클라이언트의 네트워크 연결을 강제로 끊어버립니다(Disconnect).
    2. 현재 월드를 파괴하고 메모리에서 비웁니다.
    3. 새로운 월드를 로드합니다.
    4. 클라이언트들이 처음부터 다시 서버에 접속(Reconnect)하여 로그인 과정을 처음부터 다시 밟아야 합니다.
  • 문제점:
    • 데이터 증발: GameInstance를 제외한 모든 데이터(PlayerState, PlayerController 등)가 완전히 파괴되고 새로 생성되므로, 이전 맵에서 모은 점수나 역할 정보가 다 날아갑니다.
    • 튕김(Timeout) 위험: 맵 용량이 커서 로딩이 오래 걸리면, 클라이언트가 서버에 재접속하는 대기 시간을 초과해버려서 로비로 튕기는(미아가 되는) 현상이 매우 빈번하게 발생합니다.

3. ServerTravel과 ?listen 옵션의 비밀

방장이 클라이언트들을 이끌고 다음 맵으로 이동할 때 사용하는 함수와 필수 옵션입니다.

1
2
// 방장이 맵을 이동하면서 클라이언트들을 다 끌고 가는 명령
World->ServerTravel(Path + TEXT("?listen"));

ServerTravel과 ?listen 옵션의 비밀

방장이 클라이언트들을 이끌고 다음 맵으로 이동할 때 사용하는 함수와 필수 옵션입니다.

왜 굳이 ?listen 꼬리표를 붙여야 할까?

언리얼 엔진에서 유저 중 한 명이 방장이 되어 플레이하는 방식일 때, 방장이 ServerTravel로 맵을 열면 엔진은 기본적으로 이렇게 착각합니다.

엔진의 착각: “방장 혼자 싱글 플레이하러 가는구나 연결된 애들 끊어!” 결과: 클라이언트들의 연결이 다 끊어지고 로비로 튕겨버립니다.

?listen의 마법 같은 효과

맵 경로 뒤에 ?listen 옵션을 붙여주면, 엔진에게 다음과 같이 강력하게 지시하는 효과가 있습니다.

엔진에게 내리는 지시: “나 방장 혼자 가는 거 아니야! 새 맵으로 넘어가서도 계속 서버 통신 포트 열어두고(listen), 내 뒤에 따라오는 클라이언트들 계속 접속 상태로 유지해!”

결론: ?listen 옵션은 멀티플레이어 환경의 맵 이동에서 클라이언트들이 미아(Disconnect)가 되지 않도록 방장과 함께 데려가는 강력한 안전장치입니다.

This post is licensed under CC BY 4.0 by the author.