Aura 伤害计算
Aura 的伤害链路并不是“能力里直接扣血”,而是把伤害拆成 Spec 构造 -> Execution 计算 -> Meta Attribute 落地 -> AttributeSet 最终处理 四段。这样做的好处是:标签、抗性、暴击、格挡、击退这些逻辑都能被串在同一条权威结算链里。
目标
这套实现要解决的核心问题有两个:
- 技能发射时就能把本次伤害上下文打包好
- 命中时再基于目标属性、抗性和标签做最终结算
因此 Aura 选择用 GameplayEffectSpec、Execution Calculation 和 MetaAttributes 来承载伤害。
整体链路
1. 技能侧先创建伤害 Spec
通常由 AuraDamageGameplayAbility 或其子类在施法时创建 DamageEffectClass 对应的 SpecHandle:
- 用
MakeOutgoingSpec生成 GameplayEffectSpecHandle - 用
SetByCaller写入不同伤害类型的基础数值 - 把施法者、投射物、命中点等信息写入 EffectContext
【重点】此时只是把“这次伤害需要什么输入”打包好,还没有真正扣血。
2. Context 负责携带额外信息
Aura 在上下文层通常会扩展自己的 FAuraGameplayEffectContext,让它能带上:
- 投射物或技能来源
- 命中结果
- 额外状态位,例如是否暴击、是否格挡
这部分实现可结合 使用EffectContext实现暴击效果传递 一起看。
它的意义是:后面无论在 Execution、GameplayCue 还是 UI 飘字里,都能回溯这次伤害的来源与结果。
3. 命中时应用 Spec,进入 ExecCalc_Damage
真正命中目标后,SpecHandle 才会被应用到目标 ASC。随后进入 ExecCalc_Damage 这类 Execution Calculation。
这一步会做几件关键事:
- 从 Source / Target 捕获属性
- 读取
SetByCaller中不同伤害类型的数值 - 根据伤害类型标签找到对应抗性
- 计算护甲、护甲穿透、格挡、暴击、抗性减免等结果
从 创建伤害类型 可以看到,Aura 会维护一张“伤害类型 Tag -> 抗性 CaptureDef”的映射表,这样 ExecCalc_Damage 就能按标签找到该扣哪一类抗性。
4. 输出到 Meta Attribute,而不是直接改 Health
【重点】Aura 通常不会在 Execution 里直接改 Health,而是先把结果写到 IncomingDamage 这类 Meta Attribute。
这样做的好处是:
- 伤害公式和最终属性落地分开
- 后续可以统一处理死亡、受击、飘字、击退
- 便于在
PostGameplayEffectExecute中集中收口
5. AttributeSet 最终扣血并触发后处理
在 UAuraAttributeSet::PostGameplayEffectExecute 里,系统会读取 IncomingDamage:
- 把值清零
- 扣减真实
Health - 判断是否致死
- 触发命中反馈、死亡、受击、UI 更新等后续逻辑
这也是为什么 Meta Attribute 很适合做“中间结果通道”。
关键参与点
AuraDamageGameplayAbility:准备伤害 Spec 和动态参数GameplayEffectSpec/GameplayEffectSpecHandle:承载本次施法的数据FAuraGameplayEffectContext:携带来源、命中和额外布尔信息ExecCalc_Damage:执行护甲、抗性、暴击、格挡等最终结算UAuraAttributeSet:把IncomingDamage真正落到生命值AuraGameplayTags:统一伤害类型、抗性、状态标签
标签与属性分别扮演什么角色
- 属性:提供连续数值,例如护甲、抗性、暴击率、暴击伤害
- 标签:提供类别和状态,例如火焰伤害、物理伤害、是否可被某种效果影响
【重点】Aura 的伤害系统不是单纯“一个伤害值”,而是“伤害类型标签 + 动态数值 + 上下文”的组合。
为什么这套做法比直接扣血更稳
- 能把伤害计算统一放在服务器权威链路中
- 能和 GAS 的捕获、标签、效果系统自然集成
- 后续加吸血、反伤、Debuff、特殊伤害类型时扩展点清晰
对于 Aura 这种持续扩展的 RPG 框架,这种拆层方式比在技能蓝图里直接减血更容易维护。
实现时要注意
- 【注意】Execution Calculation 默认是服务端权威逻辑,伤害结果不要依赖客户端本地判断。
- 【注意】伤害类型 Tag 和抗性映射表必须同步维护,否则某一类伤害会找不到正确抗性。
- 【注意】
IncomingDamage这类 Meta Attribute 是中转值,不要把它误当成长期状态。 - 【技巧】如果暴击、格挡、命中结果需要在后续 UI 或 GameplayCue 中复用,优先放进
EffectContext而不是散落到多个临时变量里。
最后形成的心智模型
可以把 Aura 的伤害流程记成一句话:
能力负责准备输入,Execution 负责算,Meta Attribute 负责中转,AttributeSet 负责最终落地。