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

UE 5 GAS 在项目中处理AttributeSet相关

这一篇文章是个人的实战经验记录,如果对基础性的内容不了解的,可以看我前面一篇文章对基础的概念以及内容的讲解。

设置AttributeSet

使用GAS之前,首先需要设置参数集AS,这个是用于同步的一些参数,至于如何设置GAS,我之前的文章里面有讲,这里不赘述。
每个Attribute其实包含两个值 Base Value和Current Value。Base Value是在GE里面Instant设置属性时被修改的值,而Current Value是在GE的Infinite(永久修改)和Has Duration(具有时效性修改)时修改的,目的就是为了时效失效以后,能够将值的结果修改回去。当然获取值时都是获取的Current Value,如果没有时效性的影响,Base Value和Current Value值也是相等的。
AS里面主要还是为了创建一些值,并且由ASC调用GE去修改里面的值,但是这个类只能在C++里面去定义。
在这里插入图片描述
上面是我在AS里面定义的两个生命相关的值,以及覆盖的两个函数回调。
在这里插入图片描述
PreAttributeChange 主要是为了触发一个值的最大值被修改后,它的值也会按比例进行修改
在这里插入图片描述
AdjustAttributeForMaxChange 就是为了实现这个效果的函数,这个也是从ActionRPG的项目里面抄过来的。
在这里插入图片描述
PostGameplayEffectExecute 就是Base Value改变后触发的,我们可以在这个函数里面比如限制血量不会超过最大血量的值,也不会小于0的情况。

初始化Attribute

创建好了AS,接着要在角色身上使用并且初始化AS里面一些值,这里有三种方法:

  1. 第一种方法也不算方法,其实就是在AS类里面给它设置默认值
    在这里插入图片描述
    这是设置以后也算是初始化了相关属性的一些值。
    在这里插入图片描述
    我们还需要在OwnerActor里面进行初始化,需要在实例化ASC后面创建即可。这样我们就可以在ASC中去获取AS的值了。

  2. 第二种方法当然就是官方推荐的使用GE去初始化
    在这里插入图片描述
    创建一个GE,然后Duration Policy设置为Instant(直接修改Base Value),然后设置好需要修改的Attribute,Modifier Op设置为Override(覆盖),然后在下面的设置固定数值,就可以实现重新设置,只需要设置每个就可以实现覆盖。
    在这里插入图片描述
    这里有个小细节,就是初始化时,推荐先修改最大值,然后再修改默认值,因为在C++里面,我们有个按比例进行修改默认值的,如果你先修改Health然后再修改MaxHealth,它会按比例放大的,然后再直接获取值会出现问题,所以我先设置的最大值,然后再设置就没这样的问题了。
    在这里插入图片描述
    设置完成以后,使用ApplyGameplayEffectToSelf节点,去设置即可。

  3. 使用DataTable设置默认值
    在这里插入图片描述
    这个需要开启在蓝图内读写ASC
    在这里插入图片描述
    然后ASC细节里面会有一项AttributeTest,里面可以创建多个数组,代表可以初始化多个AS。Attributes选择AS的类,DefaultStartingTable则是选择创建的DataTable。
    在这里插入图片描述
    创建DataTable的时候,需要选择AttributeMetaData
    在这里插入图片描述
    行命名,要和在GE里面设置的命名保持一致,设置值时,就BaseValue有用,其它值估计是为了以后版本更新时使用,现在还没啥用。

获取AttributeSet的数据

在这里插入图片描述
可以从ASC去获取属性的Base Value
在这里插入图片描述
可以从ASC中获取Current Value

我们还可以通过扩展c++接口来实现获取
在这里插入图片描述
比如在它的OwnerActor类里面增加获取属性的方法,其实就是返回AttributeSet的相关属性

还有一种就是使用AbilityTask实现监听接口,需要创建C++类来实现,这里我也是直接从官方文档案例里面扒的,把代码列出来。

