可自由扩展的游戏属性系统:告别硬编码,搭建适配ARPG的通用数值底座
做ARPG、刷子类游戏的人,大概率都踩过属性系统的坑。
项目初期图省事,所有属性直接写死变量:生命值、法力值、力量、伤害、移速……全部用 float 硬编码在脚本里。
看似最快,后续迭代直接崩盘:
- 新增一个属性就要改代码、改初始化、改UI、改计算逻辑;
- 生命蓝量需要单独写一套「当前值/最大值」夹取逻辑;
- 百分比加成、固定数值加成混在一起算错;
- 属性变更只能轮询刷新UI……
越往后维护越痛苦,数值体系杂乱无章,完全无法支撑装备词缀、Buff、随机波动、属性衍生这类重度刷子玩法。
这也是我重构项目底层的核心原因:游戏的数值,永远是动态扩展的。真正能用的属性系统,一定是「配置驱动、对象封装、可无限扩展」的。
今天就分享一套我落地完成、适配暗黑类ARPG、零硬编码、可自由扩展的通用游戏属性系统设计思路,兼顾策划配置效率与程序运行稳定性。
一、传统硬编码属性系统的致命缺陷
绝大多数新手项目的属性写法,都是典型的「增量式堆砌」:
@export var health: float = 100.0
@export var mana: float = 50.0
@export var strength: float = 10.0
@export var damage: float = 10.0这种写法,只适合Demo原型,完全撑不起正式项目,核心问题有四个:
1. 属性形态无区分,逻辑高度冗余
生命、法力是「两段式属性」(有上限、有当前值、可消耗可回满);力量、伤害是「单值属性」;五大主属性是「衍生源属性」。硬编码写法把所有属性当成同一种数值,导致两段式属性的夹取、判空、回满逻辑,需要反复手写复制,代码极度冗余。
2. 加成体系混乱,结算规则不统一
装备、Buff带来的百分比提升、固定数值加成,没有统一结算公式,有的先乘后加、有的先加后乘,数值极易崩坏,完全做不了复杂词缀体系。
3. 无动态扩展能力,新增属性必改代码
每新增一个抗性、攻速、暴击属性,都需要改实体脚本、改初始化、改UI、改计算逻辑,策划完全无法独立配置。
4. 无事件通知,UI交互极其笨拙
属性变化没有信号回调,血条、蓝条、状态提示只能靠每帧轮询,性能差、耦合高,体验极差。
二、核心设计思路:用「类层次+配置表」实现无限扩展
想要属性系统可自由扩展,核心思路只有一句话:程序定义规则,策划定义内容。
我将整套属性系统拆分为运行时对象层 + 数据表配置层,彻底解耦:
- 代码层:定义三种属性通用类,覆盖所有属性形态,封装统一计算、变更、事件逻辑
- 配置层:用CSV表格统一管理所有属性、显示名、衍生公式,新增属性无需改一行代码
1. 三层类层次:彻底区分所有属性形态
摒弃单一属性类硬塞所有逻辑的写法,用继承精准区分属性类型,结构清晰、按需扩展:
Attribute (通用单值基类)
├─ PhaseAttribute (两段式属性:生命/法力/体力)
└─ DerivedAttribute (基础主属性:力量/敏捷/智力/精神/体力)Attribute 基类:所有属性的通用能力
所有属性共享一套核心能力,统一结算规则:
- 基准值 value + 随机波动 min/max(适配装备随机词条)
- 百分比提升 increase + 固定加值 bonus(适配所有Buff、装备加成)
- 双取值逻辑:
roll_value()战斗随机结算、display_value()UI稳定展示
统一结算公式(全局唯一,永不混乱):
最终值 = (基准值 + 随机波动偏移) × (1 + 百分比提升) + 固定加值核心规则:固定加值不受百分比放大,完全贴合暗黑类游戏数值设计逻辑。
PhaseAttribute 两段式属性:适配消耗型数值
专门服务生命、法力、体力这类「有上限、可消耗」的属性,扩展专属能力:
- 独立当前值 current_value,自动夹取 0~最大上限
- 封装 add/subtract/refill/is_empty 通用方法
- 属性变更信号,自动通知UI与战斗逻辑
从此不需要手写任何血量判断、满血重置、死亡判定逻辑,一行调用即可。
DerivedAttribute 衍生主属性:搭建数值联动体系
力量、敏捷、智力等五大主属性,作为整个数值体系的「源头」,支撑全局属性衍生。自身为纯单值,通过配置表公式,自动派生伤害、生命上限、暴击、闪避等二级属性。
2. 三张CSV表,实现策划自由配置
整套系统仅靠三张数据表,实现零代码新增、修改、删除属性,完全解放程序:
attributes.csv:属性定义总表
定义所有属性的ID、名称、形态、类别、默认值,通过 kind 自动匹配对应运行时类:
- single → 普通单值属性(移速、伤害)
- two_phase → 两段式属性(生命、法力)
- base → 基础衍生主属性(五大主属性)
attribute_display.csv:属性UI名称表
单独管理属性子项显示名(基础值、波动、百分比提升、固定加值),适配装备词条、面板详情展示,无需硬编码中文。
derivations.csv:属性衍生公式表
整个系统最核心的「扩展能力」。策划可自由配置:哪个主属性、通过什么公式、派生哪个二级属性。比如体力衍生生命、力量衍生伤害、敏捷衍生暴击,全部表格配置,无需改动代码,后续新增任何衍生规则都可直接拓展。
三、标准化初始化流程,杜绝数值异常
可扩展系统必须配套标准化流程,否则配置越自由,BUG越多。我统一了所有单位的属性初始化逻辑:
- 读取单位模板数据 + 属性配置表
- 根据属性类型自动实例化对应属性对象
- 加载基础值、随机波动范围、初始加成
- 执行衍生计算,由主属性自动刷新二级属性
- 两段式属性自动满血/满蓝,绑定变更信号
所有角色、怪物、NPC 共用一套流程,属性初始化完全统一,彻底杜绝数值不一致问题。
四、这套系统的核心优势:为什么适配刷子ARPG?
1. 无限横向扩展,适配海量词条属性
后续新增抗性、攻速、格挡、MF掉宝率等任意属性,只需要在表格新增一行,无需改代码、无需改逻辑,完美适配暗黑类海量随机词条玩法。
2. 数值规则统一,杜绝结算BUG
全局唯一的加成结算公式、波动规则、夹取逻辑,无论多少层装备、Buff叠加,数值计算永远稳定,不会出现前后端不一致、结算错乱问题。
3. 策划完全自主可控
属性数值、衍生关系、UI名称、波动范围,全部由策划配置,不用频繁找程序改逻辑,迭代效率翻倍。
4. 低耦合高复用,适配全场景
角色、怪物、BOSS、NPC 全部复用一套属性对象,代码极简、复用性极强,后续拓展宠物、召唤物、道具属性也可无缝接入。
五、AI时代,游戏底层架构的真正价值
最近一直在用 OpenCode + 免费 DeepSeek 模型开发整套项目,最大的感受是:AI可以快速写代码、搭逻辑,但无法帮你设计底层架构。
很多人用AI做游戏,堆出一堆功能,最后因为属性系统硬编码、架构混乱,导致后续完全无法迭代,越做越烂。
真正可长期迭代的游戏项目,核心从来不是「代码多快写完」,而是架构是否可扩展、规则是否统一、体系是否闭环。
这套可自由扩展的属性系统,本质是给整个游戏的数值体系立下「规矩」:
程序负责规则,策划负责内容;代码负责底层,表格负责玩法。
AI帮我们高效落地实现,而我们作为设计者,把控游戏的数值节奏与核心乐趣——这就是AI时代,游戏制作人真正的核心价值。
六、结语
一个好的属性系统,不是「能存数值」,而是「能承载无限玩法」。
告别硬编码的零散变量,用「分层对象 + 配置驱动」的架构,搭建一套通用、稳定、可无限扩展的数值底座。
它可以支撑简单的小游戏,也可以迭代成暗黑类重度刷子ARPG,适配随机词条、装备体系、Buff叠加、属性衍生所有核心玩法。
后续我会继续更新:整套属性系统的完整GDScript源码、三张CSV配置表模板、AI辅助落地开发的全过程实操。
原创|游戏魂 专注游戏策划、架构设计、AI游戏开发实战