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 함수


'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
| 32-8. 로그 라이크 - (3) 게임플레이 어빌리티 - (4) 활성화된 어빌리티를 순회하여 랜덤한 업그레이드 태그 추출 (0) | 2025.06.13 |
|---|---|
| 32-7. 로그 라이크 - (3) 게임플레이 어빌리티 - (3) PlayerState에서 업그레이드 태그 관리 (0) | 2025.06.10 |
| 32-5. 로그 라이크 - (3) 게임플레이 어빌리티 - (1) 어빌리티 재구조화 및 업그레이드 기능 적용 (1) | 2025.06.09 |
| 32-4. 로그 라이크 - (2) MVVM - (2) 뷰 생성 및 초기화, UI와 게임 연동 (0) | 2025.06.09 |
| 32-3. 로그 라이크 - (2) MVVM - (1) 업그레이드 카드, 카드 선택 UI (0) | 2025.06.09 |
