
塔防
🏦 场景与客户
一家十几人的独立工作室,正在做一款塔防手游,目标平台 iOS / Android,跑通后移植到 Steam。团队配比很紧:策划 2 人、程序 3 人、美术 3 人。
原来的做法是数值全堆在策划的表格里,关卡靠编辑器手摆。做到第四十关左右开始失控:新增一座塔,前面几十关的难度曲线全被推翻;改一次数值要人工同步到预制体,漏改一次就是线上事故。玩家反馈集中在两点——要么无脑碾压,要么某一波突然崩盘,中间的过渡区间几乎不存在。
📅 实施节奏
- 第 1–2 周:把散落在表格与预制体里的数值全部抽出来,定义塔、敌人、波次三类配置表,确立唯一数据源
- 第 3–4 周:做波次曲线工具,把每波敌人构成与玩家预期战力画成同一条曲线,策划改完立刻看到形状变化
- 第 5–6 周:接入固定步长的战斗模拟,关卡可在无渲染模式下跑完整局,输出通关时间、剩余血量、漏怪数
- 第 7 周起:把模拟器接进持续集成,每次改数值自动跑全部关卡,超出容差就报警
🗝️ 方案要点
- 数值与代码彻底分离:所有塔与敌人参数来自配置表,程序里不出现魔法数字。改数值不发版,只推表
- 固定步长模拟:战斗逻辑按固定时间片推进,帧率只影响画面。同一份输入在任何机器上跑出的结果一致,才谈得上验证
- 克制矩阵可视化:把塔与护甲类型的伤害倍率做成一张热力表,一眼能看出哪种组合超模、哪种组合无人问津
- 产能与消耗对齐:每关的金钱产出曲线与建塔消耗曲线放在同一张图里,避免出现「钱多到随便造」或「全程只够放两座」
⚖️ 选型与权衡
| 选择点 | 方案 | 权衡 |
|---|---|---|
| 引擎 | 沿用现成商业引擎 | 省掉工具链从零搭建的几个月;代价是包体偏大,首包体积与转化率要额外做资源分级来补 |
| 战斗逻辑 | 固定步长 + 确定性 | 可回归、可回放、可做战斗验证;代价是浮点运算要统一处理,写起来比随手写麻烦 |
| 关卡设计 | 手摆 + 工具校验 | 保留策划的表达意图;纯程序生成省人力但节奏感差,玩家能感觉出「机器摆的」 |
| 难度曲线 | 按模拟数据调,不按体感调 | 可复现、新人也能上手;代价是策划的直觉被压住,改动要等模拟跑完才能下结论 |
🚧 实施难点与排查
- 数值改了但线上没变:早期配置表被两个地方各自缓存,改完只热更了一处。根因是双数据源,收敛到唯一来源后解决
- 同一关在不同机型结果不同:渲染帧率被误当成逻辑步长用。改为逻辑与渲染解耦,帧率只决定插值表现
- 后期波次变成数值堆叠:只加血量不加机制,玩家疲劳。改为每个大关引入一个新变量(护甲、飞行、分路),并保证老关卡不被这个变量推翻
💵 成本与收益
- 成本:工具开发约 1 人 × 5 周;模拟器吃的是本地算力,几乎不产生持续费用
- 收益:改一次数值的验证时间从「人工玩两小时」变成「自动跑几分钟」;线上因数值错配导致的紧急发版明显减少
- 省钱的点:把问题挡在提交之前,比上线后热修便宜——热修不止人力,还有渠道审核的等待时间
🛡️ 风险与保障
- 配置安全:配置表入库前做结构与范围校验,出现负数价格、零血量这类异常直接拒绝
- 可回滚:每次配置变更留版本,线上异常可退回上一版
- 进度保护:玩家存档与数值版本解耦,改数值不能让老玩家的进度失效
- 防作弊:离线收益与结算结果在服务端复算,客户端只做表现
♾️ 可复用与演进
- 同一套「配置唯一源 + 固定步长模拟 + 自动回归」可以平移到任何有数值曲线的品类,不只是塔防
- 演进方向:把模拟器接进自动调参,给定目标曲线反推波次构成,策划只做取舍
- 再进一步:用真实玩家的通关数据回流,找出模拟与实战偏差最大的关卡重点排查













































































































