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 守门外禁止手改。
