下载 App
《我真没让他们建城啊!》开发者日志 01
修改于10/1620 浏览
立项与涌现 你不能造房子,不能修路,也不能命令任何一个小人。 你只能改变环境,然后眼睁睁看着他们自己把文明搞出来。
类型: 微型文明模拟 / 群体 AI / 上帝游戏 / 轻 Roguelite 主题: 涌现 单局时长: 约 15 分钟 当前进度: 核心系统可运行原型完成
一、立项:一个抽象的主题词,怎么变成一款能玩的东西 拿到主题「涌现」的时候,第一反应其实是懵的。
因为「涌现」和「跳跃」「解谜」「收集」不一样——它不是一个玩法,它是一个现象。你没法让玩家"按 A 键来涌现"。如果照着字面做,很容易做成两种情况:
一种是假涌现:写一堆 if-else,在特定条件下播放"村庄出现了"的动画。玩家一眼看穿是脚本,没有惊喜。 一种是炫技涌现:堆一个康威生命游戏或者粒子物理,确实"涌现"了,但没人知道该怎么玩。 所以立项的第一步不是想玩法,而是先把主题翻译成一句可执行的话。
我的推导是这样的:
涌现 = 简单规则 × 大量个体 × 局部交互 → 复杂全局结构 拆开看,三个要素缺一不可:
简单规则——个体本身必须足够笨。如果每个小人都很聪明,那复杂结构就是"聪明人商量出来的",不是涌现。 大量个体——单个蚂蚁没有智慧,蚁群才有。数量本身就是系统的一部分。 局部交互——每个个体只能看到自己周围一小块,没有全局视野。全局结构必须从局部信息里长出来。 于是,游戏的形态就自动被限制死了:
玩家绝对不能直接建造任何东西。
因为一旦玩家能点"建造村庄",那村庄就是玩家造的,不是涌现的。这个游戏就死了。
这就是整个项目的第一公理,也是最重要的设计红线:
玩家只能改变环境,不能下达命令。
我把它进一步固化成三条不可违背的原则:
原则 含义 反面教材 玩家不建造 没有"建造房屋"按钮,房屋是系统对现象的命名 传统模拟经营 个体不聪明 不用行为树 / GOAP / LLM,只有 Utility AI 打分 智能体 NPC 结构自己长 道路、村庄、市场、战争全部由底层数据累积触发 关卡设计师摆场景 顺着这三条往下推,游戏的一句话就出来了:
你不能造房子,不能修路,也不能命令任何一个小人。你只能改变环境,然后眼睁睁看着他们自己把文明搞出来。
二、对「涌现」的思考:三件想明白了的事
- 涌现不是特效,是"命名" 这是我做这个项目最核心的一次认知转变。
一开始我总想"怎么把村庄做得更酷"。后来发现方向反了——系统不应该"创造"村庄,系统应该"发现"村庄。
小豆人们不知道什么叫村庄。他们只是:困了找个安全的地方睡、饿了去有食物的地方、喜欢跟同类待在一起。当某个区域恰好满足"睡觉的人多 + 人口密集 + 恐惧低 + 附近有资源"时,系统才回过头来,给这个现象起了个名字,叫"村庄"。
村庄不是被造出来的,是被命名的。系统在这里扮演的不是造物主,而是一个观察者、一个记录员。
这个视角一换,整个架构就顺了:底层只管跑规则,涌现系统只管看,看到符合条件的东西就给它命名、发一个弹窗告诉玩家。
代码里也是这样落地的——涌现系统不生产任何资源、不修改任何状态,它只读数据、只打标签。库存归库存系统管,聚落只是"接管"真实存在的库存,绝不凭空变出东西。
一个细节:如果涌现系统能凭空造资源,玩家很快就会发现"只要堆人口,系统就会发食物",游戏就退化成刷数值了。系统必须守恒,这一点比看起来重要得多。
- 玩家的爽点是"我什么都没做,它自己发生了" 这是这个题材唯一值得追求的瞬间:
“等等,他们为什么突然开始干这个了?”
传统游戏里,玩家做 A,游戏给 B,因果关系是清晰的、被设计的。而这个游戏要的恰恰是因果链长到玩家自己都算不清:
玩家在地图中间扔了一堆苹果 → 两个村子的人流在苹果地交汇 → 开始交换 → 出现市场 → 市场吸引人流 → 踩出一条路 → 路让商人走得更快 → 商队出现了 → 狼群从商路上咬死商人 → 恐惧扩散 → 原路废弃、新路诞生 → 城市因为恐惧分裂 → 两个部落开始抢食物……
玩家只做了一件事:扔苹果。
蝴蝶效应不是叙事手法,是这套系统的直接产物。
- 设计师必须主动放弃控制权 这是最难接受、但也是最重要的一条。
作为开发者,本能地想控制一切:想设计地图、想编排剧本、想保证每一局都有戏剧性。但涌现游戏的魅力恰恰在于——连我自己都不知道这一局最后会变成什么样。
所以我给自己定了一个规矩:
设计师制定规则,然后连设计师自己都不知道这一局最后会变成什么。
代码里所有的涌现阈值(多少人口算城市、多少次交易算市场、多久的战斗算战争)都是可调的规则,不是剧本。我调的是物理常数,不是剧情走向。
真正的回报是:测试的时候我自己会被自己的游戏惊到。有一次我只是想看看狼群 AI 有没有 bug,结果看着看着,两个从来没打过架的村子因为我随手放的几个苹果打起来了。那一刻我就知道,方向对了。
三、做了什么 截至现在,核心系统已经跑通。整个项目约 6000 行 Lua,拆成 13 个模块,按"数据 → 决策 → 涌现 → 表现"分层。
3.1 世界:一张会记账的地图 地图是 64×64 的逻辑网格。它的核心不是地形,而是七张热度场:
热度场 记录什么 Walk 谁从这里走过(踩路) Sleep 谁在这里睡过(聚居) Trade 谁在这里交易过(市场) Death 谁死在这里(墓地/恐惧) Fight 哪里发生过战斗(战场) Pop 实时人口密度 Fear 恐惧浓度 每张小豆人走过一格,Walk 就 +1。这些数据持续累积、缓慢衰减,然后反过来改变世界。
道路就是最直观的例子,也是整个游戏第一个"WOW 时刻":
走的人多 → Walk 累积 → 草被踩秃 → 变成泥路 → 移动更快 ↑ ↓ └────────── 更快所以更多人走 ←────────────────┘ 一个完美的正反馈闭环。没有寻路规划器在规划城市道路,路只是"被走得足够多"。
代码上做了几个刻意的选择:
热度用求和不用平均,单格钳制在 0~100。区域均值达标时,必然存在至少一个种子格也达标,这样热点检测不会漏掉偏移的聚集区。 确定性伪随机:地图生成用哈希种子,保证开局面板稳定可复现。 固定步长模拟:不管玩家开 1x / 2x / 4x,模拟都以 0.1 秒定步长推进,保证倍速只是"看快一点",不改变行为结果。这条对观察类游戏很重要——玩家切倍速不应该让世界变成另一个世界。 寻路用 A*,成本按路况分级,而且墓地有性格惩罚:胆小的(Brave < 0.35)绕路绕得更狠,胆大的(Brave > 0.65)几乎不绕。于是"城市自然绕开墓地"这件事不用写代码,它自己会从性格里长出来。 3.2 小豆人:坚决不做行为树 设计文档里我写死了一条:不要行为树,不要 GOAP,不要 LLM NPC。
用的是最朴素的 Utility AI——每个行为算一个分数,谁分高做谁:
EatScore = 饥饿度 × 食物距离权重 SleepScore = 疲劳度 × 安全感权重 RunScore = 恐惧 × 危险权重 SocialScore = 社交需求 × 性格.社交 看起来简单到可笑,但小豆人的行为在观感上非常聪明。因为涌现的智慧不在个体,在群体。
每个小豆人有四个性格值(0~1):社交 Social / 贪婪 Greed / 勇气 Brave / 好奇 Curiosity。
繁殖时,子代 = 父母平均值 + 随机突变。
这一行代码是这个项目第二层的涌现。环境会自然筛选性格:
怪物多 → 胆小的活下来 → 几代以后整个文明变胆小 资源稀缺 → 贪婪的抢到食物 → 文明越来越贪婪 资源分散 → 好奇的先发现 → 探索型文明诞生 玩家从来没有点过"升级探索能力"。这是自然选择。
行为本身也做了取舍:交易是守恒的(A 的木头的确到了 B 手上),攻击有真实的战斗节奏和伤害判定,睡觉要真的睡够时长。不搞"瞬间完成"的假动作,因为观察类游戏里,看得见的真实过程本身就是乐趣。
3.3 涌现系统:系统给现象"命名" 这是整个项目的灵魂模块。它不做别的,只做一件事:持续观察,发现符合条件的东西就命名、记录、告诉玩家。
目前实现了 20 项文明现象图鉴:
类别 现象 空间 第一条道路 / 村落 / 城市 / 鬼城 / 边境 / 城市圈 经济 市场 / 商路 / 商队 / 垄断 群体 大迁徙 / 难民潮 / 圣地 / 新世界 冲突 战争 / 世仇 宏观 黄金时代 / 大饥荒 / 文明崩溃 每一项都是玩家第一次触发时弹窗,比如第一次出现商路:
发现新的文明现象:「商路」 当两个从未交流过的聚落开始持续交换资源,一条商路自然诞生了。
这就是 GameJam 版本的成长目标——不是打败 Boss,是集齐文明的图鉴。也是玩家愿意开第二局的理由。
实现上踩过一个很典型的坑,值得记下来:
部落分裂距离必须小于等于聚落间距阈值。
如果"两个聚落离得多远才算两个部落"的距离,大于"两个聚落离得多远才算同一个聚落"的距离,那么新生的聚落永远会被并进第一个部落,第二个部落永远不会诞生——战争也就永远不会发生。
一个阈值的大小关系,决定了整个游戏最戏剧化的系统能不能启动。涌现系统里全是这种"看不见但致命"的耦合。
3.4 玩家:四个"神之手" 玩家扮演的不是国王,是世界规则的干扰者。目前有 9 种干预工具,分成四类:
投放资源:食物 / 木材 / 石头 制造危险:狼群 / 野火 放置诱因:篝火(吸引聚居)/ 宝藏(吸引贪婪)/ 图腾(吸引好奇)/ 钟(定期聚人) (第四类"改变法则"见下一节) 关键在于:所有工具都不直接指挥小豆人。篝火不会命令"过来睡觉",它只是让小豆人觉得"这里暖和,靠近点"。至于最后会不会变成城市中心——那是他们自己的事。
神力有成本、会缓慢回复,所以玩家不能无脑刷屏,每一次干预都是一次赌注:赌这群笨东西会怎么解读你的善意。
3.5 规则卡与随机事件:往系统里扔石头 12 张世界规则卡,每 150 秒三选一,选中后永久改变底层规则:
「人多力量大」「远方的饭更香」「死亡留下恐惧」「篝火让人安心」「独狼」「商人的时代」「好战年代」「丰饶时代」「慢生活」「基因涌动」「抱团取暖」「车同轨」
比如「独狼」——人口越密集,好奇的小豆人越想离开。结果是城市群不断分裂生长。又比如「车同轨」——小豆人更偏爱已经踩出来的路,路形成得更快。
7 个随机事件:丰收 / 干旱 / 寒冬 / 暴雨 / 瘟疫 / 流星 / 狼群。
这些事件的意义不是"扣 20% 人口"。是:
往系统里扔一颗石头,然后观察涟漪。
干旱不直接杀人,它让食物回复变慢,然后饥饿、迁徙、冲突会自己发生。
3.6 表现层:NanoVG 像素风 + 50 段音效 视觉上做了一个"反常规"的决定:地图变化比角色动画重要得多。
小豆人就是 16~24 像素的"小豆子"——圆头、身体、两只脚,几个状态。但地图会随着时间肉眼可见地"活过来":开局纯草地 → 出现踩踏痕迹 → 泥路 → 石路 → 村庄帐篷 → 城市房屋 → 市场摊位 → 墓地。这张地图真的被这些小东西活过。
技术上全部用 NanoVG 程序化绘制(平色块 + 深色轮廓 + 统一色板,刻意保留低像素感),没有一张美术贴图,所以整个包体非常轻。
音效倒是认真做了,一共 50 段音频:
环境与 BGM:荒野环境音、雨声循环、游戏 BGM 涌现音:第一条路、村落、城镇、城市、市场、墓地各有专属提示音 世界音:采集、交易、战斗、狼嚎、死亡、出生、篝火、钟声 UI 音:悬停、点击、开关、规则卡选择 事件音:丰收、干旱、瘟疫 音频管理做了分类限流(同一类音效有最大并发数和冷却),还带了距离衰减和声道偏移——所以把镜头拉到远视角时,整个世界的声音是"从一个点传出来"的,拉近才能听清细节。避免了一百个小人同时采集时音效糊成一片。
四、几个印象最深的取舍
- 不用行为树,一开始是"敢不敢"的问题。 行业惯性会让人本能地觉得"复杂行为 = 复杂架构"。但这次恰恰相反:个体的简单是卖点的一部分。行为树让 NPC 变聪明,而我要的是 NPC 变笨、群体变聪明。
- 系统必须守恒。 涌现系统只能"发现",不能"创造"。一旦哪个模块偷偷变出资源,整个经济就崩了,玩家也会立刻闻出"假"的味道。
- 一个阈值能决定一个系统是否永远不触发。 上面说的部落分裂距离就是例子。涌现游戏里,各个系统的耦合极其隐蔽,调参时必须时刻问自己:“这个数字变大/变小,会不会让某个现象永远无法出现?”
- 玩家必须看懂"我做了什么"。 纯涌现的风险是玩家觉得"跟我没关系"。所以规则卡、现象弹窗、第一次道路出现时的镜头震动和提示语,都在反复告诉玩家一件事:你只改变环境,剩下的是他们自己的选择。
五、下一步 [ ] 数值打磨:保证玩家 3 分钟内看到第一次明显涌现(第一条路) [ ] 新手引导:渐进式教学节奏,让新玩家 30 秒内理解"我该干什么" [ ] 文明结算界面:一局结束后回放这一局的文明兴衰史 [ ] 音频与特效细节补齐 [ ] 打包、宣传 GIF、投稿材料 写在最后 这个项目最让我兴奋的地方,是它的规模很小,但可能性很大。
底层只有几个系统:移动、需求、资源、性格、环境、几张数值场。但把它们叠在一起,道路、聚落、贸易、战争、迁徙、城市、废墟、文明兴衰,全都会自己长出来。
用 5 个系统,制造 50 种故事。
如果做完这个游戏,玩家能说出一句:
“等等,他们为什么突然开始干这个了?”#聚光灯gamejam开发者日志











![开发日记[03]|核心三大系统完工!宗门炼丹采药弟子体系已落地截图](https://img2-tc.tapimg.com/moment/etag/FsxqmyzWdWSElUYdYBAdN_uuaazl_20261019211448.jpg/_tap_ugc_m.jpg)