AT_AttributeChanged.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "AbilitySystemComponent.h"
#include "AT_AttributeChanged.generated.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnAttributeChanged, FGameplayAttribute, Attribute, float, NewValue, float, OldValue);/*** Blueprint node to automatically register a listener for all attribute changes in an AbilitySystemComponent.* Useful to use in UI.*/
UCLASS(BlueprintType, meta = (ExposedAsyncProxy = AsyncTask))
class SURVIVALALONE_API UAT_AttributeChanged : public UBlueprintAsyncActionBase
{GENERATED_BODY()public:UPROPERTY(BlueprintAssignable)FOnAttributeChanged OnAttributeChanged;// Listens for an attribute changing.UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))static UAT_AttributeChanged* ListenForAttributeChange(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAttribute Attribute);// Listens for an attribute changing.// Version that takes in an array of Attributes. Check the Attribute output for which Attribute changed.UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))static UAT_AttributeChanged* ListenForAttributesChange(UAbilitySystemComponent* AbilitySystemComponent, TArray<FGameplayAttribute> Attributes);// You must call this function manually when you want the AsyncTask to end.// For UMG Widgets, you would call it in the Widget's Destruct event.UFUNCTION(BlueprintCallable)void EndTask();protected:UPROPERTY()UAbilitySystemComponent* ASC;FGameplayAttribute AttributeToListenFor;TArray<FGameplayAttribute> AttributesToListenFor;void AttributeChanged(const FOnAttributeChangeData& Data);
};

AT_AttributeChanged.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "AT_AttributeChanged.h"UAT_AttributeChanged *UAT_AttributeChanged::ListenForAttributeChange(UAbilitySystemComponent *AbilitySystemComponent, FGameplayAttribute Attribute)
{UAT_AttributeChanged *WaitForAttributeChangedTask = NewObject<UAT_AttributeChanged>();WaitForAttributeChangedTask->ASC = AbilitySystemComponent;WaitForAttributeChangedTask->AttributeToListenFor = Attribute;if (!IsValid(AbilitySystemComponent) || !Attribute.IsValid()){WaitForAttributeChangedTask->RemoveFromRoot();return nullptr;}AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attribute).AddUObject(WaitForAttributeChangedTask, &UAT_AttributeChanged::AttributeChanged);return WaitForAttributeChangedTask;
}UAT_AttributeChanged *UAT_AttributeChanged::ListenForAttributesChange(UAbilitySystemComponent *AbilitySystemComponent, TArray<FGameplayAttribute> Attributes)
{UAT_AttributeChanged *WaitForAttributeChangedTask = NewObject<UAT_AttributeChanged>();WaitForAttributeChangedTask->ASC = AbilitySystemComponent;WaitForAttributeChangedTask->AttributesToListenFor = Attributes;if (!IsValid(AbilitySystemComponent) || Attributes.Num() < 1){WaitForAttributeChangedTask->RemoveFromRoot();return nullptr;}for (FGameplayAttribute Attribute : Attributes){AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attribute).AddUObject(WaitForAttributeChangedTask, &UAT_AttributeChanged::AttributeChanged);}return WaitForAttributeChangedTask;
}void UAT_AttributeChanged::EndTask()
{if (IsValid(ASC)){ASC->GetGameplayAttributeValueChangeDelegate(AttributeToListenFor).RemoveAll(this);for (FGameplayAttribute Attribute : AttributesToListenFor){ASC->GetGameplayAttributeValueChangeDelegate(Attribute).RemoveAll(this);}}SetReadyToDestroy();MarkAsGarbage();
}void UAT_AttributeChanged::AttributeChanged(const FOnAttributeChangeData &Data)
{OnAttributeChanged.Broadcast(Data.Attribute, Data.NewValue, Data.OldValue);
}

类实现了以后,我们可以使用里面的两个方法:
在这里插入图片描述
Listen for Attribute Change 可以监听一个属性的变动,返回了当前监听实例,以及变动后的回调,还有之前的值,变化后的值,如果值发生改变,就会触发OnAttributeChanged执行,只需要后面执行,每次数值改变,都会触发执行。
在这里插入图片描述
Listen for Attribute Change可以传入一个数组,获取多个属性的变动然后可以通过Attribute返回值判断是哪个属性
在这里插入图片描述
取消监听,那么记得调用End Task,一般在UI里面使用,可以在创建UI的时候绑定,然后把绑定的Task设置为变量,销毁的时候End Task即可。

设置AttributeSet的值

