06 GE Modifier

发布于:2025-04-21 ⋅ 阅读:(78) ⋅ 点赞:(0)

看看这个

问题。怪!究竟下一个modifier能不能访问到上一个?刚才还可以啊现在怎么不行了。
这里捕获了Owner的属性,Source不知道在哪捕获的


CalculationType:
1.使用计算后的值
2.使用基础值
3.使用计算后的值-基础值。

BackingAttributes

Source指Instigator,按道理应该在MakeOutGoingContext的时候就有了。
不知道为什么InstigatorASC = null
因为InstigatorASC是从OwnerActor中获取ASC。
PlayerState而不是Controller
初始化成功😀

总结:Source指GEContext中的InstigatorAbilitySystemComponent,在使用ASC->MakeOutGoingContext()时,已经指定了此ASC为OwnerActor身上的ASC。在我这个情况下,ASC存在于PlayerState上,所以Source因该是PlayerState上的ASC,应该将OwnerActor设置为PlayerState而不是Controller。
_______________________________________额外问题————————————————

Modifier列表中,上一条结果到底能不能被下一条访问?

Health = 2,Health*=4,Health = 8
Health = 2,Mana = 2,Health+=Mana,Health = 2
Health = 2,Health +=Health,Health = 2

 

猜想:使用BackingAttribute时,取的是Apply前的值。不使用时,取得是Modifier中的值。


那这个SnapShot又是什么意思。。。。看看源码。
 

这里逐一计算Modifier的值。
这里对四种Modifier进行了Switch,第一种最简单,直接返回查曲线查到的值。

 

AttributeBased类型的Modifier的值的计算函数,在上面的情况中返回的是0。接下来看看为什么是0

 

使用AttributeMagnitude类型的计算,进入这个函数
用到一个叫做Aggregator(聚合器)的东西进行计算

 

使用BaseValue,这个此时还是0.

 总结:Modifier的值是先计算每一项的值,再根据计算结果修改Base值。所以上一项的值不能被下一项拿到。要想让Health = MaxHealth将他们分成两个GE,一个修改MaxHealth,一个修改Health.


网站公告

今日签到

点亮在社区的每一天
去签到