今天第一篇讲的是技术侧的碰撞层与遮罩。第二篇换个方向,讲一个几乎没人教、但直接决定「游戏好不好玩、能玩多久」的东西:游戏内经济系统。

大多数独立游戏的数值崩掉,不是因为公式写得难看,而是因为没有设计过钱的出入口:前期穷得买不起药,中期钱多到没处花,后期经济彻底失去意义。这不是平衡问题,是结构问题。

今日速览

  • 经济系统 = 水龙头(Faucet,产出)× 下水道(Drain,消耗),你调的不是数字,是这两根管子的流量比。
  • 定价别看感觉,看「小时收入」:先算出玩家每小时的货币产出,再用「这件东西应该花玩家多少分钟」反推价格。
  • 产出略大于消耗 = 通胀(钱变废纸);消耗略大于产出 = 焦虑(不敢花钱);健康区间通常是消耗 ≈ 产出的 90%~110%。
  • 货币要分层:可消费的软通货、稀缺的硬通货、不可消费的声望/进度,三层各管一种情绪。
  • Godot 4 用 Resource + 表格驱动数值(官方文档明确:Resource 是纯数据容器,节点只负责使用它),让 DeepSeek 帮你算曲线而不是硬编码在脚本里。

一、先把两根管子列出来

水龙头(产出):击杀掉落、任务奖励、卖战利品、被动产出(矿场/农场)、首次通关奖励、成就奖励。

下水道(消耗):装备升级、消耗品(药水/弹药)、修理费、复活费、抽卡/开箱、装饰与外观、税费/手续费、仓储扩容。

实操第一步不是写代码,而是把上面两列各写 5 条,然后在每条后面标上「每局触发次数」。这一步做完,80% 的经济崩坏就已经能看出来了——比如「卖战利品」每局触发 20 次,而「消耗品」每局只用 1 次,那货币必然堆积。

二、三步定价法

  1. 定时间单位:一局多少分钟?(例:8 分钟)
  2. 算小时收入:一局产出 ÷ 单局时长 × 60。(例:一局 120 金币 → 15 金币/分钟 → 900 金币/小时)
  3. 反推价格:给每件商品定一个「应该花多少分钟」的目标值,乘以分钟产出。
    • 第一把武器升级 = 20 分钟收入 → 300 金币
    • 中期核心装备 = 90 分钟收入 → 1350 金币
    • 纯装饰皮肤 = 180 分钟收入(只服务炫耀,不影响强度)

这套方法的好处是跨系统自洽:新增一种敌人、改一次掉落率,只需重算「分钟产出」,所有价格跟着一起动,不会出现某一件装备突然贵得离谱。

三、用「存量曲线」诊断经济

把横轴设为游戏时长,纵轴设为「玩家手里的钱」,画出累计产出与累计消耗两条线:

  • 两线持续张开 → 通胀:玩家钱越来越多,商店失去意义。对策:加一个大额消耗口(房屋/船/公会/一次性大升级),或让高价商品价格随进度上浮。
  • 消耗线长期压在产出线上 → 枯竭:玩家一直穷,被迫刷。对策:提高关键节点产出,或把「必需消耗」(修理、药水)改成可选。
  • 两线平行且间距稳定 → 健康:玩家既有积蓄的安全感,又有明确的下一目标。

一个很好用的验收标准:玩家在任意时刻,都应该「买得起下一件想要的东西,但买不起全部」。

四、Godot 4 落地:数据驱动,不硬编码

按 Godot 官方文档的说法,Resource 是纯数据容器、节点只负责使用数据;而且同一资源在内存里只会加载一份。所以经济数值应该做成 .tres 资源或 CSV 表,而不是散落在 if 里:

  • 建 ItemData(继承 Resource):id / 名称 / 价格 / 货币类型 / 解锁条件
  • 建 EconomyManager(Autoload 单例):统一 add_currency() / try_spend(),成功才发 currency_changed 信号
  • 所有 UI 只监听信号,不直接改数值——这样后期加「打折」「双倍活动」只需改一处

代码可以让 DeepSeek 写,但数值必须你自己定,因为只有你知道「玩家该有多爽」。

🎯 DeepSeek 提示词

① 经济模型设计器(从零搭出 faucet/drain 表)

你是一位做过 3 款 Steam 商业游戏的经济系统设计师。请帮我设计一款游戏的经济模型。

