본문 바로가기
Unreal Engine5/KDT 2024

[UE5 KDT2024] 13. 월드셋팅

by 유잉유잉유잉 2025. 2. 25.
728x90

 

 

▶️ PlayerState

- 언리얼에서 플레이어 각자의 정보를 저장하고 관리하는 클래스

- 해당 클래스는 서버에도 존재하고 각각 클라이언트에도 존재.

- 서버의 PlayerState를 통해 각 클라이언트와 동기화함.

 

- 멤버변수 

  • int32 PlayerId : 플레이어 고유 id. 게임내에서 구분 (클라내인가?)
  • FUniqueNetIdRepl UniqueId : 플레이어 유니크 아이디 (구조체형). guid? 네트워크에서 구분.

 

- 함수 

- PlayerId, UniqueId 두개가 서버에서 지정(변경)할 경우, 아래 두개의 함수가 호출됨. 

1) OnRep_PlayerId() 

virtual void OnRep_PlayerId() override;
  • PlayerId가 서버에서 변경될 경우 클라이언트에서 해당 함수 호출됨. 
  • 서버에 있는 PlayerState는 호출 안됨
  • PlayerID는 런타임에 바뀔 가능성이 조오오오오금 있다고 함

 

2) OnRep_UniqueId()

virtual void OnRep_UniqueId() override;
  • UniqueId 서버에서 변경될 경우 클라이언트에서 해당 함수 호출됨. 
  • 서버에 있는 PlayerState는 호출 안됨
  • 유니크 아이디는 사실 런타임에 바뀔 가능성이 없다고함




 

 

1. PlayerState 만들기

 

1) PlayerState 상속, GameMode폴더, PlayerStateMain 클래스 추가 및 구현

header

#include "EngineMinimal.h"
#include "GameFramework/PlayerState.h"
#include "PlayerStateMain.generated.h"

/**
*
*/
UCLASS()
class RESTART0501_API APlayerStateMain : public APlayerState
{
   GENERATED_BODY()

public :
	APlayerStateMain();

	virtual void BeginPlay() override ;
    virtual void OnRep_PlayerId() override;
    virtual void OnRep_UniqueId() override;
};

 

cpp

APlayerStateMain::APlayerStateMain()
{}

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

void APlayerStateMain::OnRep_PlayerId()
{
	Super::OnRep_PlayerId();
}

void APlayerStateMain::OnRep_UniqueId()
{
	Super::OnRep_UniqueId();
}



▶️ PlayerController

- 언리얼에서 플레이어를 조종하기 위한 객체

- 서버가 있을 경우, 서버와 클라이언트 모두 생긴다. 



 


 

 

2. 플레이어 컨트롤러를 생성해보자

 

1) PlayerController 상속, Controller 폴더, PlayerConrollerMain 클래스 생성

 

header

#include "EngineMinimal.h"
#include "GameFramework/PlayerController.h"
#include "PlayerControllerMain.generated.h"

/**
 * 
 */
UCLASS()
class RESTART0501_API APlayerControllerMain : public APlayerController
{
	GENERATED_BODY()
	
public : 
	APlayerControllerMain();

	virtual void BeginPlay() override ;
};

cpp

APlayerControllerMain::APlayerControllerMain()
{}

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

 

 


 

 

 

3. GameStateBase상속, GameMode폴더안에 GameStateMain 클래스 생성

헤더

#include "EngineMinimal.h"
#include "GameFramework/GameStateBase.h"
#include "GameStateMain.generated.h"

/**
 * 
 */
UCLASS()
class RESTART0501_API AGameStateMain : public AGameStateBase
{
	GENERATED_BODY()
	
public : 
	AGameStateMain();

	virtual void BeginPlay() override;
};

 

 

cpp

AGameStateMain::AGameStateMain()
{}

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

 

 


 

 

 

4. 지금까지 만든 월드세팅 관련 객체 블루프린트로 생성 및 게임 모드에 설정 

 

1) 블프/GameMode폴더에 블루프린트 클래스 생성

 (1) PlayerControllerMain 상속받은 BP_PlayerControllerMain

 (2) PlayerStateMain 상속받은 BP_PlayerStateMain

 (3) GameStateMain 상속받은 BP_GameStateMain

 

2) BP_GameModeMain에 설정해주기 



 


 

5. 정리

 

지금까지 언리얼 월드셋팅 관련 클래스를 코드로 생성

- 서버에만 고유하게 생기는건 GameMode

 

월드셋팅은 싱글플레이면 큰 의미를 가지진 않는다. 



 


 

▶️ 코드 파일 지우는 방법

방법 1) 언리얼 에디터, 비주얼스튜디오  끄고

해당 코드파일 지우기 -> 형상관리에 올라가는 파일들 제외하고 지우기 -> 다시 솔루션 파일 만들기 -> 다시 에디터 실행 

<- 이미지는 지울애들 

 

방법 2) 에디터 종료 -> 솔루션에서 파일 제거 -> 탐색기에서 파일 제거 -> 솔루션 - 다시빌드 -> 완료되면 에디터 실행  




 

▶️CoreMinimal보다 EnginMinimal.h 에 기능이 더 많이 들어있음

EnginMinimal.h에는 헤더가 들어있음

 

728x90

댓글