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.rhkb.cn/news/247246.html

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

相关文章

《动手学深度学习(PyTorch版)》笔记4.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Swiper容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Swiper容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Swiper容器组件 滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。…

漏洞原理MySql注入 Windows中Sqlmap 工具的使用

漏洞原理MySql注入 SQLmap是一款开源的自动化SQL注入工具&#xff0c;用于检测和利用Web应用程序中的SQL注入漏洞。以下是SQLmap工具的使用总结&#xff1a; 安装和配置&#xff1a;首先需要下载并安装SQLmap工具。安装完成后&#xff0c;可以通过命令行界面或图形用户界面来使…

Kafka-服务端-GroupMetadataManager

GroupMetadataManager是GroupCoordinator中负责管理Consumer Group元数据以及其对应offset信息的组件。 GroupMetadataManager底层使用Offsets Topic,以消息的形式存储Consumer Group的GroupMetadata信息以及其消费的每个分区的offset,如图所示。 consumer_offsets的某Partiti…

C#算法(11)—求三个点构成圆的圆心坐标和半径

前言 我们在上位机开发领域也经常会碰到根据三个点求出圆的圆心、半径等信息的场景,本文就是详细的介绍如何根据三个点使用C#代码求出三点构成的圆的圆心坐标、圆半径、三点构成的圆弧的角度。 1、3点求圆分析 A、B、C三个点都是圆上的坐标点,过向量AB做中垂线,过向量AC做…

RabbitMQ“延时队列“

1.RabbitMQ"延时队列" 延迟队列存储的对象是对应的延迟消息&#xff0c;所谓“延迟消息”是指当消息被发送以后&#xff0c;并不想让消费者立刻拿到消息&#xff0c;而是等待特定时间后&#xff0c;消费者才能拿到这个消息进行消费 注意RabbitMQ并没有延时队列慨念,…

一款相对比较强大的国产ARM单片机HC32F4A0

已经用了3年的HC32F4A0&#xff0c;已经对它比较熟悉了&#xff0c;与STM32相比它的外设使用这些的确是挺大大&#xff0c;不像GD32一类的单片机很多都能兼容STM32。用久了之后就更喜欢用HC32F4A0&#xff0c;功能强大&#xff0c;外设使用灵活&#xff0c;用点向FPGA靠拢的感觉…

TCP 三次握手 四次挥手以及滑动窗口

TCP 三次握手 简介&#xff1a; TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的 “ 连接” &#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以…

系统调用:计算机中的“服务员”

一、什么是系统调用 想象一下&#xff0c;你在一家餐厅就餐&#xff0c;你需要通过服务员来点菜、支付等。系统调用就像是这个服务员&#xff0c;它在软件和操作系统之间起到了桥梁的作用。当软件需要操作系统提供的某项服务时&#xff0c;它就像顾客一样&#xff0c;通过点菜…

双非本科准备秋招(9.2)——力扣哈希

1、383. 赎金信 跟昨天的题大同小异&#xff0c;因为只有26个字母&#xff0c;所以可以建个有26个坑位的数组。 做完昨天的题目&#xff0c;这个题没啥新意。 class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] hashTable new int[…

Gin 应用多实例部署session问题、session参数与刷新

文章目录 一、Gin Session 存储的实现方案二、memstore&#xff1a;基于内存的实现2.1 基本使用2.2 关键参数 三、使用redis&#xff1a;多实例部署3.1 使用redis优势3.2 基本使用 四、信息安全的三个核心概念五、Gin Session 参数5.1 参数介绍 六、Session 自动刷新 一、Gin S…

FFMPEG解析ts流

三篇相关联的文章&#xff1a; ffmpeg下HLS解析过程-CSDN博客TS文件格式详解及解封装过程-CSDN博客 FFMPEG解析ts流-CSDN博客 一、简介 关于TS格式解析&#xff0c;可以参考《TS文件格式详解及解封装过程-CSDN博客》&#xff0c;本文主要代码部分解读。建议大家熟读iso138…

Apache Shiro <= 1.2.4反序列化漏洞攻击 CVE-2016-4437 已亲自复现

Apache Shiro < 1.2.4反序列化漏洞攻击 CVE-2016-4437 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 在 1.2.5 之前的 Apache Shiro 中&#xff0c;当未为“记住我”功能配置密钥时&#xff0c;远程攻击者可以通过未指定…

聚醚醚酮(Polyether Ether Ketone)PEEK在粘接使用时可以使用UV胶水吗?要注意哪些事项?

一般情况下&#xff0c;聚醚醚酮&#xff08;Polyether Ether Ketone&#xff0c;PEEK&#xff09;是一种难以黏附的高性能工程塑料&#xff0c;而UV胶水通常不是与PEEK进行粘接的首选方法。PEEK表面的化学性质和高温性能使得它对常规胶水的附着性较低。然而&#xff0c;有一些…

vscode copilot怎么去掉提示代码(ghost text or incline completion)

原因&#xff1a;最近在刷题&#xff0c;被这个提示烦死了&#xff0c;记录一下怎么关掉&#xff0c;防止将来需要开启找不到了XD. 1.直接ctrlshiftp召唤设置 2.输入preferences: open usr settings找到如图第一个 3.去掉这个方框的勾选 ps直接在extension里disable不行呢 不…

DOM 型 XSS 攻击演示(附链接)

一、介绍 DOM&#xff08;Document Object Model&#xff09;型 XSS&#xff08;Cross-Site Scripting&#xff09;攻击是一种 Web 应用程序中的安全漏洞&#xff0c;其特点是攻击者成功地注入了恶意脚本&#xff0c;这些脚本在用户的浏览器中执行&#xff0c;从而导致恶意行为…

顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组 3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义 2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双…

ELK日志解决方案

ELK日志解决方案 ELK套件日志系统应该是Elasticsearch使用最广泛的场景之一了&#xff0c;Elasticsearch支持海量数据的存储和查询&#xff0c;特别适合日志搜索场景。广泛使用的ELK套件(Elasticsearch、Logstash、Kibana)是日志系统最经典的案例&#xff0c;使用Logstash和Be…

CVPR——Latex模版下载

CVPR官网 -> AuthorGuidelines 链接&#xff1a;AuthorGuidelines

怎么把几百M大小的视频做成二维码?扫码播放视频在线教程

怎么把几百M大小的视频做成一个二维码展示呢&#xff1f;通过二维码来作为视频的载体是现在很常用的一种手段&#xff0c;通过这种方式不仅成本比较低&#xff0c;而且传播速度也比较快&#xff0c;通过访问云端数据就可以播放视频。 视频二维码生成的方法一般会通过二维码生成…