https://metazero-terminal.pages.dev/travel-2d/rpg那些模拟游戏的世界是假的,所以它们必须凭空造一套需求、作息、天气,好让世界显得像活的。您这个游戏的世界是真的——真实时间、真实天气、真实节日、真实音乐榜、真实地标。所以正确做法不是照抄一套假生活,而是把真实世界的数据接到 NPC 的行为上。
同一套机制,别人做出来叫「模拟」,您做出来叫「投影」。这是别人抄不走的那一块——因为抄机制容易,抄那条真实数据链难。
我把代码翻了一遍,现在的 NPC 是这样的:
| 维度 | 现状 | 代码位置 |
|---|---|---|
| 身份 | 没有。每次缩放地图,全场实体清空重铺,人就换了一批 | map.on('zoomend') 全清 + spawnCity() |
| 记忆 | 几乎没有。只有一个 questMet 记「这个名字我见过」的是/否 | rpg.js markMet() |
| 内心状态 | 没有。不饿、不累、没心情、不想去哪 | — |
| 自主行为 | 没有。除了「跟我走」的那一个跟随者会移动 | life.js followTick() |
| 互动 | 6-9 颗按钮,对所有人完全一样,无论第一次见还是第十次 | life.js npcRing() |
一句话诊断:现在游戏里的人不是「人」,是「内容的按钮」。 他站在那儿,是为了让您点开视频/照片/介绍。点完他就没用了,而且下次缩放他就消失了。
这不是 bug,是当初的设计选择(内容优先)。但它导致一个后果:这个世界的「活」全部来自数据(节日、演出会自己发生),没有一点来自人。
> 诚实标注:下面对各款游戏机制的描述来自我的领域知识(非本次联网核实,等级 E2)。它们是设计常识、不是承重数据;若要写进对外材料,建议再核一遍版本细节。
| 游戏 | 它的核心机制 | 真正值钱的那一点 |
|---|---|---|
| 模拟人生 The Sims | 6-8 条需求(饥饿/社交/精力/娱乐…,各代不同)驱动行为;社交菜单随关系深度逐层展开;不操作时小人自己找事做(autonomy);情绪修饰(moodlet);头顶菱形符号一眼看出状态 | ★互动动词是随关系解锁的——陌生人只能打招呼,熟了才有拥抱和玩笑。这让「重复互动」有了理由 |
| inZOI | 用 AI 驱动 NPC 的自主行为与个性,每个市民有自己的性格与判断 | ★个体差异:同一个动作,不同性格的人反应不同。差异感 > 复杂度 |
| 过山车大亨 RCT | 每个游客有名字、有心情/精力/恶心/内急,头顶自动冒出想法气泡:「我渴了」「队太长了」「这条路太脏」 | ★★NPC 是给玩家的仪表盘——你不用点任何人,走一圈就知道园区哪里出了问题。信息主动找玩家,不是玩家去菜单里找 |
| 餐厅 / 双点类模拟 | 客人是一条服务流:进门→排队→点单→上菜→翻台;每人有耐心条 | ★人群即流动:人的移动本身就是可读的信息(哪里堵、哪里空) |
| 星露谷 Stardew Valley(补充,最贴您这个题) | 每个村民有 10 颗心的好感度、送礼偏好、按季节/天气/节日变化的作息表;关系到一定程度解锁个人剧情 | ★★作息表随季节与天气变——这条和您手上的真实数据链是天造地设的一对 |
| 动物森友会(补充) | 固定住民,会记得你多久没来,会说「好久不见」,有生日 | ★★它是「一个你会回来的地方」的最佳模型,而这正是旅行游戏想要的 |
每套都标了:借什么 → 在您游戏里长什么样 → 复用哪些现成积木 → 成本 → 风险
借自:过山车大亨的 peeps thought bubbles
长什么样:不用您点任何人。走在街上,路过的人自动冒出一句话,而这句话全部由真实数据生成:
为什么它排第一:它一次解决了这个项目最大的结构问题——所有好内容都藏在弹窗和菜单里。这个做法把内容倒出来撒在街上,玩家不点也能感受到「这座城此刻在发生什么」。
复用:现成的四种气泡(sayBubble/reply)+ 节日库 + 音乐榜 + 地标。
成本:S(最便宜) | 风险:话术要写得像人说的,不能像播报;同屏别超过 2-3 个,否则变刷屏。
借自:星露谷的心数、动物森友会的固定住民
长什么样:每座城选 3-5 个固定住民(不随缩放刷新、有名字、有固定的落脚点、记得你):
为什么它是最高性价比:现在所有互动都是一次性的,做完就归零。加上累积后,同一套互动动词的价值被放大了 N 倍——不用做新功能,只需要让旧功能被记住。
复用:现成 questMet 记录 + localStorage + npcRing 互动圈。
成本:M | 风险:必须和思路 8 的「路人/住民二分」一起做,否则性能和重点都会崩。
借自:模拟人生的社交菜单树
长什么样:现在 6-9 颗按钮对谁都一样。改成:
为什么:现在一上来就给全部按钮,等于第一分钟就把牌全打完了。逐层展开让玩家有「关系在变深」的实感——这是模拟人生最值钱的一条设计,而实现成本极低(就是给 items 数组加一个条件过滤)。
复用:npcRing() 的 items 数组 + 思路 2 的好感度。
成本:S | 风险:无。思路 2+3 必须一起做,它们是一对。
借自:星露谷的季节作息表 + 模拟人生的需求驱动
长什么样:每个 NPC 有一张极简作息表,输入是这座城的真实当地时间与真实天气:
为什么这条最独特:模拟人生要造一套假时间,您本来就有真时区。飞到东京是当地上午,飞到里约是当地深夜——同一次游玩,两座城的街道密度不一样。这种东西别的模拟游戏做不出来,因为他们的世界是假的。
复用:城市经纬度(已有)→ 算当地时间(本地计算,不用接口)+ countForZoom 密度调度器。
成本:M | 风险:深夜城市太空会让人以为是 bug,要给提示(「凌晨三点的东京,只有便利店亮着」)。
借自:模拟人生的 autonomy、inZOI 的自主 NPC
长什么样:给屏幕内的 NPC 一个极简行为循环:走向附近某个真实地标 → 停一会儿 → 换下一个目标。按思路 4 的作息选目标。
为什么:现在所有人都站着不动,一眼看出是布景。哪怕只是让他们缓慢走动,「活着」的感觉能提升一个量级——这是所有模拟游戏的共同底层:世界在你不操作时也在动。
复用:★移动代码已经现成了——life.js 的 followTick() 已经实现了「NPC 平滑走向某个坐标」,把目标从「玩家」换成「某个地标」即可。
成本:M(但因为有现成移动代码,实际接近 S)| 风险:性能。必须只让屏幕内的人动(onScreenPeople() 也是现成的),且实体上限 220 要守住。
借自:模拟人生的群体反应、RCT 的园区氛围
长什么样:把「跳舞只有一两个人跟」升级成氛围值机制:
为什么:这是唯一能让玩家产生「我改变了这个世界」感觉的一条。现在玩家做什么,世界都不变。
复用:现成的 party() / fireworks() / dance() / onScreenPeople() + 电台歌单。
成本:S-M | 风险:容易变成花哨的特效秀,要绑定「真实内容」(唱的是真歌)才有意义。
借自:餐厅模拟 / 双点系列的客流
长什么样:现在演唱会的人群是装饰。改成一条真实的流:远处走来 → 排队进场 → 找位置 → 跟着节奏 → 散场四散。节日同理(游行队伍沿街道走过)。
为什么:现场感翻倍,且完全不需要玩家操作——它是背景,但背景动起来,整个场子就成立了。
复用:现成的 dancers 与 gigFx 特效系统。
成本:M | 风险:纯观赏性收益,不增加玩法深度。老实说:这条应该排在 1/2/3 之后再做,别被它的视觉诱惑力骗了优先级。
借自:动物森友会的固定住民 vs 过场角色
长什么样:不要把所有 NPC 都升级——那会性能爆炸且没有重点。分两类:
| 路人(现在这套) | 住民(新增,每城 3-5 个) | |
|---|---|---|
| 数量 | 多(随缩放 1-7 类 × 1-3 人) | 少而精 |
| 身份 | 随机、一次性 | 固定、有名字、有落脚点 |
| 记忆 | 无 | 有(好感度、上次说过什么) |
| 作息 | 简单(思路 4) | 完整 |
| 负责 | 「人多」的感觉 | 「人味」的感觉 |
| 成本 | 几乎为零 | 每城 3-5 个,可控 |
这是所有其他思路的前提。 不先做这个二分,思路 2/3/4/5 全都会撞上性能墙。
模拟人生的核心乐趣是照顾一个小人——让他别饿死、别尿裤子、别孤独。这是一种「经营」快感。
但您这个游戏的乐趣是「看世界」。 一旦给玩家加上需要管理的数值条(体力、饥饿、心情),游戏的重心就会从「这座城真美」滑向「我的条快空了」——它会把旅行游戏变成经营游戏,这是量变引起质变的错误方向。
所以取舍是:
> 换句话说:需求条应该长在 NPC 身上,而不是长在玩家身上。 NPC 有需求 = 世界有生活;玩家有需求 = 玩家有家务。
反对:「这 8 条全是在做 NPC,可这个游戏真正的卖点是真实世界数据和内容包(主席上一轮刚定的方向)。把力气花在 NPC 上,是不是跑偏了?」
回应:这条部分成立,我接受。所以我把优先级定成这样——只做能放大现有内容的那几条,不做纯 NPC 模拟:
可证伪锚:如果做完思路 1+2+3 之后,玩家的单次游玩时长与「打开过的地标/内容条数」都没有提升,那我这套判断就是错的。
建议第一刀 = 思路 1 + 思路 8 + 思路 2 + 思路 3(气泡 + 二分 + 住民 + 关系解锁)
理由:
1. 思路 1 成本最低、见效最快,而且不改任何数据结构
2. 思路 8 是结构前提,必须先划分,否则后面撞性能墙
3. 思路 2+3 是一对,一起做才有意义;且它们把已有的互动动词价值放大,而不是新增功能
4. 这一刀几乎全部复用现成积木:气泡、互动圈、localStorage、questMet、geosearch 全都在
明确不做(这一刀里):自主行走(思路 5)、人群流动(思路 7)——它们更贵、且收益偏观赏。
| 断言 | 等级 | 依据 |
|---|---|---|
| 现在 NPC 无持久身份、缩放即全清重铺 | E1 | 读码确认:map.on('zoomend') 清空 entities + spawnedCity.clear() |
记忆只有 questMet 的是/否 | E1 | 读码确认:markMet() 只写 questMet[n]=1 |
| 互动圈对所有人一样 | E1 | 读码确认:npcRing() 的 items 数组无关系分支 |
| 移动代码已现成 | E1 | 读码确认:followTick() 已实现平滑趋近某坐标 |
| 屏内人群枚举已现成 | E1 | 读码确认:onScreenPeople() |
| 实体上限 220、密度随缩放 1-7 类 | E1 | 读码确认:entities.length>220 + countForZoom() |
| 各款游戏的机制描述 | E2(领域知识,非本次联网核实) | 我的训练知识;设计常识而非承重数据。若对外发布建议再核版本细节 |
| 「先做思路 1+2+3 收益最大」 | 推测 | 设计判断,未经真人试玩验证;可证伪条件已在第四章写明 |
未做:没有真人试玩验证;没有做性能压测(自主行走对 220 实体的实际影响未测);各游戏机制未逐条联网复核。