언어:
페이지 정보
엔진 버전:
언리얼 엔진

멀티플레이어에서의 이동(Travel)

언리얼 엔진

매끄러운 / 매끄럽지 않은 이동

UE4 의 이동 방식은 크게 매끄러운 (Seamless) 방식과 매끄럽지 않은(non-seamless) 방식 둘로 나뉩니다. 주요 차이점은, 매끄러운 이동은 블록이 없는 작업인 반면, 매끄럽지 않은 이동은 블록이 있는 호출이라는 점입니다.

클라이언트가 매끄럽지 않은 이동 실행시, 클라이언트는 서버에서 접속을 끊은 다음 같은 서버에 다시 접속하여 새로 로드할 맵을 준비시킵니다.

UE4 멀티플레이어 게임은 가급적 매끄러운 이동을 사용할 것을 권합니다. 일반적으로 플레이어가 느끼기에 부드러울 뿐만 아니라, 재접속 프로세스 도중 발생할 수 있는 문제도 피할 수 있습니다.

매끄럽지 않은 이동이 일어날 수밖에 없는 상황은 셋 정도입니다:

  • 맵을 처음 로드할 때

  • 서버에 클라이언트로 처음 접속할 때

  • 멀티플레이어 게임을 끝내고 새 게임을 시작할 때

이동을 위해 쓰이는 함수는 크게 UEngine::Browse, UWorld::ServerTravel, APlayerController::ClientTravel 의 세 가지입니다. 어느 것을 사용해야 할지 결정하는 데 약간 헛갈릴 수 있으므로, 도움이 될만한 지침을 드리면 이렇습니다:

UEngine::Browse

  • 새 맵 로드시 하드 리셋같은 것입니다.

  • 항상 매끄럽지 않은 이동이 됩니다.

  • 목적 맵으로 이동하기 전 서버가 현재 클라이언트 접속을 끊습니다.

  • 클라이언트는 현재 서버에서 접속이 끊깁니다.

  • 데디케이티드 서버는 다른 서버로 이동할 수 없으므로, 맵은 반드시 로컬이어야 합니다 (URL 이 될 수 없습니다).

UWorld::ServerTravel

  • 서버 전용입니다.

  • 서버를 새 월드/레벨로 점프시킵니다.

  • 접속된 모든 클라이언트도 따라갑니다.

  • 멀티플레이어 게임에서 맵 사이 이동을 할 때 쓰는 방식으로, 서버에서 이 함수 호출을 담당합니다.

  • 서버는 접속된 모든 클라이언트 플레이어에 대해 APlayerController::ClientTravel 을 호출합니다.

APlayerController::ClientTravel

  • 클라이언트에서 호출되면, 새 서버로 이동합니다.

  • 서버에서 호출되면, 특정 클라이언트더러 새 맵으로 이동하라 이릅니다 (현재 서버에 접속은 유지시킵니다).

매끄러운 이동 활성화

매끄러운 이동을 활성화시키려면, 트랜지션 맵을 구성해야 합니다. 이는 UGameMapsSettings::TransitionMap 프로퍼티를 통해 이루어집니다. 기본적으로 이 프로퍼티는 비어있는데, 게임에서 이 프로퍼티가 비어있으면 트랜지션 맵에 공백 맵이 생성됩니다.

트랜지션 맵의 존재 이유는, 항상 (맵이 저장된) 월드가 로드되어 있으므로, 새 맵을 로드하기 전에 이전 맵을 해제시킬 수 없기 때문입니다. 맵이 매우 클 수가 있기 때문에, 이전 맵과 새 맵을 동시에 메모리에 두는 것은 좋지 않으니, 트랜지션 맵이 생긴 것입니다.

이제 현재 맵에서 트랜지션 맵으로 이동한 다음, 거기서 최종 맵으로 이동하면 됩니다. 트랜지션 맵은 매우 작으므로, 현재 맵을 최종 맵으로 대체시키는 와중에 그다지 큰 부하가 걸리지 않습니다.

트랜지션 맵 구성이 완료된 후 AGameModeBase::bUseSeamlessTravel 을 true 설정하면, 매끄러운 이동이 작동할 것입니다!

매끄러운 이동 흐름

매끄러운 이동 실행시의 일반적인 흐름은 이렇습니다:

  1. 트랜지션 레벨에 지속되는 액터를 마킹합니다 (아래 자세히).

  2. 트랜지션 레벨로 이동합니다.

  3. 최종 레벨에 지속되는 액터를 마킹합니다 (아래 자세히).

  4. 최종 레벨로 이동합니다.

매끄러운 이동시 액터 지속시키기

매끄러운 이동 사용시 현재 레벨에서 새 레벨로 (지속) 액터를 가지고 가는 것이 가능합니다. 인벤토리 아이템, 플레이어와 같은 특정 액터에 좋습니다.

기본적으로 자동 지속되는 액터는 다음과 같습니다:

  • GameMode 액터 (서버만)

    • AGameModeBase::GetSeamlessTravelActorList 를 통해 추가된 액터

  • 유효한 PlayerState 가 있는 모든 Controller (서버만)

  • 모든 PlayerController (서버만)

  • 모든 로컬 PlayerController (서버 및 클라이언트)

    • 로컬 PlayerController 에서 호출된 APlayerController::GetSeamlessTravelActorList 를 통해 추가된 액터