전 강의까지는 Stat을 증가시켜주는 Scroll 관련 상자를 획득하였을때 Debug Message로 먹었다고 표시만 하고 지나갔다. 이제는 이를 실제 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을 업데이트하는 아이템들 같은 경우에는 게임 플레이의 밸런스를 고려해서 신중하게 만들어야 한다.
Hpbar 위에 텍스트를 덮기 위해서 Overlay 패널을 사용한다. 계층 구조는 세로 박스 안에 Overlay를 배치하고, 그 안에 HpBar와 CurrentHp/MaxHp를 표시해 주는 텍스트를 배치한다.
// 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);
}
}
변경 함수 로직 추가
이제는 캐릭터 플레이어가 scroll 상자를 먹었을때 Stat의 변화가 생긴다. 5가지의 scroll 중 체력 관련 scroll을 먹었기 때문에 다른 Stat들은 적게 오르고, 체력 Stat이 많이 오르는 것을 UI를 통해 확인할 수 있다.
Data Asset
우클릭 후,에셋 액션
-> Property Matrix를 통한 에셋 대량 편집
을 하면 한꺼번에 다수의 Data Asset을 편집할 수 있다.
Data Table
에 연동되어 있는 .csv
파일이 있을텐데 csv
파일을 직접적으로 수정하기는 번거로움으로 .xlsx
파일에서 수정을 하고 다른 이름으로 저장을 기본 csv
파일의 이름으로 한다. 그다음, 언리얼 에디터에서 DataTable
파일로 들어간 다음 ReImport
버튼을 눌르면 수정사항이 반영된다.
HpWidget의 MaxHp가 stat이 변경되었을때 바로 반영이 안되고 NPC에게 맞고 난 이후에 변경되는 현상이 발생.