UE5

Unreal Engine - 멀티플레이어 게임에서의 이동

게임 개발 2024. 5. 4. 16:52

 

 

 

언리얼 내에서의 Travelling은 크게 두 가지가 있다.

1. Seamless 

2. non-seamless travel

 

둘의 가장 큰 차이점은 Seamless는 non-blocking(비차단) 작업,

non-seamless는 blocking call(차단 호출)이라는 차이가 있다.

 

이는 즉 클라이언트가 non-seamless travel를 실행할 때,

클라이언트는 서버로부터의 연결을 잠시 끊은 뒤 동일 서버에 재연결한다.

해당 작업이 완료된다면 클라이언트는 새로운 맵을 로드할 준비를 갖추는 것이다.

 

언리얼에서 추전하는 것은

UE4 멀티플레이어 게임은 가능하다면 seamless travel을 권장하고 있다.

이러한 방식이 일반적으로 

재연결 과정에서 발생할 수 있는 문제를 방지하며 좀 더 원할하게 진행 될 것이라는 견해를 보이고있다.

 

 

1. Seamless 

Seamless 를 직역하자면 매끄러운 이라는 단어이다.

이를 풀어 말하자면  Continuous without pause or break 라는 뜻으로,

일시 중지 또는 중단 없는 연속성이라는 의미가 된다.

말 그대로 차단없이 계속 진행되는 작업이라는 의미가 된다.

 

 

2. non-seamless 

non-seamless travel이 반드시 발생해야 하는 3가지 조건이 있다.

 

  • 처음 맵을 로드할 때
  • 클라이언트가 처음 서버에 연결하는 경우
  • 멀티플레어 게임을 종료하고, 새 게임을 시작하려 할 때

 

Drive Travelling의 3가지 주요 기능은 다음과 같다.

 

UEngine::Browse

UWorld::ServerTravel,

APlayerController::ClientTravel

 

막상 이렇게 있으면 좀 헷갈릴 수 있으니 추가적으로 해당 기능을 설명하고자 한다.

 

 

UEngine::Browes

 

  • hard reset과 같이 새로운 맵을 로딩하는 것
    (hard reset은 일반적으로 시스템이나 장치를 완전히 초기화하거나 리셋하는 것을 의미한다.
    이는 모든 상태나 데이터를 삭제하고 시스템을 초기 상태로 되돌리는 것을 의미한다.
    여기서 말하는 "무거운 리셋"은 부팅된 새로운 맵을 로딩할 때
    시스템이나 게임 엔진의 상태를 완전히 초기화하는 것을 의미하는 것 같다.)

  • 언제나 non-seamless travel 결과를 반환한다.
  • 서버가 대상 맵으로 이동하기 전에 현재 클라이언트의 연결을 끊는다.
  • 클라이언트는 현재 서버와의 연결을 끊는다.
  • Dedicated 서버는 다른 서버로 이동할 수 없으므로 맵은 local(URL이 될 수 없음)이어야한다.
    ( 여기서 "local"은 서버에 저장된 맵 파일을 가리킨다.
    즉, 맵 파일이 서버의 로컬 디렉터리에 저장되어 있어야한다.
    "local"이 URL이 아닌 것을 의미하는 것이다.
    따라서 서버가 다른 서버로 이동할 수 없고,
    맵은 로컬 디렉터리에 저장되어 있어야 한다.)

 

UWorld::ServerTravel

 

  • 서버 전용이다.
    ( "오직 서버를 위해서만"이란 말은 서버 측에서만 해당 동작이 수행된다는 것을 의미한다.
    즉, 클라이언트 측에서는 해당 동작을 수행할 수 없는 것을 말한다.
    여기서는
    UWorld::ServerTravel 함수가 서버에서만 호출될 수 있다는 것을 의미하는 것 같다.
    클라이언트 측에서는 ServerTravel 을 시작할 수 없고,
    서버에서만 해당 기능을 실행할 수 있다는 것이다.)
  • 서버를 새로운 world/level로 점프한다.
  • 연결된 모든 클라이언트가 따르게 된다.
  • 멀티플레이어 게임이 맵에서 맵으로 이동하는 방식으로,
    이 기능을 호출하는 것은 서버가 담당한다.
  • 서버가 연결된 모든 클라이언트 플레이어의 APlayerController::ClientTravel을 호출한다.

 

 

