10. UE5 RPG使用GameEffect创建血瓶修改角色属性

前面我们通过代码实现了UI显示角色的血量和蓝量,并实现了初始化和在数值变动时实时更新。为了测试方便,没有使用GameEffect去修改角色的属性,而是通过代码直接修改的数值。
对于GameEffect的基础,这里不再讲解,如果需要可以查看文档。
虚幻引擎游戏技能系统文档
接下来,讲解一下,如何使用GameEffect进行属性修改。

实现拾取物的Effect

之前,我们创建了一个Actor的类,用于修改,现在将其内容还原成一个刚创建的模样。
为了保证类的通用性,我们删除了所有的内容,只添加了一个根节点。如果你需要一些内容,可以在蓝图内添加。

SetRootComponent(CreateDefaultSubobject<USceneComponent>("SceneRoot"));

打开UE,在根节点下面添加一个静态网格体,用于添加显示模型。
在这里插入图片描述
接着将静态网格体的碰撞关闭掉,因为我们不需要它进行碰撞检测
在这里插入图片描述

在根组件下面再添加一个球碰撞体,用于碰撞检测
在这里插入图片描述
球碰撞体是默认对所有物体进行检测的
在这里插入图片描述
添加球体的碰撞检测事件通知
在这里插入图片描述
添加到这里,就可以先将UE关闭,我们可以将一些使用蓝图方便编辑的内容在蓝图中制作,一些比较耗性能的内容或运算比较高的内容放到c++内做。

实现赋予类给自身添加GameplayEffect

上面通过蓝图添加了碰撞检测,我们将在碰撞检测之后链接在c++里创建的函数,为角色身份赋予effect效果。
打开代码编辑器,在拾取物基类里添加一个函数,通过类赋予目标Effect的函数,设置这个函数可以在蓝图可调用。

	UFUNCTION(BlueprintCallable) void ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass);//给与目标添加GameplayEffect

函数实现里,首先要获取到添加目标的ASC组件,这里我们使用到了技能组件库里面的函数获取,

UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);

使用ASC创建一个EffectContextHandle,这个句柄里面包含实例化GameplayEffect所需的数据

FGameplayEffectContextHandle EffectContextHandle = TargetASC->MakeEffectContext();

设置此句柄的创建者

EffectContextHandle.AddSourceObject(this);

通过MakeOutgoingSpec()函数实例化GameplayEffect,返回一个实例化的句柄(句柄的意思是可以跟踪实例化对象的位置,即使它位置变动了也能跟踪的到)
MakeOutgoingSpec()函数需要传入三个值,第一个就是需要实例化的类,第二个是效果等级(它是有等级区分的),第三个值就是我们之前创建的实例化所需数据的句柄。

const FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, 1.f, EffectContextHandle);

最后,我们需要从实例化对象中拿到它的实际位置,并调用ASC赋予自身。

TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());

打开拾取物蓝图,搜索对应的名称,如果出现当前函数节点,证明我们成功了
在这里插入图片描述
我们也可以直接用蓝图制作,下面是蓝图实现方式
在这里插入图片描述

创建GameplayEffect

接下来我们创建GameplayEffect,这个不需要在c++里编写,直接创建蓝图编辑即可。接下来,我们将创建一个药瓶的效果,能够瞬间恢复一定血量的效果。
创建一个基于GameplayEffect的蓝图类
在这里插入图片描述
在右侧的细节设置相关的配置项,其实这个蓝图就是一个数据蓝图,新版本5.3的配置还改版了,之前是一堆直接罗列出来,现在新增加了一个Components配置,可以自己按照需求添加,这个感觉改版改的挺好。
在这里插入图片描述
在持续时间这里,有三个选项Instant瞬间(也可以理解为永久),Infinite(无限时间,可以后续被去掉,比如永久buff),Has Duration(具有时效性),血瓶作为直接恢复血量的,不会再被去掉恢复的血量,可以使用Instant
在这里插入图片描述
在下面的Modifiers这里,添加一个数组元素
在这里插入图片描述
它的Attribute设置需要选择我们需要修改的选项,血瓶需要修改血量,选择在属性集里创建的Health属性
在这里插入图片描述
计算方式有加,乘,除,覆盖数值,无效,有小伙伴会问,为什么没有减,加的数值是负数就是减了。
在这里插入图片描述
这里血量恢复就是加,所以我们使用add,一瓶血恢复十点生命值
在这里插入图片描述
到这里,我们的血量恢复的Effect就编写完成了。

