GameplayEffect:修改的唯一通道

GE 是配置资产而非代码

GE 本质是一个描述"如何修改属性"的数据资产,主要内容:

字段 内容
Duration Policy Instant(立即)/ Duration(有时长)/ Infinite(无限直到移除)
Modifiers 修改哪个属性、加多少或乘多少
Granted Tags 附带授予的标签(Buff 的"身份")
Application Conditions 应用条件(标签查询)
Stacking 堆叠规则(层数)

三种时长对照

Duration Policy 例子 何时清理
Instant 立即伤害、回血 应用后即完成
Duration 10 秒加速 计时结束自动移除
Infinite 光环、装备属性 手动 RemoveEffectWithTags

Modifier 的三种操作模式

对每个 Modifier 可以选:

模式 效果 例子
Add 加一个数 Health +50
Multiply 乘一个系数 Damage × 1.5(暴击)
Override 直接覆盖 把 Slow 状态设为固定值

Modifier 的"值"可以是:固定数字(ScalableFloat)、曲线表(按等级变化)、自定义计算类(MMC,下文)。

一个完整的回血 GE

GE_HealPotion
├─ Duration Policy: Instant
├─ Modifier
│   ├─ Attribute: Health
│   ├─ Op: Add
│   └─ ScalableFloat: 50
├─ Granted Tags: 无
└─ Application Conditions: 无(谁都能用)

应用它:

FGameplayEffectContextHandle Ctx = ASC->MakeEffectContext();
FGameplayEffectSpecHandle Spec = ASC->MakeOutgoingSpec(GE_HealPotion, 1.f, Ctx);
ASC->ApplyGameplayEffectSpecToSelf(*Spec.Data.Get());

为什么说"手改属性是禁忌"

GAS 的可追溯、复制、预测、回滚全部建立在"修改必须经过 GE"上: - 直接改 Set 的CurrentValue → 该修改不会同步给客户端; - 多人下 Server 权威修正 → 客户端永远看不到; - 预测回滚机制会把直接改值当成"回滚目标"给冲掉。

一个例外:PostGameplayEffectExecute 里对属性做 Clamp(见第 5 页坑一)——这是框架允许的"守门"位置。

本章小结

  • GE 是配置资产:Duration 三态(Instant/Duration/Infinite)+ Modifier 三模式(Add/Multiply/Override)。
  • 应用 GE 的标准三行代码(MakeEffectContext → MakeOutgoingSpec → Apply...)。
  • 直接改属性会破坏同步/预测/回滚,除 Clamp 守门外禁止手改。