注意,这只是一个基于个人学习经验的简单尝试性总结,可能会出现错误,硬要说的话本人也没有对此完全地掌握。如果您发现其中错误了,请务必提出。
指定教材 《GASDocumentation》
目录
(资料图片仅供参考)
一 认识结构
二 持续策略
三 Modifier
四 Execution
一 认识结构
GameplayEffect(后续简称GE)
此处省略一堆介绍语
GE的持续策略有三种,分别是Instant(瞬时)、Infinite(无限)和HasDuration(有持续时间)。
GE的属性修改可以分为两类,一个是通过Modifier进行修改,还有一种是借助Execution。此外,Modifier有四种方式,分别是 ScalableFloat、AttributeBased、CustomCulculationclass和SetByCaller。后续会分别介绍。
这里补一张导图。
二 持续策略
① Instant策略 (间歇地,即设置了周期触发的,也可以视为瞬时的)
* 仅有瞬时类型的GE,会触发AttributeSet的PostGameplayEffectExecute方法
* 仅有瞬时类型的GE,能够使用Execution Calculation [ExecCalc]
* 对于Instant类型所携带的GameplayCue,具体为GameplayCueNotifyStatic子类,可以使用HandleGameplayCueEvent或OnExecution,复写两个方法任意一个即可。
② Infinite策略(Duration策略与之类似,两者可以统称为Ongoing类型),
* 对于Ongoing类型所携带的GameplayCue,具体为GameplayCueNotifyStatic子类,会在添加时触发OnActive,会在移除时触发OnRemove,不应当尝试触发HandleGameplayCueEvent。
三 Modifier
① ScalableFloat
可以传入一个CurveTable,完成由等级到数值的映射,没什么好说的,最常用的方式。
② AttributedBase
基于其他属性的计算与修改,比①稍微复杂一点方式。
示例:恢复最大生命值的12%。
过程:需要先指定BackingAttribute为MaxHP,然后在Coefficient一栏填写 ,最后指定赋予的属性。
③ CustomCulculationclass 即ModMag
最好C++来实现,但可以考虑使用蓝图子类修改其中部分的预设数值。
非常实用的方式,可以一次捕捉多个属性并赋给另一个属性。
示例:角色的攻击力AttackPower 往往是由多个属性决定的,如等级,攻击力加成,攻击点数等。
公式: AttackPower = [(ATK + Level * 2) + Add] * (1 + Mul)
过程:
* 可以在C++中定义Float数值,在蓝图子类中修改。
* 可以在C++中定义FCurveTableRowHandle,在蓝图子类中指定相应的CurveTable
* 以攻击力计算GE为例,它是Infinite策略,会在游戏开始时就交给角色。
④ SetByCaller
通常为在GA中计算得到了一个数值,然后想要在GE中应用该数值,会用到该方式。
如在GA中计算了一个基础伤害,希望它能够传递至GE中,以进行进一步的伤害计算。
一般使用GameplayTag来传递该数值。
过程:
四、Execution 处理器
最强大的属性处理方式,仅支持Instant类型。
你几乎可以在UGameplayEffectExecutionCalculation类中做你想做的任何事,唯一的缺点是需要被重写的Execute_Implementation是一个const方法,会有些许不便。
在ARPGSample项目中有一个完整且详细的案例,这里就不贴代码了。一般的,会在复杂的伤害计算时用到它。
* 之前有一篇教程,提及如何将GA实例以及其他复杂结构体传到 Execution中。具体方式为重写了FGameplayEffectContext。