[ UE ] 콘솔 명령을 통한 게임 Host & Join

LeeTaes·2024년 3월 16일

UE-MultiPlayer

목록 보기
5/5
  • 콘솔에서 실행 가능한 명령어를 만들기
  • 콘솔 명령을 통해 맵 이동, 서버 호스팅, 서버 참여하기

콘솔에서 실행 가능한 명령어 만들기

  • 콘솔 명령을 사용하려면 특정 키를 눌러 콘솔을 열어야 합니다.
  • 언리얼에서는 기본적으로는 틸트(~) 키를 사용합니다.
  • 언리얼의 콘솔 명령어 시스템에서 사용할 수 있는 함수를 만들기 위해 매크로에 Exec를 추가해야 합니다.
  • UFUNCTION(Exec)
    → 해당 매크로를 사용하여 만들어진 함수는 콘솔에서 실행 가능합니다.
  • 게임 인스턴스에 함수를 생성합니다.
// .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"));
}

Exec Compatible Classes

  • Exec 호환 클래스의 종류는 다음과 같습니다.
    - PlayerControllers
    - PossessedPawns
    - HUDs
    - Cheat Managers
    - Game Modes
    - Game Instances

콘솔 명령을 통해 맵 이동하기 (ServerTravel)

  • ServerTravel
    → 서버에서 맵 간 이동을 수행하는 데 사용
    → 멀티플레이어 게임에서 특히 유용
    → 서버에서 맵을 이동할 때 사용되며, 클라이언트도 자동으로 이동됩니다.
bool UWorld::ServerTravel(const FString& URL, bool bAbsolute, bool bShouldSkipGameNotify);
  • 위 함수를 사용해 모든 플레이어를 다른 맵으로 옮길 수 있습니다.
    → Lobby 에서 ThirdPersonMap으로 이동 (기본 Lobby 시작)
// .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");
}

콘솔 명령을 통해 서버 호스팅하기 (ServerTravel)

  • 서버의 호스팅은 간단히 위 ServerTravel() 코드 내에 ?listen 키워드를 붙여주면 됩니다.
// .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");
  • 제대로 수행되었는지 확인해보도록 하겠습니다.
  1. 독립형 게임 실행하기 (cmd)
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

  1. 호스트 명령어 입력 후 인게임 확인하기
  1. 다른 클라이언트 실행해보기

만약 뒤에 "?listen"을 붙이지 않고 실행해보면?
- 에러가 발생하며 게임이 실행되지 않습니다.


콘솔 명령을 통해 서버에 참여(Join)하기

  • 기존까지의 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);
}

결과 확인

  1. 2개의 개별 클라이언트 실행(cmd)

  2. 한 쪽에서 Host 명령어 입력

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


참고

언리얼 Travel
Udemy 멀티플레이어 강의

profile
클라이언트 프로그래머 지망생

0개의 댓글