UE4 GAS GamplayEffect 简单总结①
2023-08-27 09:10:45 哔哩哔哩

注意,这只是一个基于个人学习经验的简单尝试性总结,可能会出现错误,硬要说的话本人也没有对此完全地掌握。如果您发现其中错误了,请务必提出。

指定教材 《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。

相关新闻: