Gameplay Ability System(通过GameplayEffect里的Execution修改角色属性)

news2024/9/25 17:18:44

一、关于GameplayEffectExecutionCalculation类

1、查看GameplayEffectExecutionCalculation类的Execute函数

在这里插入图片描述
这个函数将编辑器里设置的参数传进来,然后通过计算再返回出去,这个函数被标记为BlueprintNativeEvent,所以我们可以在自己的类PlayerEffectExecutionCalculation里实现Execute_Implementation函数来计算属性。

2、查看GameplayEffectExecutionCalculation类的帮助宏

在这里插入图片描述
DECLARE_ATTRIBUTE_CAPTUREDEF:帮助我们声明要修改的属性指针和捕获的属性变量,例如传入的P是Attack时,使用该宏就有FProperty* AttackProperty指针和FGameplayEffectAttributeCaptureDefinition AttackDef对象
DEFINE_ATTRIBUTE_CAPTUREDEF:帮助我们初始化上面的变量,其中
S:表示属性所属的类
P:表示属性名
T:有Source(当前类的自身属性)和Target(其他类的属性)
B:bool变量,表示是快照还是时拿时取

二、修改C++类BaseAttributeSet,新增攻击力、护甲值等属性

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BaseAttributeSet")
	FGameplayAttributeData Attack;//攻击力

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BaseAttributeSet")
	FGameplayAttributeData Armor;//护甲值

三、创建C++类继承自GameplayEffectExecutionCalculation,命名为PlayerEffectExecutionCalculation

1、PlayerEffectExecutionCalculation.h

#pragma once

#include "CoreMinimal.h"
#include "GameplayEffectExecutionCalculation.h"
#include "PlayerEffectExecutionCalculation.generated.h"

/**
 * 
 */
UCLASS()
class GASINTRO_API UPlayerEffectExecutionCalculation : public UGameplayEffectExecutionCalculation
{
	GENERATED_BODY()

public:
	UPlayerEffectExecutionCalculation();

	//宏声明
	DECLARE_ATTRIBUTE_CAPTUREDEF(Attack)

	DECLARE_ATTRIBUTE_CAPTUREDEF(Armor)

	DECLARE_ATTRIBUTE_CAPTUREDEF(Health)

	void Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams, FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const;
	
};

注意:
在头文件里使用父类的宏DECLARE_ATTRIBUTE_CAPTUREDEF来声明要修改的属性
并且声明了Execute_Implementation函数,父类里的Execute会执行这里的C++代码

2、PlayerEffectExecutionCalculation.cpp

#include "PlayerEffectExecutionCalculation.h"
#include "BaseAttributeSet.h"

UPlayerEffectExecutionCalculation::UPlayerEffectExecutionCalculation()
{
	//宏定义
	DEFINE_ATTRIBUTE_CAPTUREDEF(UBaseAttributeSet, Attack, Target, true)
	DEFINE_ATTRIBUTE_CAPTUREDEF(UBaseAttributeSet, Armor, Target, true)
	DEFINE_ATTRIBUTE_CAPTUREDEF(UBaseAttributeSet, Health, Target, true)
	//添加到捕获列表
	RelevantAttributesToCapture.Add(AttackDef);
	RelevantAttributesToCapture.Add(ArmorDef);
	RelevantAttributesToCapture.Add(HealthDef);
}

void UPlayerEffectExecutionCalculation::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams, FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
	//计算捕获的属性
	float AttackMagnitude, ArmorMagnitude = 0.0f;
	ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(AttackDef, FAggregatorEvaluateParameters(), AttackMagnitude);
	ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(ArmorDef, FAggregatorEvaluateParameters(), ArmorMagnitude);
	//计算最终伤害
	float FinalDamage = FMath::Clamp(AttackMagnitude - ArmorMagnitude, 0.0f, AttackMagnitude - ArmorMagnitude);

	OutExecutionOutput.AddOutputModifier(FGameplayModifierEvaluatedData(HealthProperty, EGameplayModOp::Additive, -FinalDamage));
}