添加蓝图逻辑

首先在c++类里添加一个参数,用于设置类,这个类可以被蓝图设置,并被蓝图读取。

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> InstantGameplayEffectClass; //生成GameplayEffect的类

打开对应蓝图后,在类默认值的细节这里,我们可以设置对应的Effect类,直接选择我们创建的Effect
在这里插入图片描述
然后再碰撞事件后,将角色转换成角色,直接应用对应的设置的Effect类,最后销毁Actor
在这里插入图片描述
接着将actor添加到场景中,运行游戏,调试框输入showdebug abilitysystem
在这里插入图片描述
左侧显示血量数值当前为50
在这里插入图片描述
操作角色去吃掉血瓶,会发现血量增加10
在这里插入图片描述

制作有时间限制的GameplayEffect

前面实现了即时的效果,接下来实现一个只可以维持一段时间的效果的药瓶。
我们将制作一个增加最大血量值的GameplayEffect,持续时间为5s,过了这个时间以后,效果将恢复为原来的最大血量。
首先将持续时间修改成Has Duration(具有时效性的),设置时间为5s,Period设置为0,意为整个周期内都起作用。
在这里插入图片描述
然后在属性这里修改一个MaxHealth,修改数值增加100
在这里插入图片描述
为了防止混淆,这里直接增加了一个设置DurationGameplayEffectClass参数

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> DurationGameplayEffectClass; //生成具有一定持续时间的GameplayEffect的类

逻辑也是直接使用蓝图实现的
在这里插入图片描述
运行,打开debug,默认值MaxHealth是100
在这里插入图片描述
去拾取新创建的碰撞体,会告诉你增加了100,基础还是100,5s后恢复默认的base。
在这里插入图片描述

实现持续回血效果的GameplayEffect

上面实现了可以维持一段时间的效果,可以作为某些属性使用,但是正常使用血瓶,它会在一定时间内持续回血,接下来我们将实现这个效果。
这个效果和上面的主要区别在于Period的值不能为0,就是不会一直触发,而是有间隔时间,我们设置每间隔一秒执行一次。
Execute Periodic Effect on Application 如果勾选,将会在触发时,立马触发一次效果,而不是等待Period的时间后再触发。
Periodic Inhibition Policy 选择 Never Reset 则属性每次添加不会重置,相当于每过1秒触发一次Instant
在这里插入图片描述
下面,我们修改成了修改血量的值,每次触发恢复10点血量
在这里插入图片描述

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

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

相关文章

