0. 개요

이전 포스트에서 위젯에 속성의 기본 값을 적용하도록 설정했다.

 

3-5. 위젯 컨트롤러를 이용하여 위젯 초기화하기

0. 개요이제 오버레이 위젯 컨트롤러를 사용하여 오버레이 상의 위젯에 기초 값을 대입하도록 설정한다.  1. 위젯 컨트롤러를 이용하여 위젯 초기화하기(1) AuraWidgetControllervirtual void BroadcastInitial

crat.tistory.com

이제 ASC를 이용하여 변화한 값을 적용하도록 한다.

 

 

1. 변화한 속성 값 가져오기

(1) 종속성에 대해 콜백 함수 바인딩하기

Ability System Component에는 속성 값이 변화했는지 체크할 수 있는 델리게이트가 존재한다.

GetGameplayAttributeValueChangeDelegate를 사용한다.

그 전에, 콜백 함수를 바인딩할 수 있도록 AuraWidgetController 클래스에 함수를 추가한다.

UCLASS()
class AURA_API UAuraWidgetController : public UObject
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintCallable)
	void SetWidgetControllerParams(const FWidgetControllerParams& WCParams);
	virtual void BroadcastInitialValues() {};
	virtual void BindCallbacksToDependencies() {};

 

 

(2) OverlayWidgetController에서 BindCallbacksToDependencies 오버라이드 하기

UCLASS(BlueprintType, Blueprintable)
class AURA_API UOverlayWidgetController : public UAuraWidgetController
{
	GENERATED_BODY()

public:
	virtual void BroadcastInitialValues() override;
	virtual void BindCallbacksToDependencies() override;

	// 델리게이트일 경우에 Assignable
	UPROPERTY(BlueprintAssignable, Category="GAS|Attributes")
	FOnHealthChangedSignature OnHealthChanged;

	UPROPERTY(BlueprintAssignable, Category="GAS|Attributes")
	FOnMaxHealthChangedSignature OnMaxHealthChanged;

protected:
	void HealthChanged(const FOnAttributeChangeData& Data);
	void MaxHealthChanged(const FOnAttributeChangeData& Data);
	
};

이제 콜백 함수를 델리게이트에 바인딩하기 위해, 두 개의 콜백 함수를 만든다. 하나는 체력, 다른 하나는 최대 체력이 변동할 때 적용할 콜백 함수이다.

void UOverlayWidgetController::BindCallbacksToDependencies()
{
    const UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);

    AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(
        AuraAttributeSet->GetHealthAttribute()).AddUObject(this, &UOverlayWidgetController::HealthChanged);

    AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(
        AuraAttributeSet->GetMaxHealthAttribute()).AddUObject(this, &UOverlayWidgetController::MaxHealthChanged);
}

이제 ASC 내의 내장된 속성 값 변화를 추적하는 델리게이트에서 체력(Health) 속성(Attribute)의 변화에 해당 콜백 함수를 바인딩한다.

이러면 캐릭터의 체력과 최대 체력의 속성 값이 변화하면 HealthChanged 함수와 MaxHealthChanged 함수가 발동할 것이다.

 

 

(3) 콜백 함수

void UOverlayWidgetController::HealthChanged(const FOnAttributeChangeData& Data)
{
    OnHealthChanged.Broadcast(Data.NewValue);
}

void UOverlayWidgetController::MaxHealthChanged(const FOnAttributeChangeData& Data)
{
    OnMaxHealthChanged.Broadcast(Data.NewValue);
}

기존에 Init에서 담당했던 이벤트 브로드캐스트를 각각의 콜백 함수에서 수행한다.

Data 구조체에서 새롭게 변화한 값만 가져와 변동시키도록 한다.

 

 

(4) AuraHUD에서  BindCallbacksToDependencies 함수 호출하기

이제 종속성에 콜백 함수를 바인딩하는 함수를 HUD에서 호출한다.

위치는 Overlay Widget Controller가 세팅된 이후가 적절하므로 아래와 같이 코드를 수정한다.

UOverlayWidgetController *AAuraHUD::GetOverlayWidgetController(const FWidgetControllerParams &WCParams)
{
    if (OverlayWidgetController == nullptr)
    {   // 없으면 생성
        OverlayWidgetController = NewObject<UOverlayWidgetController>(this, OverlayWidgetControllerClass);
        OverlayWidgetController->SetWidgetControllerParams(WCParams);
        OverlayWidgetController->BindCallbacksToDependencies();

        return OverlayWidgetController;
    }

    return OverlayWidgetController;
}

 

 

(5) 단계 정리

- HUD에서 InitOverlay

AuraHUD에서 위젯을 생성하고 위젯 컨트롤러를 초기화한 뒤에 위젯에 위젯 컨트롤러를 연결하는 작업을 실시한다.

여기에서 GetOverlayWidgetController가 호출된다.

 

- 오버레이 위젯 컨트롤러 가져오기

오버레이 위젯 컨트롤러가 이미 존재하면 해당 컨트롤러를 리턴하고, 없으면 새로 생성한다.

 

- 바인딩

오버레이 위젯 컨트롤러가 생성된 후 초기화가 되었다면 어빌리티 시스템 컴포넌트의 속성 값 변화 델리게이트에 체력 속성을 등록하고 콜백 함수를 바인딩한다.


- 체력(Health Attribute) 변화

콜백 함수(OverlayWidgetController의 HealthChanged)에서 OnHealthChanged 델리게이트가 발동한다.

이어서 위젯 블루프린트에서 OnHealthChanged와 바인딩된 함수가 발동하며 체력 글로브 퍼센트가 변화한다.

최종적으로 UI에서 체력 퍼센트가 올바르게 표시된다.

 

동일한 방법을 사용하여 마나 변화도 추적한다.