2-14강 게임 플로우 다듬기

Ryan Ham·2024년 7월 15일
0

이득우 Unreal

목록 보기
21/23
post-thumbnail

목차

게임 플로우 마무리

  1. 죽는 상태에 대한 플레이어와 NPC의 설정
  2. 전체 게임 구성 요소의 이해
  3. 캐릭터 데이터 조정과 다양한 아이템 설정 및 구현

상자 먹었을 때 Stat 반영

전 강의까지는 Stat을 증가시켜주는 Scroll 관련 상자를 획득하였을때 Debug Message로 먹었다고 표시만 하고 지나갔다. 이제는 이를 실제 stat에 변경이 일어나도록 만들어보자.

Stat 변경 과정

  1. 스탯을 증가시키는 함수 만들기
  2. 과정 1에서 만든 함수를 Stat 관련 델리게이트에 바인딩
// CharacterBase.cpp
void ARyanCharacterBase::ApplyStat(const FRyanCharacterStat& BaseStat, const FRyanCharacterStat& ModifierStat)
{
	float MovementSpeed = (BaseStat + ModifierStat).MovementSpeed;
	GetCharacterMovement()->MaxWalkSpeed = MovementSpeed;
}

스탯을 증가시키는 함수 ApplyStat 만들기

// CharacterBase.cpp
void ARyanCharacterBase::PostInitializeComponents()
{
	Super::PostInitializeComponents();
	Stat->OnHpZero.AddUObject(this, &ARyanCharacterBase::SetDead);
	Stat->OnStatChanged.AddUObject(this, &ARyanCharacterBase::ApplyStat);
}

과거 강의에서 만들어 놓았던OnStatChanged라는 델리게이트에 1번 과정에서 만든 함수 바인딩.


아이템 설정

우리는 총 Weapon, Potion, Scroll의 3가지 유형의 Item 데이터가 있는데, 이 클래스들은 모두 PrimaryAssetData를 상속해서 만든 custom Item 클래스를 부모로 가진다.

FPrimaryAssetId GetPrimaryAssetId() const override
{
	return FPrimaryAssetId("RyanItemData", GetFName());
}

Weapon, Potion, Scroll에 공통적으로 같은 AssetId를 부여한다.

Project Setting -> Game -> Asset Manager에 해당 PrimaryAsset들을 3가지 종류가 있는 상위 Item 폴더로 잡았기 때문에 게임이 로딩될 때 이 모든 asset들은 로딩이 되어서 우리가 상자를 열었을때 같은 AssetId를 가지는 Item 중에서 하나를 랜덤으로 고르게 된다.

이렇게 Stat을 업데이트하는 아이템들 같은 경우에는 게임 플레이의 밸런스를 고려해서 신중하게 만들어야 한다.


HpWidget의 수정

HpWidget의 UI 부분 수정

Hpbar 위에 텍스트를 덮기 위해서 Overlay 패널을 사용한다. 계층 구조는 세로 박스 안에 Overlay를 배치하고, 그 안에 HpBar와 CurrentHp/MaxHp를 표시해 주는 텍스트를 배치한다.

HpWidget의 코드 부분 수정

// HpBarWidget.cpp > NativeConstruct()
HpStat = Cast<UTextBlock>(GetWidgetFromName(TEXT("TxtHpStat")));
ensure(HpStat);

우리가 HpBar Widget에서 Text 관련 부분을 TxtHpStat라고 설정해 두었다. HpBarWidget.cpp의 NativeConstruct에서 이 부분을 GetWidgetFromName을 통해서 해당 포인터를 가져온다.

// HpBarWidget.cpp
void URyanHpBarWidget::UpdateStat(const FRyanCharacterStat& BaseStat, const FRyanCharacterStat& ModifierStat)
{
	MaxHp = (BaseStat + ModifierStat).MaxHp;

	if (HpProgressBar)
	{
		HpProgressBar->SetPercent(CurrentHp / MaxHp);
	}
}

변경 함수 로직 추가


UI에 Stat 변화 반영

이제는 캐릭터 플레이어가 scroll 상자를 먹었을때 Stat의 변화가 생긴다. 5가지의 scroll 중 체력 관련 scroll을 먹었기 때문에 다른 Stat들은 적게 오르고, 체력 Stat이 많이 오르는 것을 UI를 통해 확인할 수 있다.


Bulk Edit Via Property Matrix를 통한 대량 편집

Data Asset 대량 변경 하는 방법

Data Asset 우클릭 후,에셋 액션 -> Property Matrix를 통한 에셋 대량 편집을 하면 한꺼번에 다수의 Data Asset을 편집할 수 있다.

Data Table 대량 변경 하는 방법

Data Table에 연동되어 있는 .csv 파일이 있을텐데 csv 파일을 직접적으로 수정하기는 번거로움으로 .xlsx 파일에서 수정을 하고 다른 이름으로 저장을 기본 csv 파일의 이름으로 한다. 그다음, 언리얼 에디터에서 DataTable 파일로 들어간 다음 ReImport 버튼을 눌르면 수정사항이 반영된다.


기타

문제 봉착

HpWidget의 MaxHp가 stat이 변경되었을때 바로 반영이 안되고 NPC에게 맞고 난 이후에 변경되는 현상이 발생.

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글