0. 개요
PlayerState에서 정의한 경험치를 오버레이 위젯 컨트롤러로 넘긴다.
1. 경험치 변화 델리게이트에 콜백 함수 바인딩
(1) 레벨업 정보를 PlayerState에서 들고 있기
// 레벨업 정보
UPROPERTY(EditDefaultsOnly)
TObjectPtr<ULevelUpInfo> LevelUpInfo;
서버 / 클라이언트 양 쪽에 존재해야 하며, 캐릭터가 죽고 부활하더라도 여전히 정보를 들고있어야 하기 때문에
PlayerState에서 레벨업 정보를 들고 있는 것은 합당하다.
(2) OverlayWidgetController에서 델리게이트에 콜백 함수 바인딩
void UOverlayWidgetController::BindCallbacksToDependencies()
{
AAuraPlayerState* AuraPlayerState = CastChecked<AAuraPlayerState>(PlayerState);
AuraPlayerState->OnXPChangedDelegate.AddUObject(this, &UOverlayWidgetController::OnXPChanged);
Aura 위젯 컨트롤러는 기본적으로 ASC, PlayerState, PlayerController, Attribute Set를 가지고 있으므로 캐스팅하여 사용한다.
(3) 경험치 퍼센트 계산
UPROPERTY(BlueprintAssignable, Category = "GAS|XP")
FOnAttributeChangedSignature OnXPPercentChanged;
경험치가 속성(Attributes)는 아니지만, 위의 델리게이트가 멀티캐스트 델리게이트이므로 추가적으로 델리게이트를 생성할 필요 없이 재활용하여 사용할 수 있다.
이 델리게이트는 C++에서 블루프린트로 XP 퍼센트 값을 넘기는 데에 사용한다.
void UOverlayWidgetController::OnXPChanged(int32 NewXP)
{
// HUD의 XP Bar에 적용
AAuraPlayerState* AuraPlayerState = CastChecked<AAuraPlayerState>(PlayerState);
// 레벨업 정보 가져옴
const ULevelUpInfo* LevelUpInfo = AuraPlayerState->LevelUpInfo;
checkf(LevelUpInfo, TEXT("Can't Found LevelUpInfo. Fill out AuraPlayerState Blueprint"));
// 경험치량 증가로 인해 달성한 레벨
const int32 Level = LevelUpInfo->FindLevelForXP(NewXP);
const int32 MaxLevel = LevelUpInfo->LevelUpInformation.Num();
// 증가량
if (Level <= MaxLevel && Level > 0)
{
const int32 LevelUpRequirement = LevelUpInfo->LevelUpInformation[Level].LevelUpRequirement;
const int32 PrevLevelUpRequirement = LevelUpInfo->LevelUpInformation[Level - 1].LevelUpRequirement;
// 현재 레벨의 끝 값 - 현재 레벨의 시작 값(==이전 레벨의 끝 값)
const int32 Delta = LevelUpRequirement - PrevLevelUpRequirement;
// 지금 레벨 안에서 경험치 진행값
const int32 XPForThisLevel = NewXP - PrevLevelUpRequirement;
const float XPBarPercent = static_cast<float>(XPForThisLevel) / Delta;
OnXPPercentChanged.Broadcast(XPBarPercent);
}
}
- Level : 경험치 총합으로 도달한 레벨
- MaxLevel : 최대 레벨
- LevelUpRequirement : 도달한 레벨까지의 경험치 총합
- PrevUpRequirement : 도달한 레벨의 이전 레벨까지의 경험치 총합
- Delta : 위의 두 값을 빼면 다음 레벨까지 레벨업 하기까지 필요한 경험치 총량이 나온다.
- XPForThisLevel : 현재 경험치 진행량
경험치 총합에서 이전 레벨 레벨업 필요량을 빼면 상대적인 현재 경험치값이 나온다.
Delta와 XPForThisLevel을 사용하여 퍼센트를 구한다.
- 나눗셈에서 하나의 값이 float이기만 하면 결과값도 float로 나온다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
20-6. 경험치 - (5) 이벤트를 기다리는 패시브 게임플레이 어빌리티 (0) | 2025.01.16 |
---|---|
20-5. 경험치 - (4) 몬스터에 경험치 부여 (0) | 2025.01.15 |
20-3. 경험치 - (2) 경험치, 레벨 도입 (0) | 2025.01.15 |
20-2. 경험치 - (1) 레벨업 정보 데이터 에셋 (0) | 2025.01.15 |
20-1. 경험치와 레벨업 (0) | 2025.01.15 |