在GAS系统中,修改AttributeSet的值,需要使用GE去实现
在这里插入图片描述
前面在初始化的时候,也讲了相应的配置。如果上面的值是Instant,那么这个GE被调用的时候,血量的值会瞬间掉1点。

接下来,介绍几个会在项目中使用到的场景。

持续掉血,每秒掉多少血量

在这里插入图片描述
使用Has Duration,下面设置持续时间,在Period设置每过多少秒触发一次,Execute Periodic Effect on Application 意思为添加时是否触发一次。
在这里插入图片描述
最简单的就是调用一下就行了,一般这个需要在GA里面去触发的,这一篇不包括GA相关。

根据等级设置血量加成

先创建一个CSV,可以先创建Excel文件,转csv
在这里插入图片描述
设置好文件以后
在这里插入图片描述
创建一个曲线表格
在这里插入图片描述
选择上面导入键,可以将csv文件导入,Row是作为值的名称,使用时需要选择哪个Row,而数字则代表当前的技能等级。
在这里插入图片描述
这里因为是加成,所以,运算修改为相乘,而ScalableFloatMagnitude的数值是从曲线表格里面获取到的值和此值相乘为最终的值。这个值再与现在的MaxHealth相乘得到了变化后的值。
后面设置了曲线表格,然后选择Row,然后就可以预览相应的值,这个预览的值是在将GE附加到ASC上面的时候设置。
在这里插入图片描述
在附加的时候,我们可以设置Level等级,就是曲线表格里面的那个数值。

相关文章:

UE 5 GAS 在项目中处理AttributeSet相关

这一篇文章是个人的实战经验记录&#xff0c;如果对基础性的内容不了解的&#xff0c;可以看我前面一篇文章对基础的概念以及内容的讲解。 设置AttributeSet 使用GAS之前&#xff0c;首先需要设置参数集AS&#xff0c;这个是用于同步的一些参数&#xff0c;至于如何设置GAS&a…...

JDBC数据库连接

目录 引言 一&#xff0c;基本概念 二&#xff0c;常用操作步骤 三&#xff0c;连接操作 引言 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API&#xff0c;可以为多种 关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口…...

gitee分支合并

合并dev分支到master&#xff08;合并到主分支&#xff09; git checkout master git merge dev //这里的dev表示你的分支名称 git push //推送到远程仓库 效果如下图 不报错就表示推送成功了&#xff0c;希望能帮助各位小伙伴...

Python小白入门:文件、异常处理和json格式存储数据

这里写自定义目录标题 所用资料 一、从文件中读取数据1.1 读取整个文件1.2 文件路径1.3 逐行读取1.4 创建一个包含文件各行内容的列表1.5 使用文件的内容1.6 包含一百万位的大型文件1.7 圆周率值中包含你的生日吗练习题 二、写入文件2.1 写入空文件2.2 写入多行2.3 附加到文件练…...

16bit、8 通道、500kSPS、 SAR 型 ADC——MS5188N

MS5188N 是 8 通道、 16bit 、电荷再分配逐次逼近型模数 转换器&#xff0c;采用单电源供电。 MS5188N 拥有多通道、低功耗数据采集系统所需的所有 组成部分&#xff0c;包括&#xff1a;无失码的真 16 位 SAR ADC &#xff1b;用于将输入配 置为单端输入&#xff0…...

Chapter 12: Regular expressions | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Regular ExpressionsRegular ExpressionsCharacter matching in regular expressionsExtracting data using regular expressionsCombining searching and extractingEscape characterSummaryBonus section for Unix / Linux usersDebugg…...

Android javaMail mergeDebugJavaResource FAILED解决

Java mail 引入这两个jar之后 implementation com.sun.mail:android-mail:1.6.7implementation com.sun.mail:android-activation:1.6.7build直接报错 > Task :app:mergeDebugJavaResource FAILED Execution failed for task :app:mergeDebugJavaResource. > A failure o…...

【ArcGIS Pro二次开发】(57):地图系列

在ArcGIS Pro中&#xff0c;有一个地图系列&#xff0c;可以在一个布局中导出多个地图。 在SDK中为ArcGIS.Desktop.layout.MapSeries类和映射系列导出选项&#xff0c;可以以支持多页导出。 MapSeries类提供了一个静态CreateSpatialMapSeries方法&#xff0c;该方法使用指定的…...

