当前位置: 首页 > 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目录…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...