当前位置: 首页 > news >正文

Unreal View Model结合GAS使用

这个东西真的难用,各种问题,记录下
官方文档
bilibili教学

开启插件

插件开启 Viewmodel:

在这里插入图片描述
build.cs内PublicDependencyModuleNames加上ModelViewViewModel

创建ViewModel类

#pragma once#include "CoreMinimal.h"
#include "MVVMViewModelBase.h"
#include "AttributeViewModel.generated.h"UCLASS(BlueprintType)
class PROJECT2D_API UAttributeViewModel : public UMVVMViewModelBase
{GENERATED_BODY()
public:UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, Getter)float Health;UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, Getter)float MaxHealth;public:float GetHealth() const;void SetHealth(float NewHealth);float GetMaxHealth() const;void SetMaxHealth(float NewMaxHealth);UFUNCTION(BlueprintCallable, FieldNotify)float GetHealthPercent() const;
};
#include "UI/AttributeViewModel.h"float UAttributeViewModel::GetHealth() const
{return Health;
}void UAttributeViewModel::SetHealth(float NewHealth)
{if (UE_MVVM_SET_PROPERTY_VALUE(Health, NewHealth)){UE_MVVM_BROADCAST_FIELD_VALUE_CHANGED(GetHealthPercent);}
}float UAttributeViewModel::GetMaxHealth() const
{return MaxHealth;
}void UAttributeViewModel::SetMaxHealth(float NewMaxHealth)
{if (UE_MVVM_SET_PROPERTY_VALUE(MaxHealth, NewMaxHealth)){UE_MVVM_BROADCAST_FIELD_VALUE_CHANGED(GetHealthPercent);}
}float UAttributeViewModel::GetHealthPercent() const
{return Health / FMath::Max(1, MaxHealth);
}

用角色类管理 ViewModel 实例:(这样子各个UI都可以用这个数据)

UPROPERTY()
class UAttributeViewModel* AttributeViewModel;
UFUNCTION(BlueprintCallable)
class UAttributeViewModel* GetAttributeViewModel();
class UAttributeViewModel* AXXXCharacter::GetAttributeViewModel()
{if (!AttributeViewModel){AttributeViewModel = NewObject<UAttributeViewModel>(this);}return AttributeViewModel;
}

AttributeSet内部存一份ViewModel(记得多端):

void UXXXAttributeSet::Reset()
{if (UAbilitySystemComponent* ASC = GetOwningAbilitySystemComponent()){if (AXXXCharacter* Char = Cast<AXXXCharacter>(ASC->GetOwnerActor())){ViewModel = Char->GetAttributeViewModel();}}
}

在属性集的PostAttributeChange和属性的OnRep函数调用ViewModel的Set函数:

#define XXX_GAMEPLAYATTRIBUTE_REPNOTIFY(ClassName, PropertyName, OldValue) \static FProperty* ThisProperty = FindFieldChecked<FProperty>(ClassName::StaticClass(), GET_MEMBER_NAME_CHECKED(ClassName, PropertyName)); \GetOwningAbilitySystemComponentChecked()->SetBaseAttributeValueFromReplication(FGameplayAttribute(ThisProperty), PropertyName, OldValue); \SyncInfoFromAttribute(Get##PropertyName##Attribute(), Get##PropertyName());#define SYNC_VIEW_MODEL_BEGIN(PropertyName) \if (Attribute == Get##PropertyName##Attribute()) \{ \ViewModel->Set##PropertyName(Value); \}
#define SYNC_VIEW_MODEL(PropertyName) \else if (Attribute == Get##PropertyName##Attribute()) \{ \ViewModel->Set##PropertyName(Value); \}

void UXXXAttributeSet::PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue)
{...SyncInfoFromAttribute(Attribute, NewValue);
}
void UXXXAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth)
{XXX_GAMEPLAYATTRIBUTE_REPNOTIFY(UXXXAttributeSet, Health, OldHealth);
}void UXXXAttributeSetPrimary::SyncInfoFromAttribute(const FGameplayAttribute& Attribute, float Value)
{if (ViewModel){SYNC_VIEW_MODEL_BEGIN(Health)SYNC_VIEW_MODEL(MaxHealth)}
}