注意:
首先,cpp文件在构造函数中使用宏DEFINE_ATTRIBUTE_CAPTUREDEF来初始化要修改的属性
因为我们要修改的属性属于UBaseAttributeSet而非当前类自身,所以得传Target

其次,将AttackDef等属性添加到捕获列表RelevantAttributesToCapture中,这里的AttackDef就是头文件中的宏定义帮我们声明好的。

然后,在Execute_Implementation里实现具体的计算方法,其中的AttemptCalculateCapturedAttributeMagnitude方法如下:
在这里插入图片描述
第一个参数传入捕获的属性AttackDef
第二个参数是FAggregatorEvaluateParameters类型,一般是用作BUFF计算或者其他更复杂的计算,我们暂时没有用到,所以传个默认值就行
第三个参数是计算后的输出值

最后,通过AddOutputModifier输出计算结果,计算结果要封装成FGameplayModifierEvaluatedData类型,例如FGameplayModifierEvaluatedData(HealthProperty, EGameplayModOp::Additive, -FinalDamage)就表示:修改生命值属性,计算方式为加法,加上一个负的最终伤害值

三、在UE中配置上面自定义的GameplayEffectExecution

1、打开GE_MeleeAttack_Damage进行如下修改

在这里插入图片描述
可以发现,之前的文章里使用的是Modifiers来修改角色生命值属性,这次我们改用Executions来算上角色的护甲,并覆盖了角色的生命值。

2、别忘了添加Tag
在这里插入图片描述
至此,就完成了角色攻击敌人时,敌人会扣掉(角色攻击力-角色护甲)的血量。
PS:实际上应该用角色攻击-敌人护甲,这里为了方便测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python怎么去除换行符

在Python的编写过程中,获取到的字符串进场存在不明原因的换行和空格,如何整合成一个单句,成为问题。 方法: 一、去除空格 “ ”代表的为空格 "xyz".strip() # returns "xyz" "xyz".ls…

ES6 class小挑战

// 编码挑战 #2 /* 重新创建挑战 1,但这次使用 ES6 类; a. 添加一个名为 “speedUS ”的获取器,返回当前速度(单位:mi/h)(除以 1.6); 3. a. 添加一个名为 “speedUS ”…

RM遥控键鼠控制总结

硬件&通信介绍 RM比赛中各个参赛队伍使用的都是大疆官方提供的遥控器套装,包括遥控器和接收机,接收机上共三个引脚:VCC,GND,DBUS(数据通道),首次使用需要进行遥控器和接收机配对…

Bootstrap 滚动监听(Scrollspy)插件

滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标。其基本的实现是随着您的滚动,基于滚动条的位置向导航栏添加 .active class。 如果您想要单独引用该插件的功能,那…

快团团团长如何高质量选品?如何做最懂顾客的团长!

精准的用户画像,能够帮助团长个性化推荐,精细化营销,提升消费粘性,秒提下单率。 数据中心 用户画像 用户画像的核心,是为用户打标签。 将用户的每个具体信息抽象成标签,利用这些标签将用户具体化&#…

Docker数据卷使用手册

目录 目标 前言 概念 官方文档 匿名卷(Anonymous Volumes) 简介 案例 命名卷(Named Volumes) 简介 案例 目标 掌握Volume命令通过演示案例,理解数据卷种类与各自的用途。 前言 我们在很多网上教程上可以看到…

位数问题c++

题目描述 在所有的N位数中,有多少个数中有偶数个数字3,由于结果可能很大,你只需要输出这个答案对12345取余的值。 输入 读入一个数N(N≤1000) 输出 输出有多少个数中有偶数个数字3。 样例输入 2 样例输出 73样例解释: 1…

【SpringCloud Alibaba】(八)学习 Sentinel 核心技术与配置规则(下)