秋招打卡015(20230811)

文章目录 前言一、今天学习了什么&#xff1f;二、动态规划之股票问题1、总结2、题目 三、SQL总结 前言 提示&#xff1a;这里为每天自己的学习内容心情总结&#xff1b; Learn By Doing&#xff0c;Now or Never&#xff0c;Writing is organized thinking. 提示&#xff1a…...

如何使用Word转PDF转换器在线工具?在线Word转PDF使用方法

Word转PDF转换器在线&#xff0c;是一种方便快捷的工具&#xff0c;可帮助您在不需要下载任何软件的情况下完成此任务。无论您是需要在工作中共享文档&#xff0c;还是将文件以PDF格式保存以确保格式不变&#xff0c;都可以依靠这款在线工具轻松完成转换。那么如何使用Word转PD…...

自然语言处理从入门到应用——LangChain:记忆(Memory)-[记忆的类型Ⅰ]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 会话缓存记忆ConversationBufferMemory 本节将介绍如何使用对话缓存记忆ConversationBufferMemory。这种记忆方式允许存储消息&#xff0c;并将消息提取到一个变量中&#xff0c;我们首先将其提取为字符串&#xff1a…...

Camunda 7.x 系列【7】Spring Boot 集成 Camunda 7.19

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…...

24华东交通软件工程837考研题库

1&#xff0e;Jackson设计方法是由英国的M&#xff0e;Jackson所提出的。它是一种面向( )的软件设 计方法。 A&#xff0e;对象 B&#xff0e;数据流 C&#xff0e;数据结构 D&#xff0e;控制结构 答案:C 2&#xff0e;软件设计中&#xff0c;Jackson方法是一种面向…...

nginx 以及nginx优化

目录 nginx功能介绍 静态文件服务 反向代理 动态内容处理 SSL/TLS 加密支持 虚拟主机支持 URL 重写和重定向 缓存机制 日志记录 可扩展性和灵活性 nginx的主要应用场景 nginx常用命令 nginx另外一种安装方式 nginx常用的信号符&#xff1a; nginx配置文件详解 n…...

cesium学习记录04-坐标系

一、地理坐标系和投影坐标系的关系 地理坐标系 (Geographic Coordinate System, GCS) 定义&#xff1a;地理坐标系是一个基于三维地球表面的坐标系统。它使用经度和纬度来表示地点的位置。 特点&#xff1a; 使用经纬度来定义位置。 基于特定的地球参考椭球体。 适用于全球范…...

P5737 【深基7.例3】闰年展示

题目描述 输入 x , y x,y x,y&#xff0c;输出 [ x , y ] [x,y] [x,y] 区间中闰年个数&#xff0c;并在下一行输出所有闰年年份数字&#xff0c;使用空格隔开。 输入格式 输入两个正整数 x , y x,y x,y&#xff0c;以空格隔开。 输出格式 第一行输出一个正整数&#xf…...

Nacos的安装使用教程Linux

在 Linux 操作系统上安装和使用 Nacos 与 Windows 类似&#xff0c;以下是详细的步骤教程。我们将使用 Nacos 的 Standalone 模式进行安装和使用。请注意&#xff0c;对于生产环境&#xff0c;建议使用集群模式来实现高可用性和可扩展性。 步骤 1&#xff1a;准备环境 Java 安…...

数据结构-学习

参考&#xff1a; 数据结构-学习笔记_蓝净云_蓝净云的博客-CSDN博客...

【MFC】05.MFC六大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单&#xff0c;但是对于我们逆向人员来说&#xff0c;如果想要逆向MFC程序&#xff0c;那么我们就必须了解它背后的机制&#xff0c;这样我们才能够清晰地逆向出MFC程序&#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制&#xff1a;程序启动机…...

Von Maur, Inc EDI 需求分析

Von Maur, Inc 是一家历史悠久的卖场&#xff0c;成立于19世纪&#xff0c;总部位于美国。作为一家知名的零售商&#xff0c;Von Maur 主要经营高端时装、家居用品和美妆产品。其使命是为顾客提供优质的产品和无与伦比的购物体验。多年来&#xff0c;Von Maur 凭借其卓越的服务…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

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

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

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...