这样子在属性修改后,各个端都会调用到ViewModel的Set函数

Widget使用

UserWidget来到Designer界面:
在这里插入图片描述
为当前的Widget创建一个ViewModel:
在这里插入图片描述

在这里插入图片描述
进行数据绑定:
在这里插入图片描述
然后就是根据UProperty进行绑定,这里可以直接绑定到ViewModel的某个带有FieldNotify关键字的UFunction:
在这里插入图片描述
需要在ViewModel的Set函数内部,主动触发回调:

UE_MVVM_BROADCAST_FIELD_VALUE_CHANGED(GetHealthPercent);

Widget寻找ViewModel

Widget的ViewModel有4种方式:

UENUM()
enum class EMVVMBlueprintViewModelContextCreationType : uint8
{Manual,	// The viewmodel will be assigned later.CreateInstance, // A new instance of the viewmodel will be created when the widget is created.GlobalViewModelCollection, // The viewmodel exists and is added to the MVVMSubsystem. It will be fetched there.PropertyPath, // The viewmodel will be fetched by evaluating a function or a property path.
};

在这里插入图片描述

PropertyPath

以Self作为开始点,调用各种UFunction和UProperty链,获取到目标ViewModel,但是在初始化的时候就需要有。

本人用的就是这个。

蓝图定义一个获取ViewModel的函数:
在这里插入图片描述
然后修改ViewModel的View Model Property Path为刚才的函数:
在这里插入图片描述

Manual

人为设置变量:
在这里插入图片描述

CreateInstance

每个Widget都会创建一个,然后别的地方用这个变量去操作

GlobalViewModelCollection

在某个地方创建全局的ViewModel,但是有个麻烦的地方是以字符串作为Key去检索,所以重复性的数据没法弄(例如100个怪的生命值)

相关文章:

Unreal View Model结合GAS使用

这个东西真的难用&#xff0c;各种问题&#xff0c;记录下 官方文档 bilibili教学 开启插件 插件开启 Viewmodel&#xff1a; build.cs内PublicDependencyModuleNames加上ModelViewViewModel 创建ViewModel类 #pragma once#include "CoreMinimal.h" #include &quo…...

Spring-Cloud-Loadblancer详细分析_2

LoadBalancerClients 终于分析到了此注解的作用&#xff0c;它是实现不同服务之间的配置隔离的关键 Configuration(proxyBeanMethods false) Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE }) Documented Import(LoadBalancerClientConfigurationRegistrar…...

uniapp 左右滑动切换页面并切换tab

实现效果如图 要实现底部内部的左右滑动切换带动上方tab栏的切换&#xff0c;并且下方内容要实现纵向滚动 &#xff0c;所以需要swiper&#xff0c;swiper-item,scroll-view组合使用 tab栏部分 <view class"tabs"><view class"tab_item" v-for&…...

FinClip 支持小程序维度域名配置;桌面端体验活动进行中

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…...

已有公司将ChatGPT集成到客服中心以增强用户体验

Ozonetel正在利用ChatGPT来改善客户体验。该公司表示&#xff0c;他们通过使用ChatGPT收集与客户互动过程收集的“语料”能够更有针对性地提高服务效率&#xff0c;提供个性化的用户体验&#xff0c;并实现更高的客户满意度。[1] 通过这套解决方案&#xff0c;客服中心将拥有一…...

108. 将有序数组转换为二叉搜索树

文章目录 题目描述思路解答&#xff08;c&#xff09;结果 题目描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二…...

视频分辨率: UXGA/SVGA/VGA/QVGA/QQVGA

