diff --git a/03-UnrealEngine/UI/UE5 MVVM 笔记.md b/03-UnrealEngine/UI/UE5 MVVM 笔记.md index 4ed3866..88ee05f 100644 --- a/03-UnrealEngine/UI/UE5 MVVM 笔记.md +++ b/03-UnrealEngine/UI/UE5 MVVM 笔记.md @@ -8,6 +8,7 @@ rating: ⭐ # 前言 - 知乎文章 - [UE5.6新功能MVVM使用方式(从笔记里迁移)](https://zhuanlan.zhihu.com/p/1918763422243325641) + - - # Example @@ -83,4 +84,84 @@ public: return 0; } }; -``` \ No newline at end of file +``` + + +# MVVM +ViewModels管理器位于:Window -> ViewModels。 + +大致操作步骤: +1. 在该界面中创建ViewModels。 +2. 选择ViewModels并且添加动态绑定的变量。 +3. 修改CreationType(有4种类型)。 + +## MVVM CreationType +### Create Instance (一对一) +自动为控件的每个唯一实例创建一个新的Viewmodel实例。这意味着,如果你在视口中有同一控件的数个副本,并且你更改了其中一个副本的Viewmodel变量,则只有该控件会更新,所有其他副本将保持不变。同理,如果你创建多个使用同一Viewmodel的不同控件,这些控件都不会感知到彼此信息的变化。 + +**UE只会在ViewModel为空时创建新实例,ViewModel会在PreConstruct和Construct事件之间创建。** + +### Manual(看设计,可以一对多) +自行创建ViewModel实例进行手动指定赋值,在赋值之前,Widget中的ViewModel一直都是空的。 + +### Global View Model Collection (全局共享) +[MVVMGameSubsystem](https://zhida.zhihu.com/search?content_id=259254754&content_type=Article&match_order=1&q=MVVMGameSubsystem&zhida_source=entity)中维护了一个全局访问的ViewModel列表,可以通过任意GameInstance访问。 + +Note:这里注意,AddViewModel必须提供ContextName,UE要求此名称必须和ViewMode的类名一致。 +原因:MVVM中维护数据使用的是TArray,内存连续,可以通过索引快速查询。 + +数据结构: +```text +{ + // 类型 + TSubclassOf ContextClass; + // 上下文信息,UE要求和类名一致 + FName ContextName; +} +``` + +### Property Path +类似如下写法:(加粗的self是默认的,不需要手动写,和函数默认的This类似) + +**Self.**GetPlayerController.Vehicle.ViewModel + +这个指定方式是说,通过当前的Widget获取PC,通过PC拿到载具上的ViewModel信息。 + + +## 使用方法 +1. 从MVVM界面中直接退拽进UMG编辑器。 +2. Detail面板Binding。 +3. 使用ViweBinding(Window→ViewBindings) + +![[UMG_MVVM_ViewBindings.jpg|800]]绑定方向 +OneTimeToWidget(←1):VM到控件,执行一次。 +OneWayToWidget: VM到V,每次刷新都会通知 +OneWayToViewModel :V到VM, 每次通知到VM,典型案例:编辑文本或图形选项,按钮需要自己包裹一下(**研究下给个合理方式**) +TwoWay:绑定在两个方向都可用,可以相互通知,不用担心陷入死循环,MVVMModelBase中的SetFunc,已经做好了处理,只有值不等才会Boradcast + +### Conversion Function +何时使用? +如图:我想要在Text文本中显示我最大血量,最大血量是integer,如果直接绑定,compile时会有报错无法编译,此时就需要有转换函数出现了,通过转化函数将Integer转化为可用的FText +![[UMG_MVVM_ViewBindings_ConversionFunction.jpg|800]] + +如何自定义转化函数: +如果我们是自己的某个接口,或者一个特殊的类型要有额外操作怎么处理,这个时候就需要自定义转化函数。 +新的转换函数可以全局添加或在UserWidget(控件蓝图)上添加。函数不能是事件或网络,也不能弃用或仅限编辑器。函数需要对蓝图可见,有一个输入参数和一个返回值。如果在全局定义,函数还需要带有static关键字。如果在UserWidget中定义,函数还需要带有pure和const关键字。 +一个在蓝图中转化的示例: +![[UMG_MVVM_ViewBindings_ConversionFunction_Custom.jpg|800]]![[UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction.jpg|800]] +![[UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction_Settings.jpg|800]]**Note:当前版本如果在Bindings赋值,然后再Deatails再次赋值,这样会出问题,绑定会失效,解决办法:从Bindings中删掉原来的绑定,重新赋值,(基于此原因,个人建议关掉DeatailsBind的入口)** + +### 禁用旧版绑定 +旧版的Bind并不是监听事件,而是通过Tick刷新。 +新版确实是通过蓝图可用的多播委托去通知。 +为了防止两种方式混用(**我们也不允许使用旧版方式绑定,性能洼地**),需要禁用旧版绑定。 + +#### DiablePropertBinding +![[UMG_DisablePropertBinding.jpg|800]] +开启上选项后将禁用传统属性绑定到Widget的选项,可以看到如图效果,BindList中只有ViewModel选项。 +![[UMG_DisablePropertBinding_Result.jpg]] + +#### ViewModel禁用DetailsBind +![[UMG_MVVM_DisableDetailsBinding.jpg|800]] + +![[UMG_MVVM_DisableDetailsBinding_Result.jpg]] diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_DisablePropertBinding.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_DisablePropertBinding.jpg new file mode 100644 index 0000000..a389dcb --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_DisablePropertBinding.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3529c39e15c97cd73298daec2ef860b094841768293349ffbb13d541ca13155a +size 142045 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_DisablePropertBinding_Result.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_DisablePropertBinding_Result.jpg new file mode 100644 index 0000000..c18b99a --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_DisablePropertBinding_Result.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca0f4cf897397225348db98db183a71e0afc08fad67c8f74369c8e135930aff2 +size 12695 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_DisableDetailsBinding.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_DisableDetailsBinding.jpg new file mode 100644 index 0000000..86f321c --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_DisableDetailsBinding.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49ab3cdcb4f72d4f6bd0f48c6bc459119e4ea7985d842f1ec00c953b01b9356b +size 101947 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_DisableDetailsBinding_Result.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_DisableDetailsBinding_Result.jpg new file mode 100644 index 0000000..f12f494 --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_DisableDetailsBinding_Result.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75c74e9b6ec11996d932c71733116931c6f3f6a6fe4785165405f7bad9bd64af +size 14623 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings.jpg new file mode 100644 index 0000000..4e7c4b0 --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67c954c953caf5b5ff9386255b2e09bef93ea7fb726738205216367c77daf131 +size 84388 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction.jpg new file mode 100644 index 0000000..ead00d1 --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcd5beb8e6a4f3794378249c4cbc92291efa5edb68fc5922108b2f3d155b0060 +size 107925 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_Custom.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_Custom.jpg new file mode 100644 index 0000000..9549b16 --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_Custom.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8639ad79343d50ac492074193f22f457107d074a83b3e90c127d8c717eff2f92 +size 61449 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction.jpg new file mode 100644 index 0000000..5ed0d7c --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0da2373ee4bf6637b8b1e03ee7a1a40c2e9d0a1a114948cfa534062816ed0b35 +size 95734 diff --git a/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction_Settings.jpg b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction_Settings.jpg new file mode 100644 index 0000000..0b93cbd --- /dev/null +++ b/08-Assets/Images/ImageBag/UMG/MVVM/UMG_MVVM_ViewBindings_ConversionFunction_CustomFunction_Settings.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0bd59a7f4d3e2fbb2ed2d286e1929710c2b93aa842ed8a771ad239c1414224d +size 61691