【输入】
- 游戏类型与核心循环:__(例:2D 俯视角 Roguelite,8 分钟一局,局内成长+局外永久解锁)
- 单局时长:__ 分钟;目标总游玩时长:__ 小时
- 现有货币/资源:__(如金币、碎片、声望)
- 我希望玩家在什么阶段感到「爽」或「紧」:__

【任务】
1. 列出至少 6 个 Faucet(产出)与 6 个 Drain(消耗),每个标注:每局触发次数、单次数量、是否可被玩家主动控制。
2. 算出「每分钟货币产出」,并用「目标购买分钟数」反推 8~10 件商品的价格(给出价格表:商品/目标分钟/价格/所处阶段)。
3. 预测前 1 小时、5 小时、20 小时的货币存量,指出最可能出现通胀或枯竭的时间点。
4. 给出 3 个大额消耗口(sink)方案,用于吸收中期通胀。

【输出格式】
Markdown 三张表 + 一段「风险提示」;数字保留整数。

【约束】
- 不要引入付费货币或抽卡,除非我明确要求。
- 所有数字必须能互相推导(价格 = 分钟产出 × 目标分钟),不许拍脑袋。
- 如果我的输入信息不足,先问 3 个最关键的问题,不要自己假设。

② Godot 4 经济管理器代码生成

你是资深 Godot 4(GDScript,静态类型)开发者。请为我生成一个经济系统模块。

【需求】
- 一个 Autoload 单例 EconomyManager,管理多种货币(金币/碎片),内部用 Dictionary[String, int] 存储
- API:add_currency(type: String, amount: int)、try_spend(type: String, amount: int) -> bool(不足时返回 false 且不发信号)、get_balance(type) -> int
- 每次数值变化发出 signal currency_changed(type: String, old_value: int, new_value: int)
- 支持存档:to_dict() / from_dict(data: Dictionary),缺字段时用默认值 0,不报错
- 价格表用 Resource 驱动:给出 ItemData(继承 Resource,含 id/display_name/price/currency_type)示例代码
- 附带一个最小使用示例:商店按钮点击 → try_spend → 成功才发奖励

【约束】
- 全部使用静态类型标注,函数写 docstring(##)
- 不依赖任何第三方插件,只用 Godot 4 内置 API
- 金额变化做边界保护:amount <= 0 直接返回,不允许负数余额
- 代码块分段给出,每段前用一行中文说明用途;最后列出「常见误用」3 条

③ 数值体检官(诊断通胀/枯竭)

你是游戏数值分析师。我会贴出我的经济数值表,请帮我做体检。

【输入】
- 单局时长:__ 分钟;平均每局产出:__(分货币列出)
- 商品价格表:__(商品名/价格/解锁阶段)
- 玩家反馈或实测数据:__(如「第三章之后钱花不完」)

【任务】
1. 计算每分钟产出、每小时产出,以及「回本时间」(买到某件商品需要玩多久)。
2. 判断当前处于通胀 / 枯竭 / 健康,并指出最早出现问题的章节与原因(要引用具体数字)。
3. 给出调整方案:优先改产出、改价格还是加 sink?给出具体改法(原值 → 新值),并说明改后对存量曲线的影响。
4. 指出 3 个「看起来没问题、但会破坏长期经济」的隐患。

【输出格式】
诊断结论(3 句以内)→ 数据表 → 修改建议表(项目/原值/新值/理由)→ 隐患清单。

【约束】
- 只做数值层面的建议,不要建议增加新系统。
- 每条建议必须可量化,禁止「适当提高」「略微下调」这类模糊表述。
- 如果数据不足以判断,明确列出缺哪几项数据。

学习心得

做 Steam 游戏,玩家评价里最伤人的一句话不是「画面差」,而是「后期没意思」。而「后期没意思」很多时候就是经济崩了——钱没处花,或者永远差一点。

对我们这条「用 DeepSeek 从零做游戏」的路线来说,这件事的意义很具体:代码可以外包给 AI,数值设计不能。DeepSeek 很擅长按公式推导、批量生成价格表和检查一致性,但它不知道你的游戏「爽点」在哪。所以正确的分工是:我定「玩家应该多久买到下一件东西」,让它去算所有价格、生成代码、做体检。

明日关注

  • 给自己当前的 demo 列出 5 个 Faucet 与 5 个 Drain,标上每局触发次数
  • 用提示词①跑一遍经济模型,把生成的价格表存成 ItemData 资源
  • 记录首小时实测的金币存量,画出第一条存量曲线,验证是否「买得起下一件、买不起全部」

本文由自动化学习流水线每日生成,坚持即学即记。