Unreal Engine5/KDT 2024

[UE5 KDT2024] 12. GameMode

유잉유잉유잉 2025. 2. 24. 00:01
728x90

 

1. 게임모드

 

1) 함수

- 해당 함수들은 싱글이면 그냥 다 호출됨. 서버일때만 서버와 클라가 구분된다. 

- 게임모드는 서버 - 클라이언트 구조일땐 클라이언트에는 생기지 않는다. 서버에만 생긴다. 

ex) 스킬사용시 -> 클라는 서버에 알림 -> 서버가 스킬 사용 클라들에게 알려줌 -> 받은 클라들은 스킬 사용

 

▶️ InitGame()  : 게임이 시작할 때

virtual void InitGame( const FString& MapName, const FString& Options, FString& ErrorMessage );

  - 언리얼 엔진에서 게임 모드의 초기화를 담당하는 함수 

  - PreInitalizeComponent 전에 호출. 액터 관련 함수는 호출하지 않는것이 좋다.  

  - Prams : 맵이름, 옵션 문자열, 에러메세지

  • 옵션문자열 : 파싱해서 게임의 커스텀 설정을 적용
  • 에러메세지 : 게임 초기화 실패시 여기에 에러메세지 넣어서 반환

 

 

▶️  PreLogin() : 플레이어가 서버에 접속할 때 호출되는 함수 

virtual void PreLogin( const FString& Options, const FString& Address, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage );

- 게임모드는 서버에만 생기기 때문에 해당 함수는 Login함수 이전에 호출 

- Options : 플레이어가 전달하는 옵션. ex) 관전자

- Address : 주소 (IP)

- UniqueId : 유니크 ID( 플레이어별로 고유한 ID)

- ErrorMessage : 실패했을 때 반환할 에러메세지 

✨✨ 호출순서 PreLogin() -> Login() -> PostLogin()

 

▶️   Login()

virtual APlayerController* Login( UPlayer* NewPlayer, ENetRole InRemoteRole, const FString& Portal, const FString& Options, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage );

- 새로운 플레이어가 서버에 로그인 할 때 호출되는 함수 

- 플레이어를 위한 PlayerController를 생성하고 기본적인 플레이어 속성을 설정

- 인자

  •  NewPlayer : 새로 로그인하는 플레이어 객체
  •  InRemoteRole : 이 컨트롤러의 원격 역할 지정
  •  ENetRole : 네트워크상 권한 설정 
enum ENetRole : int
{
    // 네트워크 상에서 아무런 역할을 가지지 않음.
    /** No role at all. */  
    ROLE_None UMETA(DisplayName = "None"),

    // 원격 (다른 클라이언트, 서버) 에서 제어하는 객체의 복사본
    /** Locally simulated proxy of this actor. */
    ROLE_SimulatedProxy UMETA(DisplayName = "Simulated Proxy"),

    // 클라이언트에서 로컬로 제어. 클라이언트상에서 직접 조종하는 캐릭터임.
    /** Locally autonomous proxy of this actor. */
    ROLE_AutonomousProxy UMETA(DisplayName = "Autonomous Proxy"),

    // 서버가 소유권을 가지고 제어 권한을 가진 객체 
    /** Authoritative control over the actor. */
    ROLE_Authority UMETA(DisplayName = "Authority"),

    ROLE_MAX UMETA(Hidden),
};
  • Portal : 클라이언트가 지정한 포탈 위치 
  • Option : 클라이언트가 전달한 옵션
  • UniqueId : 고유한 플레이어 ID
    • 클라이언트가 서버에 접속중이면 바뀌지 않음. 
  • ErrorMessage : 로그인 실패시 출력 or 표시할 에러 메세지 

 

 

▶️   PostLogin() : 로그인 후 

virtual void PostLogin( APlayerController* NewPlayer );

- 플레이어가 서버에 성공적으로 로그인한 후 호출되는 함수 

- 해당함수는 Login 이후 호출됨

- 인자 NewPlayer : 새로 로그인한 플레이어 Controller

 

 

▶️    Logout()

virtual void Logout( AController* Exiting );

- 플레이어가 서버에서 로그아웃하거나 연결이 끊어질 때 호출

- 인자 ExitGame : 로그아웃 하는 플레이어의 객체를 나타내는 AController 



 

 

2. 게임모드 코드 적용 

 

GameModeMain.h

virtual void InitGame( const FString& MapName, const FString& Options, FString& ErrorMessage );
virtual void PreLogin( const FString& Options, const FString& Address, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage );
virtual APlayerController* Login( UPlayer* NewPlayer, ENetRole InRemoteRole, const FString& Portal, const FString& Options, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage );
virtual void PostLogin( APlayerController* NewPlayer );
virtual void Logout( AController* Exiting ); 

 

cpp

void AGameModeMain::InitGame( const FString& MapName, const FString& Options, FString& ErrorMessage )
{
    Super::InitGame( MapName, Options, ErrorMessage );
}

void AGameModeMain::PreLogin( const FString& Options, const FString& Address, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage )
{
     Super::PreLogin( Options, Address, UniqueId, ErrorMessage );
}

APlayerController* AGameModeMain::Login( UPlayer* NewPlayer, ENetRole InRemoteRole, const FString& Portal, const FString& Options, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage )
{
     APlayerController* reuslt 

          = Super::Login( NewPlayer, InRemoteRole, Portal, Options, UniqueId, ErrorMessage );

return reuslt;
}

void AGameModeMain::PostLogin( APlayerController* NewPlayer )
{
     Super::PostLogin( NewPlayer );
}

void AGameModeMain::Logout( AController* Exiting )
{
     Super::Logout( Exiting );
}



3. 게임모드에서 설정했던 클래스 cpp로 설정하기

 

1) GameSession 상속, GameMode 폴더, GameSessionMain으로 이름 지정해서 c++ 클래스 생성

 

(1) GameSession

- 언리얼의 게임세션은 게임이 진행되는 하나의 방 or 룸

- 서버에 생성된다.

 

(2) 코드작성

header

#include "EngineMinimal.h"
#include "GameFramework/GameSession.h"
#include "GameSessionMain.generated.h"

/**
*
*/
UCLASS()
class RESTART0501_API AGameSessionMain : public AGameSession
{
      GENERATED_BODY()

 public :
      AGameSessionMain();

      virtual void PostLogin( APlayerController* NewPlayer ) override;
      virtual void BeginPlay() override ;
};

 

cpp

AGameSessionMain::AGameSessionMain()
{}

void AGameSessionMain::PostLogin( APlayerController * NewPlayer )
{
      Super::PostLogin( NewPlayer );
}

void AGameSessionMain::BeginPlay()
{
      Super::BeginPlay();
}



 

(3) GameSession에서 볼 멤버변수, 함수 

int32 MaxPlayers; // 해당 세션에 참가할 수 있는 최대 플레이어 수. 기본값 16
virtual bool KickPlayer(APlayerController* KickedPlayer, const FText& KickReason); // 플레이어 내쫓기
virtual bool BanPlayer(APlayerController* BannedPlayer, const FText& BanReason); // 플레이어 벤

 

▶️ PostLogin()

virtual void PostLogin(APlayerController* NewPlayer);

 - GameMode의 PostLogin 함수가 호출된 후 실행되는 함수 

 - 게임세션과 관련된 추가 작업을 처리할 수 있는 기능을 제공

 - 인자 NewPlayer : 새로 로그인한 플레이어의 APlayerController 객체

 

728x90