Apollo 技术文档Apollo 技术文档
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
  • MMORPG 架构 QA

Q55: 如何设计伤害计算?

核心结论

伤害计算不是“写一个公式”,而是把一套数值规则稳定地嵌入战斗状态机里。

真正需要先设计清楚的是:

  • 伤害由哪些阶段组成
  • 属性从哪里取
  • 免伤、护盾、暴击、穿透按什么顺序生效
  • 最终结果如何裁剪和取整

如果顺序和边界不清晰,同样的属性在不同场景下就会算出不同结果。

一、伤害计算真正要解决什么

它要回答的不只是“扣多少血”,还包括:

  • 是否命中
  • 是否暴击
  • 是否被格挡或闪避
  • 是否被护盾吸收
  • 是否触发反伤、吸血、连锁效果

所以伤害计算更像一条结算流水线。

二、先把伤害流程拆阶段

一个常见流程通常包括:

  1. 前置合法性判断
  2. 命中判定
  3. 基础伤害计算
  4. 技能倍率和属性修正
  5. 暴击、穿透、减伤、护盾等修正
  6. 最终裁剪和取整
  7. 触发后续效果

这样做的价值是让所有效果有明确插入点。

三、顺序比公式本身更重要

很多争议并不是公式错,而是顺序不统一。

例如:

  • 暴击是在减伤前还是减伤后
  • 护盾在最终伤害前还是后吸收
  • 穿透作用在面板防御还是最终减伤率

这些必须是系统级规则,而不是每个技能各算各的。

四、伤害计算要和属性系统解耦

属性系统负责提供:

  • 攻击
  • 防御
  • 暴击率
  • 穿透

伤害系统负责使用这些输入进行结算。

如果属性来源、Buff 修正和伤害结算全揉在一起,后面很难排查问题。

五、护盾、减伤、穿透是最容易出歧义的地方

因为这些机制经常叠加:

  • 固定减伤
  • 百分比减伤
  • 护盾吸收
  • 属性穿透
  • 元素抗性

如果没有统一顺序,策划和程序对同一配置的理解就会不一致。

六、伤害系统一定要考虑下限、上限和取整

例如:

  • 是否允许 0 伤害
  • 最低是否至少扣 1
  • 小数向上、向下还是四舍五入

这些看似小事,但长期会影响玩家感知和数值平衡。

七、随机浮动要克制

伤害浮动能增加表现丰富度,但不宜过大。

浮动过大时,玩家会感觉:

  • 结果不可预测
  • 数值不稳定
  • 平衡难理解

所以浮动通常只是调味,不应成为主要平衡手段。

八、工程上更稳妥的设计

常见做法是:

  • 伤害结算按固定阶段执行
  • 每阶段输入输出可记录
  • 复杂效果通过标准化修正节点插入
  • 最终结果由权威服务端统一裁定

这既方便调试,也方便后续扩展元素伤害、真实伤害、DOT、反伤等机制。

九、常见误区

1. 伤害公式越复杂越高级

不对。复杂不等于好,稳定、可解释、可调才更重要。

2. 只要面板属性对了,伤害就不会错

不对。结算顺序和特殊机制往往更容易出问题。

3. 每个技能写自己的一套伤害公式最灵活

这会很快导致系统不可维护,最好建立统一结算框架。

参考资料

  • 各类 MMO / ARPG 数值结算与战斗流水线实践资料
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu