0. 개요

이제 오버레이 위젯 컨트롤러를 사용하여 오버레이 상의 위젯에 기초 값을 대입하도록 설정한다.

 

 

1. 위젯 컨트롤러를 이용하여 위젯 초기화하기

(1) AuraWidgetController

virtual void BroadcastInitialValue() abstract;

OverlayWidgetController는 AuraWidgetController를 부모로 상속받는다.

Overlay 뿐 만 아닌 모든 위젯 컨트롤러 클래스가 초기 값을 위젯에 설정할 수 있도록 이 함수를 오버라이딩 할 것이다.

 

(2) OverlayWidgetController

#include "CoreMinimal.h"
#include "UI/WidgetController/AuraWidgetController.h"
#include "OverlayWidgetController.generated.h"

// 동적 멀티캐스트 - dynamic multicast delegate
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangedSignature, float, NewHealth);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMaxHealthChangedSignature, float, NewMaxHealth);


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

public:
	virtual void BroadcastInitialValues() override;

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

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

델리게이트를 이용해 특정 값이 변화할 때 브로드캐스트 하도록 설정할 것이다.


- DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam

한 개의 인자를 받는 / 여러 함수를 바인딩 할 수 있는 / 델리게이트 타입을 정의한다

 

ex) FOnHealthChangedSignature 델리게이트는 float 타입의 NewHealth를 인자로 받는다.

 

- UPROPERTY(BlueprintAssignable)

해당 델리게이트를 블루프린트에서 바인딩 할 수 있다.


 

(3) AuraHUD에서 초기값 브로드캐스트

void AAuraHUD::InitOverlay(APlayerController *PC, APlayerState *PS, UAbilitySystemComponent *ASC, UAttributeSet *AS)
{
    // 위젯과 위젯 컨트롤러 생성
    checkf(OverlayWidgetClass, TEXT("오버레이 위젯 클래스가 초기화되지 않음. BP_AuraHUD"));
    checkf(OverlayWidgetControllerClass, TEXT("오버레이 위젯 컨트롤러 클래스가 초기화되지 않음. BP_AuraHUD"));

    // 위젯 생성 후 오라 유저 위젯으로 캐스팅
    UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), OverlayWidgetClass);
    OverlayWidget = Cast<UAuraUserWidget>(Widget);

    // 구조체에 할당 후 오버레이 위젯 컨트롤러를 초기화
    const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);
    UOverlayWidgetController* WidgetController = GetOverlayWidgetController(WidgetControllerParams);

    // 위젯에 위젯 컨트롤러를 연결
    OverlayWidget->SetWidgetController(WidgetController);
    
    // 유효한 속성 세트와 위젯 컨트롤러를 가짐 -> 값 초기화 가능
    WidgetController->BroadcastInitialValues();
    Widget->AddToViewport();
}

InitOverlay에서 위젯을 생성하고 오버레이 위젯 컨트롤러를 초기화 한 후에 둘을 연결해주는 역할을 했다.

위젯 컨트롤러가 유효한 시점에서, 속성 세트, 위젯 컨트롤러가 존재하기 때문에, 이후에 기본 값을 초기화하는 것이 가능해진다.

 

 

(4) WBP_Overlay에서 체력 글로브와 마나 글로브에 위젯 컨트롤러 연결하기

이전에 WidgetControllerSet 함수를 BlueprintImplementableEvent 로 설정했으므로 꺼내어 쓸 수 있다.

디자이너 패널에서 두 글로브를 변수로 사용하도록 설정하고 이벤트 그래프에서 꺼내어 SetWidgetController 함수를 사용한다.

AuraUserWidget에서 Widget에 Widget Controller를 연결할 수 있도록 해당 함수를 BlueprintCallable로 설정했기 때문에 꺼내어 쓸 수 있다.

AuraUserWidget의 WidgetController를 가져와 체력 글로브와 마나 글로브에 연결한다.

 

 

(5) BP_OverlayWidgetController

BP_AuraHUD에서 오버레이 위젯 컨트롤러 클래스를 블루프린트 버전으로 대체한다.

 

 

2. 블루프린트

(1) WBP_GlobeProgressBar에서 백분율 계산하기

ProgressBar Globe를 대상으로 퍼센트를 설정하는 함수를 만든다.

여기에서 퍼센트가 변화하면 글로브의 체력이 변화하는 것이 아래에서 위로부터 적용된다.

 

 

(2) WBP_HealthGlobe에서 수치 변동을 적용하기

이전에 생성했던 델리게이트에 이벤트를 바인딩할 차례이다.

오버레이 위젯 컨트롤러를 가져와 이벤트 바인딩한다.

새로운 체력과 새로운 최대 체력에는 Safe Divide를 이용해 최대 체력이 0이 되어도 오류가 발생하지 않도록 하고, 방금 생성했던 Set Progress Bar Percent 블루프린트 함수를 통해 Globe의 Progress bar 퍼센트를 조정하도록 한다.

 

 

(3) 시퀀스에 따라 배치하기

위의 블루프린트를 정돈하고 시퀀스에 따라 차례대로 발동하도록 한다. BP Overlay Widget Controller는 변수로 승격하여 사용하도록 한다.