提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
MVC中的Model负责数据,View负责显示,Controller处理用户输入和业务逻辑。数据存储在GameInstance或GameState中(Model),UI控件作为View,PlayerController或Widget的蓝图作为Controller。UE本身并没有严格强制使用MVC或MVVM,开发者需要自行实现这些模式。例如,UMG中的Widget可以视为View,而数据可能需要通过绑定到某个数据源(Model),然后通过中间层(ViewModel或Controller)来更新。
一、 MVC(Model-View-Controller)
-
核心概念:
-
Model:管理数据(如角色属性、游戏状态)。
View:负责UI或场景的显示逻辑。
Controller:处理用户输入和业务逻辑,协调Model与View的交互。
UE中的实现示例:
场景:角色属性界面
Model:
// C++类 UCharacterData(继承自UObject)
UCLASS()
class MYPROJECT_API UCharacterData : public UObject {
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
int32 Health;
UPROPERTY(BlueprintReadOnly)
int32 Level;
};
View:
UMG Widget中显示角色属性的TextBlock或ProgressBar。
Controller:
通过PlayerController或Widget的蓝图逻辑更新Model,并通知View刷新:
// 在PlayerController中
void AMyPlayerController::UpdateHealth(int32 NewHealth) {
CharacterData->Health = NewHealth;
// 触发View更新(如调用Widget的RefreshUI函数)
}
二、MVVM(Model-View-ViewModel)
-
核心概念:
-
Model:数据源(同MVC)。
View:UI显示层。
ViewModel:中间层,将Model数据转换为View可直接使用的格式,并封装视图逻辑。
UE中的实现示例:
场景:背包系统
Model:
// C++类 UInventoryData
UCLASS()
class MYPROJECT_API UInventoryData : public UObject {
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
TArray<FItemInfo> Items;
};
ViewModel:
继承自UObject,提供数据绑定和格式化逻辑:
// C++类 UInventoryViewModel
UCLASS()
class MYPROJECT_API UInventoryViewModel : public UObject {
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
FText GetItemDisplayName(int32 Index) {
return FText::FromName(InventoryData->Items[Index].Name);
}
UPROPERTY(BlueprintReadOnly)
UInventoryData* InventoryData;
};
View:
UMG Widget中通过绑定ViewModel的函数或属性显示数据:
<!-- UMG绑定示例 -->
TextBlock.Text = ViewModel.GetItemDisplayName(0)
UE中实现MVC/MVVM的关键技术
-
数据绑定(Data Binding)
-
使用UMG的绑定功能,将View直接绑定到ViewModel或Model的属性。
示例:ProgressBar的百分比绑定到角色的当前生命值。
委托与事件(Delegates)
- 通过BlueprintAssignable委托通知View更新:
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnHealthChanged);
UPROPERTY(BlueprintAssignable)
FOnHealthChanged OnHealthChanged;
-
蓝图与C++混合开发
-
在C++中定义Model和ViewModel,通过蓝图实现Controller或View的交互逻辑。
典型应用场景
MVC适用场景:
需要明确分离输入逻辑(如角色移动、技能释放)和UI逻辑的系统(如设置菜单、任务系统)。
MVVM适用场景:
- 复杂UI系统(如商店、技能树),需动态数据格式化(如“攻击力:100 → 攻击力: 100”)或频繁交互的界面。
注意事项
UE本身不强制使用MVC/MVVM,需开发者自行规范架构。
避免过度设计:小型项目可直接用蓝图逻辑,大型项目推荐结合C++实现模式。
善用UE的UObject和反射系统,简化数据绑定。
通过合理应用MVC/MVVM,可以显著提升UE项目的代码可维护性和团队协作效率。