视频分辨率除了常见的720p/2K/4K外, 还有VGA系列的分辨率 相关字段含义: V——Video &#xff08;视频&#xff09; G——Graphics&#xff08;图像&#xff09; A——Array&#xff08;阵列&#xff09; S——Super(超级) X——Extended(扩展) U——Ultra(终极) W——Wide&am…...

Leecode力扣27数组移除元素

题目链接&#xff1a;力扣 最终可运行的代码1&#xff1a;暴力法 class Solution { public:int removeElement(vector<int>& nums, int val) {int index0;int numnums.size();while(index<nums.size()-1){if(nums[index]val){int jindex;num--;while(j<nums.…...

百度云盘发展历程与影响

摘要&#xff1a; 百度云盘作为中国领先的云存储与共享服务提供商&#xff0c;自其创立至今经历了多个阶段的发展与变革。本论文通过对百度云盘的历史回顾与分析&#xff0c;探讨了其在技术、商业模式、用户体验以及对社会的影响等方面的演变。同时&#xff0c;还分析了在竞争激…...

SpringBoot复习:(33)WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter

WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口&#xff0c;重写了一些方法&#xff0c;也就是默认对Spring Mvc进行了一些配置: 该静态类上有个**Import**注解&#xff1a; Import(EnableWebMvcConfiguration.class) 它的父类…...

f1tenth仿真2

起点(0.192,0.201) 终点(9.902,5.148) 起点(9.902,5.148) 终点(-13.289,7.058) 起点(-13.289,7.058) 终点(-13.289,0.201) 起点(-13.289,0.201) #! /usr/bin/env python import time from numba import jit import math import rospy import numpy as…...

exec族函数

本节学习exec族函数&#xff0c;并大量参考了以下链接&#xff1a; linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)_云英的博客-CSDN博客 exec族函数函数的作用 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程…...

dbm与mw转换

功率值10^(dBm值/10)&#xff0c;单位mW。 对于-5dBm&#xff0c;其功率值为0.3162 mW。 dBm 10 * lg(mW&#xff09;...

【Linux】多线程之单例模式

多线程之单例模式 什么是设计模式&#xff0c;都有哪些设计模式单例模式饿汉模式懒汉模式 什么是设计模式&#xff0c;都有哪些设计模式 设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理…...

Vision Transformer模型入门

Vision Transformer模型入门 一、Vision Transformer 模型1&#xff0c;Embedding 层结构详解2&#xff0c;Transformer Encoder 详解3&#xff0c;MLP Head 详解 二、ViT-B/16 网络结构三、Hybrid 模型详解四、ViT 模型搭建参数 一、Vision Transformer 模型 总体三个模块&am…...

如何使用 Go 获取 URL 的参数,以及使用时的问题

Go 获取 URL 参数也很容易&#xff0c;但是由于 Go 有严格的数据类型和错误管理&#xff0c;所以在使用时会些微有些复杂。所以本文不仅会讲如何获取 URL 的参数&#xff0c;也会讲在使用时的一些问题。 首先假设 URL 是https://www.example.com/?keywordabc&id12。 其他…...

Linux驱动-基于QT控制LED灯

Linux驱动-基于QT控制LED灯 环境搭建LED驱动程序基于总线设备模型基于设备树 QT界面编程测试 环境搭建 平台 韦东山100ask imax6ull pro && 大象嵌入式开发板Build Root 使用Build root编译image&#xff0c;具体配置可参考《嵌入式Linux应用开发完全手册-IMX6ULL开发…...

布隆过滤器的原理和应用场景

目录 1 原理 2 代码示例 3 位数组 4 布隆过滤器的实际应用场景 1 原理 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种数据结构&#xff0c;用于快速判断一个元素是否存在于一个集合中&#xff0c;具有高效的插入和查询操作。它的设计目的是在空间效率和查询效率之…...

ElasticSearch学习

一&#xff0c;简介 ES&#xff08;elaticsearch简写&#xff09;&#xff0c; Elasticsearch是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据…...

软件测试基础篇——Redis

