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


感谢阅读,欢迎点赞、关注、收藏,有问题可在评论区交流。
如果本文对你有帮助,点击这里捐赠支持作者。

posted @ 2025-11-05 10:19  mengzhishanghun  阅读(23)  评论(0)    收藏  举报