Seamless Travel

정재훈·2023년 10월 7일
0

Unreal Multiplay

목록 보기
4/7

unreal에서 멀티플래이 맵 이동방식은 non-seamless travel과 seamless travel 두가지가 있다.
unreal에서는 아래와 같은 특징 때문에 seamless travel 방식을 권장하고 있다.

각 이동방식의 특징

Non-Seamless Travel

  • 클라이언트는 서버에서 연결이 끊겼다가 다시 똑같은 서버에 접속하여 새로 로드할 맵을 준비시킨다.
  • non-seamless travel을 사용할수 밖에 없는 경우
  1. 맵을 처음 로드할때
  2. 서버에서 클라이언트로 처음 접속할때
  3. 게임이 끝나고 새로운 게임을 시작할때

Seamless Travel

  • 일반적으로 플레이어 입장에서 부드럽게 느껴진다.
  • 재접속 프로세스 도중 발생할수 있는 문제를 피할수 있다.
  • 항상 로드된 맵이 존재해야하기때문에 이동해야하는 맵과 현재있는 맵 사이에 transition map을 사용한다.

transition map
현재있는 맵이 메모리에 올라가 있는 상태에서 이동할 새로운 맵을 로드하려면 메모리를 너무 많이 사용하게 된다.
따라서 먼저 비어있는 맵에 이동을 시킨뒤 메모리에 올라가있던 맵을 해제하고 이동할 새로운 맵을 로드한다.
이때 사용되는 비어있는 맵이 transition map 이다.

travel 함수(doc)

UWorld::ServerTravel

  • 서버 전용
  • 서버를 새 월드/레벨로 점프
  • 접속된 모든 클라이언트도 서버를 따라간다.
  • 서버는 접속된 모든 클라이언트 플레이어에 대해
    APlayerController::ClientTravel 호출한다.

APlayerController::ClientTravel

  • 클라이언트에서 호출되면 새 서버로 이동
  • 서버에서 호출되면 특정 클라이언트에게 새맵으로 이동하라 시킴(현재 서버에 접속은 유지)

예제

LobbyGameMode.cpp

void ALobbyGameMode::PostLogin(APlayerController* NewPlayer)
{
	Super::PostLogin(NewPlayer);

	int32 NumberOfPlayers = GameState.Get()->PlayerArray.Num();
	if (NumberOfPlayers == 2)
	{
		UWorld* World = GetWorld();
		if (World)
		{
			bUseSeamlessTravel = true;
			World->ServerTravel(FString("/Game/Maps/BlasterMap?listen"));
		}
	}
}

로비 level에 참여한 player가 2명 이상이되면
ServerTravel을 통해 게임 level로 이동하는 함수입니다.

profile
게임 개발 공부중!

0개의 댓글