[UE5 KDT2024] 12. GameMode
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 객체