APlayerController::ClientTravel

 

  • 클라이언트에서 호줄되면 새 서버로 이동한다.
  • 서버에서 호출이 되면, 특정 클라이언트에게 새로운 맵으로 이동하도록 지시한다.
    (단, 현재 서버에 연결된 상태를 유지하면서)

 

Enabling Seamless Travel( = Seamless Travel 기능 활성화)

 

원활한 Seamless Travel 기능 활성화를 위해서는 전환될 맵을 설정해야 한다.

이러한 것들은 UGameMapsSettings::TransitionMap 통해 구성된다. 

기본적으로 이 속성(property)는 비어있으며,

이 속성을 비워두면 전환 맵은 빈 맵이 생성이 된다.

 

전환 맵이 존재하는 이유는(맵을 유지하는 이유는) 항상 월드가 로드되어 있어야 하기 때문이다,

이러한 이유는 새 맵을 로드하기 전에 이전 맵을 해제할 수 없기 때문이다.

맵이 아주 클수 있기 때문에, 이전 맵과 새로운 맵을 동시에 메모리에 두는 것은 좋지 않을 것이다.

때문에 전환 맵은 동시에 메모리에 두지 않기 위해 존재한다.

 

이제 현재 지도에서 전환 지도로 이동한 다음 최종 지도로 이동하고,

거기서 최종 지도로 이동할 수 있다.

전환 맵은 매우 작기 때문에

현재 및 최종 맵과 중복되는 동안 추가로 오버헤드를 크게 잡아먹지 않는다.

 

전환 맵 설정이 완료되면, AGameModeBase::bUseSeamlessTravel을 true로 설정하고,

거기서부터 Enabling Seamless Travel을 실행한다.

 

Seamless Travel Flow (Seamless Travel의 흐름)

 

원할한 이동 수행할 때 일반적인 흐름은 다음과 같다.

 

  1. 전환 수준까지 지속될 행위자 표시
    (멀티플레이어 게임에서 맵 간 이동이 발생할 때
    특정 액터(캐릭터, 아이템, 물체 등)들을 이동하는 맵에서 새로운 맵으로 옮겨도
    유지되도록 표시)
  2. 전환 레벨로 이동
  3. 최종 레벨까지 지속될 Actor 표시
  4. 최종 레벨로 이동

 

Persisting Actors across Seamless Travel (지속적인 액터)

 

Seamless travel의 기능 활성화를 이용할 때 actor를 현재 레벨에서 새로운 레벨로의 이월(지속)할 수 있다.

이는 인벤토리 항목, 플레이어 등과 같은 특정 행위자에게 유용하다.

 

기본적으로 이러한 액터는 자동으로 유지된다.

 

  • 해당 GameMode actor(서버만)
    - 다음을 통해 추가된 모든 액터 AGameModeBase::GetSeamlessTravelActorList
  • 유효한 모든 컨트롤러 플레이어 상태 (서버만 해당)
  • 모든 PlayerControllers (서버만 해당)
  • 모든 local PlayerControllers (서버와 클라이언트)
    - 다음을 통해 추가된 모든 액터 
    APlayerController::GetSeamlessTravelActorList 로 호출된 local  PlayerControllers
    ( "local PlayerControllers"는 서버와 클라이언트 모두에서 관리되는 플레이어 컨트롤러를 의미한다.)

 

 

 

참고 문서

https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Networking/Travelling/

'UE5' 카테고리의 다른 글

ESPMode  (0) 2024.05.10
언리얼 모듈과 언리얼 게임플레이 모듈  (0) 2024.05.09
0309 작업 현황  (0) 2024.03.09
작업 현황 0307  (0) 2024.03.07
작업 - 0303  (0) 2024.03.04