5.列表选择弹窗(BottomListPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 从底部弹出的列表选择弹窗。 1.布局 <?xml version"1.0" encoding"utf-8" ?> <toolkit:Popup xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns…

幻兽帕鲁游戏多人联机服务器价格对比:腾讯云VS阿里云VS华为云

《幻兽帕鲁》游戏5天捞金15亿&#xff0c;而且想要多人联机玩游戏&#xff0c;还允许我们自己购买服务器来搭建专属服务器&#xff0c;届时三五好友一起来玩&#xff0c;真的不要太爽啊&#xff01;那么搭建幻兽帕鲁游戏多人联机的服务器需要多少钱&#xff1f;下面boke112百科…

软件产品著作权证书需要哪些资料

1、软件源程序代码(前、后各连续30页&#xff0c;共60页&#xff1b;不足60页全部提交) 2、软件用户手册、操作手册、设计说明书、使用说明书等任选一种 3、身份证明 A著作权人为个人 应提交身份证复印件一份&#xff0c;如有工作单位&#xff0c;可以要单位出具非职务软件开…

在 Ubuntu 18.04 x86_64 上面安装 Linux-ARMv7 A/L GCC编译器

一键安装 Linux-ARMv7A GCC编译器&#xff1a;&#xff08;平板、手机一般是&#xff09; ########################### 输入以下命令&#xff1a; 1、sudo apt update 2、sudo apt install gcc-arm-linux-gnueabi sudo apt install g-arm-linux-gnueabi 3、arm-linux-gn…

Vue3 Element-plust表格导出excel文件

安装插件&#xff1a; npm i js-table2excel 引入插件&#xff1a; import table2excel from "js-table2excel"; table收集数据&#xff1a; <el-tablesize"small"ref"multipleTableRef":header-cell-style"{ background: #f5f6fa, co…

搜索引擎Elasticsearch了解

1.Lucene 是什么? 2.模块介绍 Lucene是什么: 一种高性能,可伸缩的信息搜索(IR)库 在2000年开源,最初由鼎鼎大名的Doug Cutting开发 是基于Java实现的高性能的开源项目 Lucene采用了基于倒排表的设计原理,可以非常高效地实现文本查找,在底层采用了分段的存储模式,使它在读…

【JaveWeb教程】(28)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(1)

目录 SpringBootWeb案例011. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理 SpringBootWeb案例01 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库…

偏差,均方根误差RMSE

目录 一、均方误差MSE​编辑 二、R自定义函数 三、均方根误差(RMSE), 平均绝对误差(MAE), 标准差(Standard Deviation)的对比 参考&#xff1a; 一、均方误差MSE 这里使用trace是因为多元情形下方差是矩阵。 二、R自定义函数 来自&#xff1a;2022 - Biometrical Journal - …

electron-builder vue 打包后element-ui字体图标不显示问题

当使用electron打包完成的时候&#xff0c;启动项目发现使用的element-ui字体图标没显示都变成了小方块&#xff0c;并出现报错&#xff0c;请看下图&#xff1a; 解放方法&#xff1a; 在vue.config.js中设置 customFileProtocol字段&#xff1a;pluginOptions: {electronBui…

数组里对象排序

let arr [{age:20,name:张三‘},{age:21,name:里斯‘},{age:22,name:王武‘}, ]arr.sort(function (a, b) {return a.age - b.age; // 按照升序排列 });

单片机之keil软件环境搭建

简介 Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案&#xff0c;通过一个集成开发环境&#xff08;μVision&#xff09;将这些部分组合在一起。     目前软件对中文的支持不友好&#xff0c;不建议安装网上的一些汉化包…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。

学习笔记之 机器学习之预测雾霾

文章目录 Encoder-DecoderSeq2Seq (序列到序列&#xff09; Encoder-Decoder 基础的Encoder-Decoder是存在很多弊端的&#xff0c;最大的问题就是信息丢失。Encoder将输入编码为固定大小的向量的过程实际上是一个“信息有损的压缩过程”&#xff0c;如果信息量越大&#xff0c;…

CentOS网络配置进阶:深入研究network服务和NetworkManager

前言 如果你正在使用CentOS系统,并且想要深入了解网络管理和配置,那么本文肯定适合你!在这篇文章中,作者深入探讨了CentOS中的两种网络管理方式:network服务和NetworkManager。通过详实的讲解和实用的示例,你将会学习到如何使用这两种工具来管理网络接口、配置IP地址、网…

jQuery实现ajax语法,post请求发送数组对象(jquery)

$.ajax()代码模板 jQuery实现ajax语法为&#xff1a;$.ajax({})&#xff0c;其中{}为对象&#xff0c;对象里面的key键是固定的&#xff0c;比如: 1、type: 表示请求方式&#xff0c;一般为post或get 2、url表示请求的地址 3、contentType表示发送信息至服务器时内容编码类…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储&#xff0c;这是一种连接MySQL数据库的方式。在本篇文章中&#xff0c;将详细介绍如何使用pym…

微信生成带参数二维码(用户id), 扫码可获取用户id

生成带参数的二维码: https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html 示例代码: /*** 生成带参数的二维码** param userId 用户id* return*/GetMappingRequestMapping("/createTicket/{userId}")pu…

Android开发修炼之路——(一)Android App开发基础-1

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

Spring Boot 项目请求参数丢失问题排查与解决

最近在项目中遇到一个 bug&#xff0c;涉及到文件另存接口无法正确读取前端传入的参数。以下是排查问题的过程&#xff1a; 在开发环境中通过 Postman 调用接口进入断点调试&#xff0c;没有问题&#xff0c;排除了接口本身的问题。 获取线上环境的入参&#xff0c;通过 Postm…

C++:优先队列-Priority_queue

目录 1.关于优先队列 2.priority_queue的使用 1.构造方法 2.empty();判空 3.size(); 4.top(); 5.push(val); 6.pop(); 3.优先队列模拟实现 4.用优先队列解决数组中第K个大的元素 1.关于优先队列 在C中&#xff0c;可以使用STL&#xff08;标准模板库&#xff09;中的p…