虚幻四Gameplay Ability System入门(6)-Gameplay Effect详解(1)Modifier

在之前的五篇文章中,我们已经无数次使用了技能系统中的Gameplay Effect,但是我们仅仅使用了最简单的部分,实际上GE的功能十分强大,接下来的三篇文章我打算进一步说明GE的各个模块和应用方法。

GE的定义

之前已经提到过了,现在还是再次说明,GE可以看做是一种改变Attributes和GameplayTags的容器,它应该是data-only的,不该包含额外的逻辑。

GE修改Attributes是通过Modifier和Execution。
Untitled.png

GE Duration

GE本身有三种持续时间的方式。分别是Instant,Infinite,Has a Duration。
Untitled 1.png

Duration Type具体应用方法
Instant立即启用,用以改变属性的BaseValue。因为瞬时的效应,不应该用来添加GameplayTags
Duration拥有持续时间,修改的是属性的CurrentValue。可以添加Gameplay Tags。
Infinite持续时间是永久,但可以手动移除。修改的是属性的CurrentValue。可以添加Gameplay Tags。

要注意,Duration和Infinite有特殊的情况,那就是他们拥有Periodic时,他们的实际执行效果类似于每经过一段period执行的Instant GE。
Untitled 2.png

Modifier

Modifier可以被理解为修改一个属性Attribute的方法,一个GE可以拥有0或者多个modifier。
Untitled 3.png

在一个Modifier中,首先可以看到Attribute选项,它选择的是所在Modifier修改的Attribute。第二个选项是Modifier Op,它意味着对所选择的Attribute是如何修改的。总共有四种选项: Add, Multiply, Divide, Override。Add意味着修改方式为原Attribute加上modifier计算的修改大小。其它三个选项都是相似的。

Modifier Magnitude

Magnitude可以理解为修改量,比如角色拥有20点Damage,可能经过一系列计算,最终造成的伤害是50,这个最终值就是Magnitude,计算最终伤害的方法就是Magnitude Calculation Type。
Untitled 4.png

计算Magnitude的方法有四种: Scalable Float, Attribute Based, Custom Calculation Class, Set By Caller。

Scalable Float

Scalable Float可以直接输入一个值,以这个值作为最终的Magnitude去修改所选Attribute,之前我们所有的GE使用的都是这种方法。
Untitled 5.png

当然,Scalable Float还可以进行扩展,它可以选择一个Curve Table,使用的时候会自动的读取数据表中的row,然后根据GE的level选择对应的数据。下图是EPIC商城中官方的RPG游戏demo里的例子。它选择了AttackDamage作为数据表,选择了行DefaultAttack,然后根据输入的level选择对应的行的数据。
Untitled 6.png

AttackDamage对应的数据如下
Untitled 7.png

我们可以通过导入CSV文件来生成自己的数据表。原始数据如下。注意,我自己在测试的时候用EXCEL转csv,需要设置全部的数据类型为float,否则无法导入。
Untitled 8.png

导入和导入结果
Untitled 9.pngUntitled 10.png

我觉得还是通过例子来实验一下最好。创建一个GE命名为GE_ScalableFloat_Test
Untitled 11.png

测试的方法如下,直接向自己应用测试GE。首先输入level为1
Untitled 12.png

第一张图里level=1,可以看到造成的伤害为10。第二张图里的level=4,造成的伤害为40。和我们在表中定义的一致。

但是这里的Magnitude有些奇怪,无论我如何修改返回的都是-1,不知道有没有大佬知道原理可以帮我解释一下。
Untitled 13.png
Untitled 14.png

Attribute Based

第一种计算方式讲完了,进入第二种。顾名思义,第二种方法就是根据Attribute来计算Magnitude。
Untitled 15.png

它可以从GE的Source或者Target处获取一个Attribute,然后获取这个ttribute的BaseValue或者CurrentValue用来计算修改量Magnitude。
Untitled 16.png

获取Attribute Value后,还需要计算最终的Magnitude,这里的计算流程为。这里的三个选项同样可以使用DataTable,然后根据level进行调整。
Untitled 17.png
Untitled 18.png

和刚才一样,还是做一个测试。
Untitled 19.png

可以看到造成的伤害为-0.5*(20+100)=-60
Untitled 20.png

调整一下。
Untitled 21.png

这一次造成的伤害为-0.5*100+20=-30
Untitled 22.png

Custom Calculation Class

这个计算方式的实现需要在C++中创建类UGameplayModMagnitudeCalculation的派生类。重写方法CalculateBaseMagnitude_Implementation来实现。这种计算方式非常灵活和强大,我们可以在其中自由的选择所需要的Attributes,用自己想要的方法去计算最终的Magnitude。它的实现方法和GameplayEffectExecutionCalculations类似。由于需要打开C++实现,我今天又比较懒不像写代码了,所以放在下期和Execution一起实现。

virtual float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override;

Untitled 23.png

Set By Caller

最后一种计算方式。
Untitled 24.png

它的实现方式为通过向GE中传入一个带有Magitude的Caller,作为修改值。传入Caller可以通过指定Data Name或者Tag。这里建议使用Tag,因为这样可以避免因为输入错误的Name而产生错误。

感谢蓝图,让理解功能变得更加方便和快速了,这里吐个槽,不理解为啥有这么多人觉得蓝图不好用。在这里,我们首先创建了一个Outgoing Spec,表示了作用的ASC以及所使用的GE和level,然后向创建好的Spec中传入我们需要的Caller,最后向自己应用我们所创建的GE Spec。GESpec的概念类似于创建一个GE类的实例。
Untitled 25.png

我认为Set By Caller这种计算方法在蓝图的使用中更为灵活,比如有一个GE用来对敌人造成伤害,伤害的大小可以在该项技能的Ability BP中通过Caller传入。当然C++中也可以使用。

Source Tags和Target Tags

一个modifier中还有最后一个部分。这里的两个Tags工作原理和Ability中的Application Tag Requirement一样,他只在GE被应用前被检测,决定该GE是否会被Apply,因此Infinite和Duration的GE也只会在第一次apply前考虑这两个Tags。
Untitled 26.png

总结

这篇文章到这里就写的差不多了,主要介绍了Modifier计算修改值的四种方法,下一篇我会在C++中实现本次没有介绍的Custom Class计算方法。还有实现Execution,它是一种和Modifier并列的修改属性值的方法,它的强大之处在于可以修改多个Attributes。之后GE可能还有一期讲解剩余的部分。
Untitled 27.png

最后再提一下Github的这篇文章,对我帮助很大,感谢大佬。
https://github.com/tranek/GASDocumentation#concepts-ge

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值