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

Q43: 如何设计属性系统?

核心结论

属性系统不是“把一堆数值放到角色对象里”,而是一套把来源、计算顺序、展示结果和战斗结算边界分清楚的数值组织系统。

真正要先明确的是:

  • 哪些是基础属性
  • 哪些是派生属性
  • 哪些是临时修正
  • 属性最终在什么时机重算

如果这些层次不清晰,后面装备、Buff、技能、天赋一叠加,数值就会失控。

一、属性系统真正要解决什么

它主要解决三个问题:

  • 如何表示角色当前数值状态
  • 如何让多种来源共同作用而不冲突
  • 如何把结果稳定提供给战斗、移动、AI 等系统

所以属性系统既是数据模型,也是计算框架。

二、先把属性按层拆开

1. 基础属性

例如:

  • 力量
  • 敏捷
  • 体质
  • 基础攻击
  • 基础防御

这类属性通常来自角色成长和职业模板。

2. 派生属性

例如:

  • 最大生命
  • 暴击率
  • 命中
  • 闪避
  • 攻击速度

它们往往由基础属性和规则公式推导得出。

3. 修正属性

例如:

  • 装备加成
  • Buff 加成
  • 套装效果
  • 天赋修正

这部分最容易频繁变化。

4. 最终属性

这是经过合并和重算后,真正给战斗和显示层使用的结果。

三、为什么一定要区分“来源”

同一个最终攻击力,可能同时来自:

  • 等级成长
  • 武器数值
  • Buff
  • 技能临时提升
  • 地图或玩法加成

如果系统只存一个最终值,不记录来源,后续就会很难:

  • 追踪问题
  • 撤销效果
  • 排查数值异常

四、计算顺序必须是显式规则

属性系统最容易产生争议的不是“有没有这个字段”,而是:

  • 先加固定值还是先乘百分比
  • 同类加成是否叠乘
  • 上限和下限何时裁剪
  • 小数如何取整

这些都必须是明确、统一、可复用的规则。

否则:

  • 同类效果会互相打架
  • 客户端和服务端容易不一致
  • 数值策划也无法稳定调参

五、不要让每个子系统直接改最终属性

更稳妥的方式通常是:

  • 各系统提交自己的属性修正
  • 属性系统统一汇总和重算

例如 Buff 系统不应直接写死“角色攻击力 += 10”,而应登记一条来源明确的修正项。

这样移除、刷新、叠加都会更好处理。

六、重算策略很关键

属性重算不一定每帧做,也不适合每次所有字段都全量重算。

工程上常见做法是:

  • 变更触发脏标记
  • 按属性组局部重算
  • 在需要读取最终值前保证结果已更新

这能在正确性和性能之间做平衡。

七、属性系统和战斗系统的边界

属性系统负责提供稳定数值输入,战斗系统负责用这些输入进行结算。

例如:

  • 属性系统给出当前攻击、暴击、护甲穿透
  • 战斗系统再决定一次命中和伤害结果

不要把战斗公式和属性源管理完全糊在一起。

八、工程上更稳妥的设计

常见做法是:

  • 属性定义表负责描述字段和计算规则
  • 角色对象维护属性来源集合
  • 属性系统统一合并和重算
  • 战斗、移动、AI 只读最终结果

这让来源清晰、重算可控、调试也更容易。

九、常见误区

1. 属性越多越灵活

字段过多而缺少层次,往往只会让系统更混乱。

2. 最终属性直接缓存一个值就够了

没有来源和规则,后面很难支持复杂叠加与排查。

3. 属性系统只和战斗有关

它还会影响移动、AI、装备、Buff、匹配评分等很多模块。

参考资料

  • 各类 MMO / ARPG 数值框架与属性聚合实践资料
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu