이번에는 기존의 UI 시스템을 발전시켜 Attribute Set의 데이터를 UI가 반영할 수 있도록 하겠습니다.
우선 C++ 클래스의 일부를 손보도록 하겠습니다.
Model의 정보를 View에 반영하는 일은 UAuraWidgetController가 수행해야 합니다.
따라서 함수를 추가하겠습니다.
1) UAuraWidgetController
.
.
.
UCLASS()
class AURA_API UAuraWidgetController : public UObject
{
GENERATED_BODY()
public:
.
.
.
virtual void BroadcastInitialValues();
protected:
.
.
.
};
.
.
.
void UAuraWidgetController::BroadcastInitialValues()
{
}
추가된 함수인 BroadcastInitialValues는 WidgetController가 데이터를 받으면
연결된 UI에 데이터를 전달하는 역할을 수행합니다.
자세한 사항은 UI 별로 다르게 구현되야 하므로 빈 함수로 두겠습니다.
2) UAuraOverlayWidgetController
#pragma once
#include "CoreMinimal.h"
#include "UI/WidgetController/AuraWidgetController.h"
#include "AuraOverlayWidgetController.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangedSignature, float, NewHealth);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMaxHealthChangedSignature, float, NewMaxHealth);
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAuraOverlayWidgetController : public UAuraWidgetController
{
GENERATED_BODY()
public:
virtual void BroadcastInitialValues() override;
/*
* Delgate Section
*/
UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
FOnHealthChangedSignature OnHealthChanged;
UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
FOnMaxHealthChangedSignature OnMaxHealthChanged;
};
OverlayWidgetController는 위와 같이 변경되었습니다.
델리게이트를 2개 만들어 일단 Health와 MaxHealth에 대한 BroadcastInitialValues 함수를 호출하도록 합니다.
또한 클래스 타입을 BlueprintType, Blueprintable로 만들어
블루 프린트 내에서 함수를 호출하거나 변수로 만들 수 있도록 설정하였습니다.
#include "UI/WidgetController/AuraOverlayWidgetController.h"
#include "AbilitySystem/AuraAttributeSet.h"
void UAuraOverlayWidgetController::BroadcastInitialValues()
{
const UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);
OnHealthChanged.Broadcast(AuraAttributeSet->GetHealth());
OnMaxHealthChanged.Broadcast(AuraAttributeSet->GetMaxHealth());
}
동작도 간단하게 이뤄집니다.
AttributeSet을 AuraAttributeSet으로 캐스팅하고
각각 만들어진 델리게이트를 통해 해당 AS에서 얻어낼 수 있는 정보를 Broadcast 합니다.
3) AAuraHUD
.
.
.
// HUD에서 OverlayWidget을 설정하는 함수
void AAuraHUD::InitOverlay(APlayerController* InPlayerController, APlayerState* InPlayerState, UAbilitySystemComponent* InAbilitySystemComppnent, UAttributeSet* InAttributeSet)
{
.
.
.
OverlayWidget->SetWidgetController(WidgetController);
WidgetController->BroadcastInitialValues();
Widget->AddToViewport();
}
AuraHUD의 InitOverlay 함수는 뷰포트 화면에 Overlay를 띄우도록 합니다.
이때 Overlay 위젯의 WidgetController가 BroadcastInitialValues 함수를 호출하여
AS의 기본값을 위젯에 반영할 수 있도록 합니다.
이제 언리얼 에디터에서 블루 프린트로 작업을 해보겠습니다.
4) 언리얼 에디터
WBP_Overlay 에서는 WidgetController가 설정될 때 기존의 체력 UI와 마나 UI가
올바른 WidgetController를 설정할 수 있도록 로직을 추가합니다.
WBP_ProgressBar에서는 ProgressBar의 퍼센트를 조정할 수 있는 함수를 생성하였습니다.
최종적으로 체력 UI인 WBP_HealthGlobe에서는 WidgetController가 설정되면 다음의 로직을 수행합니다.
우선 자신의 WidgetController를 가져와 캐스팅하여 확인합니다.
캐스팅되어 올바르게 가져온 WidgetController에 대해 OnHealthChanged_Event를 바인딩합니다.
마지막으로 OnMaxHealthChanged_Event에 대해서도 바인딩합니다.
최종 실행 결과는 다음과 같습니다.