- 콘솔에서 실행 가능한 명령어를 만들기
- 콘솔 명령을 통해 맵 이동, 서버 호스팅, 서버 참여하기
// .h
public:
// 콘솔에서 사용하기 위한 함수 선언
UFUNCTION(Exec)
void Host();
// .cpp
void UPuzzlePlatformsGameInstance::Host()
{
// AddOnScreenDebugMessage() 함수를 사용해 화면에 로그 띄우기
UEngine* Engine = GetEngine();
if (!Engine) return;
// 게임 화면에 로그를 출력합니다.
Engine->AddOnScreenDebugMessage(0, 1.5f, FColor::Green, TEXT("Hosting"));
}

bool UWorld::ServerTravel(const FString& URL, bool bAbsolute, bool bShouldSkipGameNotify);
// .cpp
void UPuzzlePlatformsGameInstance::Host()
{
// AddOnScreenDebugMessage() 함수를 사용해 화면에 로그 띄우기
UEngine* Engine = GetEngine();
if (!Engine) return;
Engine->AddOnScreenDebugMessage(0, 1.5f, FColor::Green, TEXT("Hosting"));
UWorld* World = GetWorld();
if (!World) return;
// 맵 이동 (서버 & 클라이언트)
World->ServerTravel("/Game/ThirdPerson/Maps/ThirdPersonMap");
}
// .cpp
void UPuzzlePlatformsGameInstance::Host()
{
// AddOnScreenDebugMessage() 함수를 사용해 화면에 로그 띄우기
UEngine* Engine = GetEngine();
if (!Engine) return;
Engine->AddOnScreenDebugMessage(0, 1.5f, FColor::Green, TEXT("Hosting"));
UWorld* World = GetWorld();
if (!World) return;
World->ServerTravel("/Game/ThirdPerson/Maps/ThirdPersonMap?listen");
C:\Program Files\Epic Games\UE_5.3\Engine\Binaries\Win64\UnrealEditor.exe" "E:\UE_Multiplayer\UE_Multi_PuzzlePlatforms\PuzzlePlatforms.uproject" /Game/ThirdPerson/Maps/Lobby -game -log



만약 뒤에 "?listen"을 붙이지 않고 실행해보면?
- 에러가 발생하며 게임이 실행되지 않습니다.
기존까지의 ServerTravel은 다음 그림과 같이 모두를 전송시켰습니다.

플레이어 컨트롤러의 ClientTravel을 사용해 클라이언트만 이동시켜 보도록 하겠습니다.

ClientTravel
- 클라이언트에서 맵 간 이동을 수행하는 데 사용됩니다.
- 일반적으로 서버에서 이동 요청을 받았을 때 호출됩니다.
void UWorld::ClientTravel(APlayerController* PC, const FString& URL, ETravelType TravelType, bool bSeamless, FGuid MapPackageGuid);
- 이동이 시작되면 클라이언트 측에서 해당 맵으로 로드되고, 플레이어는 새로운 맵에서 게임을 계속 진행할 수 있습니다.
플레이어는 자신의 로컬 로비에 존재하다가 해당 로비에서 서버에 연결하도록 실제 IP 주소로 CilentTravel을 사용 가능합니다.
이를 통해 인터넷으로 연결하여 맵을 로드하고, 플레이어가 월드에 배치되도록 할 수 있습니다.
서버에 참여(Join)하기 위한 코드를 생성해주도록 하겠습니다.
→ 콘솔 명령어 입력으로부터 서버의 IP주소를 받아와 해당 주소로 참가.
// .cpp
void UPuzzlePlatformsGameInstance::Join(const FString& Address)
{
// AddOnScreenDebugMessage() 함수를 사용해 화면에 로그 띄우기
UEngine* Engine = GetEngine();
if (!Engine) return;
Engine->AddOnScreenDebugMessage(0, 1.5f, FColor::Green, FString::Printf(TEXT("Joining %s"), *Address));
// 플레이어 컨트롤러 받아오기
APlayerController* PlayerController = GetFirstLocalPlayerController();
if (!PlayerController) return;
PlayerController->ClientTravel(Address, ETravelType::TRAVEL_Absolute);
}
2개의 개별 클라이언트 실행(cmd)

한 쪽에서 Host 명령어 입력

다른 한 쪽에서 Join + IP주소 입력
