1. 뷰 모델

(1) MVVM_AbilityCard에 태그 할당 완료 델리게이트

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnUpgradeTagAssigned, const FGameplayTag&, UpgradeTag);
	UPROPERTY(BlueprintAssignable)
	FOnUpgradeTagAssigned OnUpgradeTagAssignedDelegate;

 

 

(2) AuraHUD에서 뷰 모델에 업그레이드 태그가 할당된 이후에 완료 델리게이트 호출

void AAuraHUD::HandleRandomAbilityUpgrade(FGameplayTag UpgradeTag0, FGameplayTag UpgradeTag1,
    FGameplayTag UpgradeTag2)
{
    auto* Info = UAuraAbilitySystemLibrary::GetAbilityUpgradeInfo(this);
    if (Info == nullptr)
        return;
    
    auto* CardViewModel_0 = CardSelectionViewModel->GetCardViewModelByIndex(0);
    if (CardViewModel_0)
    {
        auto Upgrade = Info->GetUpgradeInfoForUpgradeTag(UpgradeTag0);
        
        CardViewModel_0->SetUpgradeTag(Upgrade.UpgradeEffectTag);
        CardViewModel_0->SetUpgradeDescription(Upgrade.UpgradeDescription);
        CardViewModel_0->SetUpgradeName(Upgrade.UpgradeName);
        CardViewModel_0->SetUpgradeMaxLevel(Upgrade.UpgradeMaxLevel);

        CardViewModel_0->OnUpgradeTagAssignedDelegate.Broadcast(UpgradeTag0);
    }

 

 

 

2. 뷰

(1) WBP_CardSelection_Base의 부모 클래스 리펙토링

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "UI/ViewModel/MVVM_AbilityCard.h"
#include "LoadScreenWidget.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnViewModelBound, UMVVMViewModelBase*, BoundViewModel);

UCLASS()
class AURA_API ULoadScreenWidget : public UUserWidget
{
	GENERATED_BODY()
	
public:
	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
	void BlueprintInitializeWidget();

	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
	void ViewModelBoundEvent(UMVVMViewModelBase* ViewModelBase);
	
public:
	UPROPERTY(BlueprintReadWrite, Category = "MVVM", meta=(ExposeOnSpawn="true"), Setter="SetViewModelInternal")
	TObjectPtr<UMVVMViewModelBase> ViewModel;

	// 블루프린트 이벤트
	UPROPERTY(BlueprintAssignable, Category = "MVVM|Events")
	FOnViewModelBound OnViewModelBound;

protected:
	virtual void NativeConstruct() override;

private:
	// ViewModel에 새로운 값이 할당될 때마다 호출됨
	UFUNCTION()
	void SetViewModelInternal(UMVVMViewModelBase* NewViewModel);
};
#include "UI/Widget/LoadScreenWidget.h"

void ULoadScreenWidget::NativeConstruct()
{
	Super::NativeConstruct();
}

void ULoadScreenWidget::SetViewModelInternal(UMVVMViewModelBase* NewViewModel)
{
	// 새 뷰 모델이 현재 뷰 모델과 다르다면 업데이트합니다.
	if (ViewModel != NewViewModel)
	{
		ViewModel = NewViewModel;

		if (ViewModel)
		{
			OnViewModelBound.AddDynamic(this, &ULoadScreenWidget::ViewModelBoundEvent);
			OnViewModelBound.Broadcast(ViewModel);
		}
	}
}

뷰가 생성된 이후에 MVVM이 Set되면 호출되는 내부 함수이다.

이 함수를 이용하여 OnViewModelBound 블루프린트 이벤트를 바인딩하여 호출한다.

 

 

(2) WBP_UpgradeCard의 카드 초기화 함수 수정

ViewModel 멤버 변수가 설정될 때 View Model Bound Event가 호출된다.

 

 

(3) WBP_UpgradeCard에서 뷰 모델 바인딩 이벤트에 태그 할당 완료 이벤트 바인딩

순서를 보장하여 업그레이드 태그를 이용하여 배경 색을 변경하도록 한다.

 

 

(4) 주어진 태그에 따라서 배경 색을 변경하는 Set Background Color 함수