Wiki
1193 words
6 minutes
Aura 伤害计算
Updated 2025-04-30

Aura 伤害计算#

Aura 的伤害链路并不是“能力里直接扣血”,而是把伤害拆成 Spec 构造 -> Execution 计算 -> Meta Attribute 落地 -> AttributeSet 最终处理 四段。这样做的好处是:标签、抗性、暴击、格挡、击退这些逻辑都能被串在同一条权威结算链里。

目标#

这套实现要解决的核心问题有两个:

  • 技能发射时就能把本次伤害上下文打包好
  • 命中时再基于目标属性、抗性和标签做最终结算

因此 Aura 选择用 GameplayEffectSpecExecution CalculationMetaAttributes 来承载伤害。

整体链路#

1. 技能侧先创建伤害 Spec#

通常由 AuraDamageGameplayAbility 或其子类在施法时创建 DamageEffectClass 对应的 SpecHandle

【重点】此时只是把“这次伤害需要什么输入”打包好,还没有真正扣血。

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 负责最终落地。

关联笔记#

Aura 伤害计算
https://fuwari.vercel.app/wiki/unreal/gas/aura/伤害计算/
Author
Qingswe
Published at
2025-04-30
License
CC BY-NC-SA 4.0