Model은 UI의 데이터와 상태를 정의하고 관리한다.
AttributeSet이나, 데이터 관리 클래스가 Model 역할을 수행.// 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를 렌더링하고 사용자와의 상호작용을 담당.
UUserWidget이 이에 해당.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는 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;
};