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로 나온다.