Model (데이터와 상태 관리)

Model은 UI의 데이터와 상태를 정의하고 관리한다.

// Model 역할: AttributeSet
UCLASS()
class MYGAME_API UEveAttributeSet : public UAttributeSet
{
    GENERATED_BODY()

public:
    UPROPERTY(BlueprintReadOnly, Category = "Attributes")
    FGameplayAttributeData Health;

    UPROPERTY(BlueprintReadOnly, Category = "Attributes")
    FGameplayAttributeData MaxHealth;
};


View (UI 표시 및 사용자와의 상호작용)

View는 UI를 렌더링하고 사용자와의 상호작용을 담당.

cpp
복사편집
// View 역할: HealthBar Widget
UCLASS()
class MYGAME_API UHealthBarWidget : public UUserWidget
{
    GENERATED_BODY()

public:
    UPROPERTY(meta = (BindWidget))
    UProgressBar* HealthBar;

    void UpdateHealth(float CurrentHealth, float MaxHealth)
    {
        if (HealthBar)
        {
            HealthBar->SetPercent(CurrentHealth / MaxHealth);
        }
    }
};


Controller (로직과 상호작용의 중재

Controller는 Model과 View 간의 중재 역할을 합니다.

cpp
복사편집
// Controller 역할: WidgetController
UCLASS()
class MYGAME_API UOverlayWidgetController : public UObject
{
    GENERATED_BODY()

public:
    UFUNCTION()
    void BindModel(UAbilitySystemComponent* ASC, UEveAttributeSet* Attributes)
    {
        // Model(AttributeSet)의 변경 이벤트에 View를 업데이트하는 로직 추가
        ASC->GetGameplayAttributeValueChangeDelegate(Attributes->GetHealthAttribute())
            .AddUObject(this, &UOverlayWidgetController::OnHealthChanged);
    }

    UFUNCTION()
    void OnHealthChanged(const FOnAttributeChangeData& Data)
    {
        // View 업데이트
        HealthBarWidget->UpdateHealth(Data.NewValue, Attributes->GetMaxHealth());
    }

private:
    UPROPERTY()
    UHealthBarWidget* HealthBarWidget;
};


MVC의 흐름