UE5/UE5 MultiPlayerGame

MultiPlayerGame) 14. 플레이어 추적을 위한 게임모드/게임스테이트

PJNull 2022. 6. 14.
728x90
반응형

GameMode/GameState

 

 

GameMode

 

 

GameMode는 게임의 모든 룰을 유지하기 위해 존재한다. 플레이어가 레벨을 이동하는것과 스폰하는 위치와 같은 것을 관리하는것과 같은 것들이 포함되어 있다. PostLogin을 이용하여 게임에 참여하며 Logout을 이용하여 떠날수도 있다. GameMode는 GameState에 액세스 할수 있으므로 플레이어 스테이트 배열을 가져와서 볼수 있다. 이러한 기능을 수행하는것이 GameMode이다.

 

 

 

 

GameState

 

 

GameState는 게엠에 대한 상태 정보를 보유하도록 설계되었다. 클라이언트는 게임스테이트에 액세스하여 플레이어 정보를 얻을수 있다. 이 클래스는 점수나 승리 횟수 같은 특정 플레이어에 대한 정보가 아닌 게임 상태 정보를 저장하기 위해 설계된 클래스이다.GameState는 PlayerState의 배열을 포함하며 PlayerState클래스는 점수 카운트와 같은 플레이어 특정 정보를 보유하도록 설계되어 있다.

 

 

 

1.게임모드 생성

 

 

 

 

 

2.플레이어 추적

 

 

 

APlayerState

A PlayerState is created for every player on a server (or in a standalone game).

docs.unrealengine.com

 

 

 

//LobbyGameMode.h

public:
	virtual void PostLogin(APlayerController* NewPlayer) override;
	virtual void Logout(AController* Exiting) override;

 

 

//LobbyGameMode.cpp

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

	if (GameState)
	{
		int32 NumberOfPlayers= GameState->PlayerArray.Num();
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage
			(	
				1,
				60.f,
				FColor::Yellow,
				FString::Printf(TEXT("Players in Game:%d "),NumberOfPlayers)

			);
		}
		APlayerState* PlayerState=NewPlayer->GetPlayerState<APlayerState>();
		if (PlayerState)
		{
			FString Playername=PlayerState->GetPlayerName();
			
			GEngine->AddOnScreenDebugMessage
			(
				-1,
				60.f,
				FColor::Cyan,
				FString::Printf(TEXT("%s has Joined Game! "), *Playername)

			);

		}

	}
}

void ALobbyGameMode::Logout(AController* Exiting)
{
	Super::Logout(Exiting);

	APlayerState* PlayerState = Exiting->GetPlayerState<APlayerState>();
	if (PlayerState)
	{
		int32 NumberOfPlayers = GameState->PlayerArray.Num();

		GEngine->AddOnScreenDebugMessage
		(
			1,
			60.f,
			FColor::Yellow,
			FString::Printf(TEXT("Players in Game:%d "), NumberOfPlayers-1)

		);

		FString Playername = PlayerState->GetPlayerName();

		GEngine->AddOnScreenDebugMessage
		(
			-1,
			60.f,
			FColor::Cyan,
			FString::Printf(TEXT("%s has Exited Game! "), *Playername)

		);

	}
}

 

//MultiplayerSessionSubsystem.cpp
void UMultiplayerSessionSubsystem::CreateSession(int32 NumPublicConnections, FString MatchType)
{
	LastSessionsettings->BuildUniqueId = 1;
    //검색 중에 서로 다른 빌드가 보이지 않도록 하는 데 사용됨
}

 

 

코드수정을 완료했으면 Config->DefaultGame.ini에서 아래의 내용을 추가해준다.

DefaultGame.ini에 추가

//DeafaultGame.ini
[/Script/Engine.GameSession]
MaxPlayers=100

위의 내용은 특정세션에 대한 연결수를 지정하는 NumPublicConnections와는 달리 게임 프로젝트의 최대 플레이어수를 설정해 준것이다.

 

 

 

 

3.GameMode적용

 

먼저 GameMode를 상속받은 블루프린트클래스를 생성해준다.

 

 

그후 플레이어 캐릭터를 지정해주고,

 

해당 레벨에 게임모드를 오버라이드한다.

728x90
반응형

댓글