Redis Redis数据库的配置与连接 解压redis数据库的安装包&#xff08;建议把解压后的安装包放到磁盘的根目录&#xff0c;方便访问操作&#xff09;打开【命令行窗口】&#xff1a;winR在命令行窗口&#xff0c;进入到redis安装目录中 ​ 格式一&#xff1a;cd /d redis目录…...

Mac用户福音:三步搞定PyMol开源版,告别许可证弹窗(附Homebrew/MacPorts安装指南)

Mac用户福音&#xff1a;三步搞定PyMol开源版&#xff0c;告别许可证弹窗&#xff08;附Homebrew/MacPorts安装指南&#xff09; 作为一名长期使用Mac进行分子可视化研究的科研人员&#xff0c;我深知PyMol在结构生物学领域的重要性。商业版PyMol虽然功能强大&#xff0c;但频繁…...

为什么你的手写笔记在高分辨率屏幕上总是模糊?Xournal++渲染优化终极指南

为什么你的手写笔记在高分辨率屏幕上总是模糊&#xff1f;Xournal渲染优化终极指南 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), ma…...

如何3分钟安装B站评论智能标注工具:开源社区互动助手完整指南

如何3分钟安装B站评论智能标注工具&#xff1a;开源社区互动助手完整指南 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分&#xff0c;支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker …...

如何高效获取网络资源:多平台嗅探与批量下载工具全解析

如何高效获取网络资源&#xff1a;多平台嗅探与批量下载工具全解析 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否曾为…...

Xournal++ 终极指南:如何让手写笔记在高分辨率屏幕上清晰如纸 ✨

Xournal 终极指南&#xff1a;如何让手写笔记在高分辨率屏幕上清晰如纸 ✨ 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and …...

3个场景,让围棋AI分析工具LizzieYzy成为你的专属教练

3个场景&#xff0c;让围棋AI分析工具LizzieYzy成为你的专属教练 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy LizzieYzy是一款功能强大的围棋AI分析工具&#xff0c;它能将复杂的棋局分析转化为…...

保姆级教程:在NRF52840上实现USB虚拟串口,并每秒发送数据到PC和安卓手机

从零构建NRF52840 USB虚拟串口通信系统&#xff1a;跨平台数据收发实战指南 在嵌入式开发中&#xff0c;稳定可靠的通信接口是连接物理设备与数字世界的桥梁。NRF52840作为Nordic Semiconductor旗舰级蓝牙SoC&#xff0c;其内置的USB 2.0全速控制器为开发者提供了除蓝牙之外的…...

Ostrakon-VL-8B嵌入式设备部署展望:轻量化与边缘计算

Ostrakon-VL-8B嵌入式设备部署展望&#xff1a;轻量化与边缘计算 最近和几个做嵌入式开发的朋友聊天&#xff0c;大家不约而同地提到了同一个问题&#xff1a;现在的大模型能力是强&#xff0c;但动辄几十上百亿的参数&#xff0c;怎么才能塞进资源有限的边缘设备里&#xff1…...

零基础入门AIVideo:输入主题,全自动输出专业长视频,手把手教学

零基础入门AIVideo&#xff1a;输入主题&#xff0c;全自动输出专业长视频&#xff0c;手把手教学 1. 为什么你需要这个AI视频工具 想象一下这样的场景&#xff1a;你有一个绝妙的视频创意&#xff0c;但既不会剪辑也没有专业设备&#xff0c;甚至连脚本都不知道怎么写。传统…...

Linux内核里那个神秘的`__pci_read_base`函数,到底是怎么算出PCIe设备BAR大小的?

Linux内核中__pci_read_base函数的BAR大小计算机制深度解析 在嵌入式Linux开发领域&#xff0c;PCIe设备的资源分配一直是驱动开发者必须掌握的底层技能。当我们面对一个PCIe设备驱动调试场景时&#xff0c;经常会遇到这样的困惑&#xff1a;内核是如何准确计算出每个BAR&#…...