GAS系统 :GameplayEffect应用流程及Attribute修改

写在前面:
聚合器(FAggregator) :可以理解为一个Attribute属性,在GE有对此属性有修改时会创建一个,里面主要储存了属性的BaseValue,所有对此属性修改的信息。

一,GE的应用流程(暂时不考虑预测相关)

以给自身Apply一个GE为例(ApplyTarget最终也是用Target的AbilitySystemComponent调用目标的ApplytoSelf,只是在MakeEffectContext的时候有所区别)
在这里插入图片描述
ApplyGameplayEffectSpecToSelf为入口:
检查网络端或者是否有合法的预测key:
在这里插入图片描述
Tag配置检查,Modify的属性有效性配置检查,自定义应用条件检查(太长,感兴趣自己看一下):

如果上述条件都没有问题,且不算Instant类型的GE,那么就会走到ActiveGameplayEffects的ApplyGameplayEffectSpec;这个函数就是非Instant类型的GE生效的函数,里面包括快照属性,计算属性修改更新,Duration计时,GE层数叠加的核心操作。
在这里插入图片描述
如果是新添加的GE,你们最终我们是通过InternalOnActiveGameplayEffectAdded来实际rangGE生效。在这里插入图片描述
通过这个函数检查OngoingTag
在这里插入图片描述
创建一个FScopedAggregatorOnDirtyBatch批处理局部变量,属性的实际修改其实是通过这个类的析构函数触发的,这个局部变量会在函数末尾析构,目的是先更新Effect列表,防止一切实际修改属性的操作发生。因为属性修改可能有相互依赖(自定义计算类),防止计算结果不正确。
在这里插入图片描述

创建或找到已有的聚合器并添加修改效果。在这里插入图片描述
通过BroadcastOnDirty多播修改器的Dirty代理,然后才实际去修改属性
在这里插入图片描述
把聚合器添加到待处理列表,通过FScopedAggregatorOnDirtyBatch析构函数触发实例处理操作
在这里插入图片描述通过FScopedAggregatorOnDirtyBatch析构函数再次调用Dirty,因为批处理析构,Count–等于0这个时候不会重复做添加处理列表这个操作,而是直接调用聚合器的OnDirty的多播去实际修改属性。
在这里插入图片描述
在这里插入图片描述
这个是回调函数,里面通过聚合器的Evaluate实际计算了属性的Current的值

下面是GE修改属性的完整堆栈。
在这里插入图片描述

二,属性的修改

这里先说一下属性计算,GE的核心之一就是对属性做修改:
在这里插入图片描述
核心就是这三个参数,Additive,Multiplicitive和Division,如果是Override的直接返回这个修改器的值。
其中SumMods的细节如下:
在这里插入图片描述
其中Bias值是通过ModOp以及GameplayEffectUtilities::GetModifierBiasByModifierOp得到的一个值
在这里插入图片描述
Additive(减法也只是传一个负值):
加法比较简单,Bias值根据运算返回的是0,因为EGameplayModOp这个枚举第一个在GetModifierBiasByModifierOp里设置的是0,以此类推。
遍历所有的属性加法修改器,把加法修改值累加,基本就是 0 += (加法修改值 - 0);
Multiplicitive:
乘法有个不一样的地方就是,乘法修改的值需要减去基础值的1,意思就是如果属性值乘2,在算Multiplicitive这个影响值的时候会自动减去Base的1得到一个影响差值(这个差值才是实际修改的量的系数)。然后再用1去累加这些差值。得到一个最终的Multiplicitive值。
Division:
除法影响值算法同乘法。
最后得到三个Additive,Multiplicitive和Division系数。GAS的做法是按:加减(合并为加法,减法是传负值),乘,除的顺序来算最终属性的值。

最终属性值的计算公式为:(Base值 + 加法修改值) 乘法修改值 /除法修改值 = 属性的Current值。

例:当前最大生命值基础值(Base)是100 ,GE有两个修改,一个是加50,一个是增加50%(相当于属性值乘1.5)。
Additive = 0 + 50;
Multiplicitive = 1 +( 1.5 - 1 );
AttributeCurrentValue = (100+ 50)
1.5 /1 ;
当前值为225;
*

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值