UE:C++MVVM简单应用
© mengzhishanghun · 原创文章
首发于 博客园 · 禁止未经授权转载
本文介绍如何在C++中建立简单可用的MVVM对象,以下操作在UE5.5中测试
插件模块声明
要想在C++中使用MVVM,需要先声明使用插件
"Plugins": [
{
"Name": "ModelViewViewModel",
"Enabled": true
}
]
随后在build.cs中声明,使用模块ModelViewViewModel
类定义
UCLASS(BlueprintType)
class PHONESIMULATOR_API UPhoneHomeViewModel : public UMVVMViewModelBase
{
GENERATED_BODY()
}
定义属性
protected属性
在protected中定义与在public中定义一样
protected:
/** 当前时间文本 */
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, Getter)
FText CurrentTime;
private属性
private中定义的属性注意需要添加meta=(AllowPrivateAccess="true")
private:
/** 运营商名称 */
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, Getter, meta=(AllowPrivateAccess="true"))
FText CarrierName;
Getter函数实现
Getter函数是Get+属性名的形式,或者可以通过Getter=函数名来自定义函数,注意不需要UFUNCTION标记
public:
/** 获取当前时间文本(格式:HH:MM) */
FText GetCurrentTime() const { return CurrentTime; }
/** 获取运营商名称 */
FText GetCarrierName() const { return CarrierName; }
Setter 函数实现
Setter函数是Set+属性名的形式,或者可以通过Setter=函数名来自定义函数,注意不需要UFUNCTION标记
public:
/** 设置当前时间 */
void SetCurrentTime(const FText& NewTime);
/** 设置运营商名称 */
void SetCarrierName(const FText& NewName);
与Get不同的是,set实现需要手动触发通知宏
void UPhoneHomeViewModel::SetCurrentTime(const FText& NewTime)
{
if (UE_MVVM_SET_PROPERTY_VALUE(CurrentTime, NewTime))
{
UE_LOG(LogTemp, Log, TEXT("[PhoneHomeViewModel] 时间已更新: %s"), *NewTime.ToString());
}
}
void UPhoneHomeViewModel::SetCarrierName(const FText& NewName)
{
if (UE_MVVM_SET_PROPERTY_VALUE(CarrierName, NewName))
{
UE_LOG(LogTemp, Log, TEXT("[PhoneHomeViewModel] 运营商已更新: %s"), *NewName.ToString());
}
}
蓝图绑定
设置模型

进行绑定

手动创建ViewMode并激活
蓝图

C++
void AMyHUD::BeginPlay()
{
Super::BeginPlay();
// 1. 创建ViewModel
PhoneHomeVM = NewObject<UPhoneHomeViewModel>(this);
// 2. 初始化数据
PhoneHomeVM->SetCarrierName(FText::FromString("中国移动"));
PhoneHomeVM->SetBatteryLevel(85);
PhoneHomeVM->SetCurrentTime(FText::FromString("12:00"));
// 3. 创建Widget
UUserWidget* PhoneWidget = CreateWidget<UUserWidget>(GetWorld(), PhoneWidgetClass);
// 4. 设置ViewModel(关键)
if (PhoneWidget)
{
UMVVMSubsystem* MVVMSubsystem = GEngine->GetEngineSubsystem<UMVVMSubsystem>();
if (MVVMSubsystem)
{
// 方法A:通过View获取并设置
if (UMVVMView* View = MVVMSubsystem->GetViewFromUserWidget(PhoneWidget))
{
View->SetViewModel(FName("PhoneHomeViewModel"), PhoneHomeVM);
}
}
PhoneWidget->AddToViewport();
}
}
效果展示

参考文档
适用于虚幻引擎的UMG Viewmodel | 虚幻引擎 5.6 文档 | Epic Developer Community
感谢阅读,欢迎点赞、关注、收藏,有问题可在评论区交流。
如果本文对你有帮助,点击这里捐赠支持作者。

浙公网安备 33010602011771号