[Unreal] 17.UI, GameState

본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다

캐릭터 선택 위젯

UserWidget

위젯 사용을 위한 부모 클래스. 위젯 생성을 위해 상속받아 사용한다

SelectInfoWidget.cpp

위젯 블루프린트

사용자 확장을 위한 위젯 블루프린트

  • 생성 방법 : [유저 인터페이스] - [위젯 블루프린트]
  • UI_SelectInfo 생성

UI_SelectInfo

  • 캔버스 패널 아래 팔레트 안에있는 위젯들을 추가하여 커스터마이즈
  • [팔레트]-[사용자 생성]에서 만들어 둔 위젯을 동적으로 출력 가능
    • 비저빌리티값을 이용하여 표기 유무를 변경할 수 있다
    • 카메라 워킹이 끝난 이후에 UI창 켜기 등의 테크닉 활용 가능

GameInfo.h

실제 플레이어 데이터를 UI_SelectInfo에 삽입하여 보여주기 위해 플레이어 데이터 테이블을 생성하고, 직업별 값을 저장해둔다

USTRUCT(BlueprintType)
struct FPlayerData : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	EPlayerJob	Job;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float	Attack;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float	Defense;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float	HP;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float	MP;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float	MoveSpeed;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float	AttackDistance;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float	AttackSpeed;
};

데이터 테이블_캐릭터 선택

  • SelectGameMode에서 DT 값 가짐

SelectInfoWidget.cpp

void USelectInfoWidget::NativeOnInitialized()
{
	Super::NativeOnInitialized();
  mNameText = Cast<UTextBlock>(GetWidgetFromName(TEXT("NameText")));
	mJobText = Cast<UTextBlock>(GetWidgetFromName(TEXT("JobText")));
	mAttackText = Cast<UTextBlock>(GetWidgetFromName(TEXT("AttackText")));
	mDefenseText = Cast<UTextBlock>(GetWidgetFromName(TEXT("DefenseText")));
	mHPText = Cast<UTextBlock>(GetWidgetFromName(TEXT("HPText")));
	mMPText = Cast<UTextBlock>(GetWidgetFromName(TEXT("MPText")));
	mLevelText = Cast<UTextBlock>(GetWidgetFromName(TEXT("LevelText")));
}

void USelectInfoWidget::SetPlayerInfo(const FPlayerData& Data)
{
	FString	JobName;

	switch (Data.Job)
	{
	case EPlayerJob::Knight:
		JobName = TEXT("Knight");
		break;
	case EPlayerJob::Gunner:
		JobName = TEXT("Gunner");
		break;
	case EPlayerJob::Rogue:
		JobName = TEXT("Rogue");
		break;
	}

	int32	JobIndex = (int32)Data.Job - 1;
	
	mNameText->SetText(FText::FromString(JobName));
	mJobText->SetText(FText::FromString(JobName));

	mAttackText->SetText(FText::FromString(FString::Printf(TEXT("%.2f"), Data.Attack)));
	mDefenseText->SetText(FText::FromString(FString::Printf(TEXT("%.2f"), Data.Defense)));
	mHPText->SetText(FText::FromString(FString::Printf(TEXT("%.2f"), Data.HP)));
	mMPText->SetText(FText::FromString(FString::Printf(TEXT("%.2f"), Data.MP)));
}

렌더 타깃

카메라로 찍고있는 화면을 실시간으로 텍스처로 만들어 주는 기능

  • 캡쳐 컴포넌트 : 장면을 캡쳐해서 텍스처로 만들어 주는 컴포넌트
  • 각 렌더 타깃을 생성하고 액터만 표시하게끔 하여 텍스처 생성 가능
  • 머티리얼을 생성하여 깊이 값에따라 배경을 잘라내게 하는 식으로 구현도 가능
  • 머티리얼을 기반으로 머티리얼 인스턴스를 생성하기

  • SelectInfo에서 UPROPERTY로 블루프린트에서 편집할 수 있게 Tarray를 선언한 후 머티리얼 값을 미리 넣어 둠
	UPROPERTY(EditAnywhere)
	TArray<UMaterialInstance*>	mImageMaterialArray;
  • 캐릭터 이미지 변경
void USelectInfoWidget::NativeOnInitialized()
{
	...

	mCharacterImage = Cast<UImage>(GetWidgetFromName(TEXT("CharacterImage")));

  ... 

}
void USelectInfoWidget::SetPlayerInfo(const FPlayerData& Data)
{
	...

	mCharacterImage->SetBrushFromMaterial(mImageMaterialArray[JobIndex]);

  ...

}

플레이어 HUD 위젯

Player Head-Up Display 플레이 시 항시 띄워져있는 디스플레이

캐릭터 정보

게임 인스턴스

실행 중인 게임의 인스턴스에 대한 고급 관리자 개체
게임 시작시 생성이 되며 게임이 끝날 때까지 소멸되지 않고, 특정 월드에 소속되어 있는 개념이 아님

MyGameInstance.h

#include "GameInfo.h"
#include "Engine/GameInstance.h"
#include "UE20241GameInstance.generated.h"

UCLASS()
class UE20241_API UUE20241GameInstance : public UGameInstance
{
	GENERATED_BODY()
	
public:
	UUE20241GameInstance();

protected:
	FString		mPlayerName;
	FPlayerData	mSelectPlayerData;

public:
	void SetPlayerName(const FString& Name)
	{
		mPlayerName = Name;
	}

	void SetSelectPlayerData(const FPlayerData& Data)
	{
		mSelectPlayerData = Data;
	}
	
	const FString& GetPlayerName()	const
	{
		return mPlayerName;
	}

	const FPlayerData& GetSelectPlayerData()
	{
		return mSelectPlayerData;
	}

public:
	virtual void Init();
};

SelectWidget.cpp

void USelectWidget::StartButtonClick()
{
	FString	Name = mInputName->GetText().ToString();

	UUE20241GameInstance* GameInst = GetWorld()->GetGameInstance<UUE20241GameInstance>();

	if (IsValid(GameInst))
	{
		GameInst->SetSelectPlayerData(mSelectPlayerData);
		GameInst->SetPlayerName(Name);
	}

	FString	Option = FString::Printf(TEXT("Job=%d PlayerName=%s "),
		(int32)mSelectJob, *Name);

	UGameplayStatics::OpenLevel(GetWorld(), TEXT("TestLevel"), true, Option);
}

플레이어 스테이트

플레이 중인 게임의 정보를 처리하는 클래스이며, 클라이언트가 게임의 상태를 모니터링할 수 있게 만들어 준다
개념적으로 게임 스테이트는 접속된 모든 클라이언트가 알아야 하는 정보, 플레이어 개개인이 아닌 게임 모드에 관련된 정보를 관리해야 한다. 그래서 접속된 플레이어 목록, 깃발뺏기 게임의 팀 점수, 오픈 월드 게임에서 완료한 미션 등과 같은 게임 전반적인 프로퍼티 기록을 유지할 수 있음

플레이어 컨트롤러

<!–>

  • 멀티 플레이 게임의 경우 플레이어 캐릭터 자체가 여러 개가 생성이 된다 -> UI가 여러 개 생성될 가능성이 있다
  • InGamePlayerController를 만들어서 사용
  • 플레이어 컨트롤러에 메인위젯 블루프린트 클래스를 생성자에서 생성하고, 뷰포트에서 보이게 BeginPlay()에서 셋팅

© 2023 Jinsoo Lee. All rights reserved.

Powered by Hydejack v9.1.6