目录 1. 热点规则1.1 演示热点规则1.2 演示热点高级选项规则 2. 授权规则2.1 演示授权规则 3. 系统规则3.1 演示系统规则 4. SentinelResource 注解4.1 SentinelResource 注解概述4.2 演示 SentinelResource 注解4.2.1 定义限流和降级后的处理方法4.2.2 在外部类中指定限流和异…

Python酷库之旅-第三方库Pandas(098)

目录 一、用法精讲 421、pandas.DataFrame.infer_objects方法 421-1、语法 421-2、参数 421-3、功能 421-4、返回值 421-5、说明 421-6、用法 421-6-1、数据准备 421-6-2、代码示例 421-6-3、结果输出 422、pandas.DataFrame.copy方法 422-1、语法 422-2、参数 …

sheng的学习笔记-AI-半监督学习

AI目录:sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是半监督学习 我们在丰收季节来到瓜田,满地都是西瓜,瓜农抱来三四个瓜说这都是好瓜,然后再指着地里的五六个瓜说这些还不好,还需再生长若干天。基于这些信息&a…

前端面试题-场景设计题

1. 如何使用 css 画一个三角形 借助 border 实现,在 width 和 height 都为 0 时,设置 border,便会呈现三角形。想要哪个方向的三角形,设置其他三边为 透明即可。 同时,可以通过调整不同边的宽度,来调整三角…

巨省成本的电子版招生简章越来越流行,你知道是怎么制作的吗?

随着科技的不断发展,传统的纸质招生简章逐渐被电子版招生简章所取代。电子版招生简章不仅能够节省大量成本,还能够提高宣传效果,因此在市场上越来越流行。你知道它是怎么制作的吗? 1.要制作电子杂志,首先需要选择一款适合自己的软…

Milvus在数派数据大模型业务中的实践

01. 写在前面 云南数派数据科技有限公司是一家总部位于美丽春城昆明的大模型创新企业,在深圳和昆明双城并立,设立了两个研发中心。我们的旗舰产品——SUPIEDT大模型开发平台,作为一款全生命周期的异构算力大模型开发平台,集一站式…

推荐3款好用的电脑动态壁纸软件,资源丰富,图片精美

WinDynamicDesktop WinDynamicDesktop是一款将macOS Mojave的动态桌面功能移植到Windows平台上的开源软件。它允许用户根据时间、地点和天气等条件自动更换壁纸,从而实现类似macOS系统中的动态壁纸效果。 该软件的主要特点包括: 动态壁纸:W…

查找1

一、查找的基本概念 二、线性表的查找 1)顺序查找(线性查找) 2)折半查找(二分或对分查找) 3)(分块)索引查找

具有宽输入电压范围的75V同步降压控制器LM5145

芯品快报:亚德诺(ADI)汽车音频总线AB收发器AD2428 这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) LM5145是德州仪器推出的一款具有较宽输入电压的75V同步降压控制器,其输入电压范围可达6V~75V,具有0.8V~60V可调整的输出…

【研发日记】嵌入式处理器技能解锁(五)——TI C2000 DSP的中断系统

文章目录 前言 背景介绍 中断框架 外设中断 ePIE模块 CPU中断 中断嵌套 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见…

大数据中台建设整体技术方案(中台设计)word完整版

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集,结构化、半结构化、非结构化的数据采集,数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…

ssrf+redis

curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDA dict被禁用了用(?urlhttp://172.19.0.3端口)来探测一下端口吧 172.19.0.3主机只开放一个80端口 看看内网还有其他服务器没 这里可以看到内网还有一台172.1…

【Python】给动态图片加水印

文章目录 原文:https://blog.c12th.cn/archives/35.html前言部分代码ini文件CMD 完整代码使用教程(打包整理后文件)注意事项 最后 原文:https://blog.c12th.cn/archives/35.html 前言 之前 图片加水印 是对于静态图片,而现在这个是对动态图片…