全程用 AI 做一款商业级手游 · EP4 经济系统:让“留存“自动变成“变现“
前三集把"玩法"立住了(地基 → 核心循环 → 数据化)。从这一集(EP4)起走进商业化——而商业化的第一块、也是最关键的一块,是经济系统。
EP0 讲过,商业 F2P 最反直觉的设计就在这里:成熟休闲游戏的商城不是定额金币包。同一个 6 元档,玩家进度浅时买和进度深时买,拿到的金币差近百倍。为什么这么设计?因为定额包到游戏中后期就没吸引力了——“让同价位的价值随玩家进度涨”,才能把留存直接变成变现。这一集就把这条曲线做出来。
一点要先说清楚:这类休闲消除的成熟做法多是关卡制,"进度"就是第几关。而我们这款 Block Blast 是无尽计分游戏,没有关卡、也不做等级制——所以这条曲线直接骑玩家最高分这条进度线(玩家打出的历史最高分,越高 = 玩家越投入)。机制完全一样:进度越深,同样的钱越值。下文代码里的
level形参就是这条进度入参,喂进去的是玩家最高分;最高分 1/最高分 8338就是这条进度线的两端。
货币 Model:只能通过一个口子改动
金币是 EP1 那套自动存档的 Property,但不允许谁都能改——只能走 ChangeCoin,它顺带广播变更消息(UI、商城、成就各自订阅),reason 字段是经济埋点的抓手。
public class CoinModel : Singleton<CoinModel>
{
public readonly Property<int> Coin = new("coin.amount", 0);
public bool CanAfford(int cost) => Coin.Value >= cost;
public bool ChangeCoin(int delta, string reason)
{
if (delta < 0 && Coin.Value + delta < 0) return false; // 余额不足,拒绝扣费
Coin.Value += delta;
MsgController.Send(new CoinChangedMsg { newAmount = Coin.Value, delta = delta, reason = reason });
return true;
}
}
命脉:进度缩放经济曲线
最终金币不是一个定数,而是算出来的:
最终金币 = Round( coef × milestone(玩家最高分) / step ) × step
└系数┘ └──────缩放曲线──────┘ └─取整─┘
(每个SKU) (随进度放大) (UI 漂亮整数)
- coef:每个 SKU 的定额系数(包的"大小"),$1.99 档 coef=2.2,高价档系数更大、每美元金币更多(鼓励上探)。
- milestone(最高分):随进度放大的阶梯函数,新手期平、中后期陡涨,封顶。
- step:把结果取整到漂亮档位(100 / 1K / 5K / 10K…),免得显示成
66,768这种廉价数字。 - Round:银行家舍入。
做成数据资产(EconomyConfig,可服务端下发):
public int CoinsFor(float coef, int level)
{
float raw = coef * Milestone(level);
int step = StepFor(level);
long units = (long)System.Math.Round(raw / step, System.MidpointRounding.ToEven);
return (int)(units * step); // 取整到 step 的整数倍
}
配出来的曲线长这样——同一个 $1.99 包(coef=2.2),金币从最高分 1 的 2,200 一路阶梯放大到封顶最高分 8338 的 260,000:

阶梯形是 milestone 断点 + 取整一起造成的:每跨过一个断点,金币跳一档;每一档内取整到漂亮数字。这条曲线就是"留存变现"的引擎——玩家打得越深,同样的钱越值,越值得买。
这条曲线最终在商城里长这样(下一集 EP5 接好 UI 后,Unity 里实拍)——同一份目录,左新手(最高分 1)、右封顶(最高分 8338),价格没变,金币随进度整体放大约 118 倍:


验证:13 条断言
PASS A Milestone(1)==1000 / (50)==1500 / (20000)==119000封顶
PASS B milestone 单调非降
$1.99(coef=2.2): 最高分1=2,200 最高分8338=260,000 放大≈118x
PASS C 后期金币 > 前期
PASS C 封顶放大 > 50x(设计约118x)
PASS D 最高分1 金币是 step(100) 的整数倍 / 最高分8000 是 step(10000) 的整数倍
PASS E +100→余额100 / -50成功→50 / 余额不足扣费被拒(返回false且不变)
PASS E 变更消息触发2次(拒绝那次不发) / 末次delta==-50
==== 13/13 PASS ====
钉死的几条最关键:曲线单调非降(不能出现进度更深反而给更少)、同 SKU 封顶放大约 118x(设计目标)、金币永远是 step 的整数倍(UI 漂亮)、扣费余额不足必须被拒且余额不变(防负数/超扣)、变更必须广播且拒绝的那次不发消息。经济的对错,全是钱,错一点都不行——所以用断言钉死。
这一集的产物与诚实的话
CoinModel(货币 + 变更广播)+EconomyConfig(缩放曲线 + 取整,数据资产)。EconomyConfig.asset放进 Resources(6 个 milestone 断点 + 4 个取整档,运行时加载)。- 13 条断言全绿,含约 118x 放大实测(milestone 曲线本身 1,000→119,000 放大 119x,$1.99 档取整后 2,200→260,000 约 118x)。
诚实地讲:这一集只做了"经济的算法层"——曲线、系数、取整、货币账本。还没有商城界面、没有真内购(那是 EP5:接 Unity IAP、做商城面板)。而且我用的是 6 个断点的简化曲线,真实商业游戏那条往往是几百个断点的精调曲线(这也正说明为什么必须数据化——几百行断点不可能硬编码进代码)。但"金币随进度(最高分)缩放"这个商业化命脉的算法,已经建好并验证了。
下一篇 EP5:商城 + 内购——接 Unity Purchasing,做商城面板,把这条经济曲线接到真实的 SKU 和购买流程上。
- 工具:funplay-unity-mcp
- 开源工程:本系列做出来的完整 Unity 工程已开源
- 上一篇:EP3 内容数据化
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)