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

50. UE5 RPG FGameplayEffectContext

接下来,我想实现处理完伤害时,将伤害的触发格挡或者触发暴击时的逻辑传递到数据集的PostGameplayEffectExecute里面,这样,在处理IncomingDamage时,我们可以通过释放触发格挡或者触发暴击在UI上面进行对应的效果表现。

当前GE的获取逻辑

在PostGameplayEffectExecute里面,我们是通过自定义了一个结构体,从Data里面处理并获取了对应的数据。
在这里插入图片描述
Data数据的结构体里面共有三项,
EffectSpec就是当前使用处理的GE的实例
EvaluatedData 是一个结构体,里面包含了应用到目标修改的属性和修改量。我们也是通过这个判断修改的哪个属性
Target 是一个技能组件ASC,它的值是应用的目标ASC
在这里插入图片描述
在处理时,我们是从Data上面获取到GE的上下文句柄,然后获取的源的数据,而目标数据是从Target获取。
在这里插入图片描述
那么,这个GE的上下文句柄是在什么时候创建的,我们打开生成投掷物的技能类,发现这个上下文是在创建GE的实例时生成的,然后将GE实例创建出来,设置给投掷物身上,用于碰撞触发时应用给目标的ASC
在这里插入图片描述

FGameplayEffectContextHandle

查看MakeEffectContext方法,首先创建FGameplayEffectContextHandle实例,然后设置了源的ASC的所有对象和控制对象
在这里插入图片描述
在往下深究之前,我们先打个断点,看一下GE上下文句柄内包含了哪些数据
现在可以看到有些数据是设置的,有些没有设置,设置的哪些数据就是在MakeEffectContext时设置的。
Data其实就是EffectContext,在创建的时候创建的实际上下文。
在这里插入图片描述
比如Instigator和EffectCauser的属性,是在MakeEffectContext时设置的,分别为OwnerActor(PlayerState)和AvatarActor(BP_Aura)
在这里插入图片描述
并且技能发起者的ASC也是在设置Actor时候缓存下来的
在这里插入图片描述
在设置了发动者的参数时,也对应的设置的它们会被复制
在这里插入图片描述
这里设置也是在AddInstigator里面实现的
在这里插入图片描述
对于一些没有赋值的内容,主要是GAS没有主动给我们设置,需要我们手动设置
在这里插入图片描述
我们没有设置,在构造时,它也会给我们设置一个默认值
在这里插入图片描述
我们还可以看到FGameplayEffectContext类里面给我们设置对应的添加技能和SourceObject等的函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

填充FGameplayEffectContext

查看了源码,我们发现还有很多配置没有填充上,所以,我们先实现将内置这些配置项填充上。
在ProjectileSpell.cpp中,我们在创建GE时,需要创建GE的上下文句柄我们直接抽离出来创建一个变量,方便调用内置函数设置

FGameplayEffectContextHandle EffectContextHandle = SourceASC->MakeEffectContext();

然后调用一系列的函数尽可能的设置内置的属性

EffectContextHandle.SetAbility(this); //设置技能
EffectContextHandle.AddSourceObject(Projectile); //设置GE的源
//添加Actor列表
TArray<TWeakObjectPtr<AActor>> Actors;
Actors.Add(Projectile);
EffectContextHandle.AddActors(Actors);
//添加命中结果
FHitResult HitResult;
HitResult.Location = ProjectileTargetLocation;
EffectContextHandle.AddHitResult(HitResult);
//添加技能触发位置
EffectContextHandle.AddOrigin(ProjectileTargetLocation);

接着编译打开UE,打开断点查看数值是否都被设置上。
在这里插入图片描述

http://www.lryc.cn/news/350122.html

相关文章:

  • Golang 的 unmarshal 踩坑指南
  • Linux的常用指令 和 基础知识穿插巩固(巩固知识必看)
  • MP3解码入门(基于libhelix)
  • Oracle 中索引与完整性(SQL)
  • 【Linux深度学习笔记5.13(Apache)】
  • 汇编语言入门:探索 x86 架构
  • [ffmpeg处理指令]
  • 测试之路 - 精准而优雅
  • Java基础篇常见面试问题总结
  • Spring、SpringMVC
  • 【传知代码】VRT: 关于视频修复的模型(论文复现)
  • 不用投稿邮箱,怎样向各大新闻媒体投稿?
  • NAT技术总结与双向NAT配置案例
  • mysql的explain
  • SpringBoot+Vue实现图片滑块和文字点击验证码
  • 每日复盘-20240515
  • 【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决
  • 高校普法|基于SSM+vue的高校普法系统的设计与实现(源码+数据库+文档)
  • pytest教程-47-钩子函数-pytest_sessionfinish
  • 如何使用Python下载哔哩哔哩(Bilibili)视频字幕
  • IP代理网络协议介绍
  • 渗透相关面试+流量分析
  • Shell之高效文本处理命令
  • u3d的ab文件注意事项
  • Go微服务开源框架kratos的依赖注入关系总结
  • Linux 第三十二章
  • 手机号码的正则表达式
  • 机器学习入门介绍
  • 一文说通用户故事点数是什么?
  • GAME101-Lecture07学习