← 回成果库

让人物活起来:借鉴模拟人生 / inZOI / 过山车大亨 / 餐厅模拟的 8 套 NPC 互动思路


一句话结论(也是本文最想让您记住的一句)

那些模拟游戏的世界是假的,所以它们必须凭空造一套需求、作息、天气,好让世界显得像活的。您这个游戏的世界是真的——真实时间、真实天气、真实节日、真实音乐榜、真实地标。所以正确做法不是照抄一套假生活,而是把真实世界的数据接到 NPC 的行为上。

同一套机制,别人做出来叫「模拟」,您做出来叫「投影」。这是别人抄不走的那一块——因为抄机制容易,抄那条真实数据链难。


第一章 · 先看清现在的问题在哪(不看清就抄错)

我把代码翻了一遍,现在的 NPC 是这样的:

维度现状代码位置
身份没有。每次缩放地图,全场实体清空重铺,人就换了一批map.on('zoomend') 全清 + spawnCity()
记忆几乎没有。只有一个 questMet 记「这个名字我见过」的是/否rpg.js markMet()
内心状态没有。不饿、不累、没心情、不想去哪
自主行为没有。除了「跟我走」的那一个跟随者会移动life.js followTick()
互动6-9 颗按钮,对所有人完全一样,无论第一次见还是第十次life.js npcRing()

一句话诊断:现在游戏里的人不是「人」,是「内容的按钮」。 他站在那儿,是为了让您点开视频/照片/介绍。点完他就没用了,而且下次缩放他就消失了。

这不是 bug,是当初的设计选择(内容优先)。但它导致一个后果:这个世界的「活」全部来自数据(节日、演出会自己发生),没有一点来自人。


第二章 · 那几款游戏到底做对了什么(拆到机制层)

> 诚实标注:下面对各款游戏机制的描述来自我的领域知识(非本次联网核实,等级 E2)。它们是设计常识、不是承重数据;若要写进对外材料,建议再核一遍版本细节。

游戏它的核心机制真正值钱的那一点
模拟人生 The Sims6-8 条需求(饥饿/社交/精力/娱乐…,各代不同)驱动行为;社交菜单随关系深度逐层展开;不操作时小人自己找事做(autonomy);情绪修饰(moodlet);头顶菱形符号一眼看出状态互动动词是随关系解锁的——陌生人只能打招呼,熟了才有拥抱和玩笑。这让「重复互动」有了理由
inZOI用 AI 驱动 NPC 的自主行为与个性,每个市民有自己的性格与判断个体差异:同一个动作,不同性格的人反应不同。差异感 > 复杂度
过山车大亨 RCT每个游客有名字、有心情/精力/恶心/内急,头顶自动冒出想法气泡:「我渴了」「队太长了」「这条路太脏」★★NPC 是给玩家的仪表盘——你不用点任何人,走一圈就知道园区哪里出了问题。信息主动找玩家,不是玩家去菜单里找
餐厅 / 双点类模拟客人是一条服务流:进门→排队→点单→上菜→翻台;每人有耐心条人群即流动:人的移动本身就是可读的信息(哪里堵、哪里空)
星露谷 Stardew Valley(补充,最贴您这个题)每个村民有 10 颗心的好感度送礼偏好按季节/天气/节日变化的作息表;关系到一定程度解锁个人剧情★★作息表随季节与天气变——这条和您手上的真实数据链是天造地设的一对
动物森友会(补充)固定住民,会记得你多久没来,会说「好久不见」,有生日★★它是「一个你会回来的地方」的最佳模型,而这正是旅行游戏想要的

第三章 · 8 套思路(不同成本、不同效果,可单独取用)

每套都标了:借什么 → 在您游戏里长什么样 → 复用哪些现成积木 → 成本 → 风险


💡 思路 1|头顶想法气泡:让 NPC 变成「这座城的仪表盘」

借自:过山车大亨的 peeps thought bubbles

长什么样:不用您点任何人。走在街上,路过的人自动冒出一句话,而这句话全部由真实数据生成

为什么它排第一:它一次解决了这个项目最大的结构问题——所有好内容都藏在弹窗和菜单里。这个做法把内容倒出来撒在街上,玩家不点也能感受到「这座城此刻在发生什么」。

复用:现成的四种气泡(sayBubble/reply)+ 节日库 + 音乐榜 + 地标。

成本S(最便宜)风险:话术要写得像人说的,不能像播报;同屏别超过 2-3 个,否则变刷屏。


💡 思路 2|固定住民 + 好感度:把「路人」变成「老朋友」

借自:星露谷的心数、动物森友会的固定住民

长什么样:每座城选 3-5 个固定住民(不随缩放刷新、有名字、有固定的落脚点、记得你):

为什么它是最高性价比:现在所有互动都是一次性的,做完就归零。加上累积后,同一套互动动词的价值被放大了 N 倍——不用做新功能,只需要让旧功能被记住

复用:现成 questMet 记录 + localStorage + npcRing 互动圈。

成本:M | 风险:必须和思路 8 的「路人/住民二分」一起做,否则性能和重点都会崩。


💡 思路 3|互动动词随关系解锁:把菜单从「一次全给」改成「逐步展开」

借自:模拟人生的社交菜单树

长什么样:现在 6-9 颗按钮对谁都一样。改成:

为什么:现在一上来就给全部按钮,等于第一分钟就把牌全打完了。逐层展开让玩家有「关系在变深」的实感——这是模拟人生最值钱的一条设计,而实现成本极低(就是给 items 数组加一个条件过滤)。

复用npcRing()items 数组 + 思路 2 的好感度。

成本S风险:无。思路 2+3 必须一起做,它们是一对。


💡 思路 4|NPC 有作息,且作息由真实时间与天气决定

借自:星露谷的季节作息表 + 模拟人生的需求驱动

长什么样:每个 NPC 有一张极简作息表,输入是这座城的真实当地时间与真实天气

为什么这条最独特:模拟人生要造一套假时间,您本来就有真时区。飞到东京是当地上午,飞到里约是当地深夜——同一次游玩,两座城的街道密度不一样。这种东西别的模拟游戏做不出来,因为他们的世界是假的。

复用:城市经纬度(已有)→ 算当地时间(本地计算,不用接口)+ countForZoom 密度调度器。

成本:M | 风险:深夜城市太空会让人以为是 bug,要给提示(「凌晨三点的东京,只有便利店亮着」)。


💡 思路 5|自主行走:不操作时街上也在动

借自:模拟人生的 autonomy、inZOI 的自主 NPC

长什么样:给屏幕内的 NPC 一个极简行为循环:走向附近某个真实地标 → 停一会儿 → 换下一个目标。按思路 4 的作息选目标。

为什么:现在所有人都站着不动,一眼看出是布景。哪怕只是让他们缓慢走动,「活着」的感觉能提升一个量级——这是所有模拟游戏的共同底层:世界在你不操作时也在动。

复用:★移动代码已经现成了——life.jsfollowTick() 已经实现了「NPC 平滑走向某个坐标」,把目标从「玩家」换成「某个地标」即可。

成本:M(但因为有现成移动代码,实际接近 S)| 风险:性能。必须只让屏幕内的人动(onScreenPeople() 也是现成的),且实体上限 220 要守住。


💡 思路 6|情绪传染:你做的事,世界会有反应

借自:模拟人生的群体反应、RCT 的园区氛围

长什么样:把「跳舞只有一两个人跟」升级成氛围值机制:

为什么:这是唯一能让玩家产生「我改变了这个世界」感觉的一条。现在玩家做什么,世界都不变。

复用:现成的 party() / fireworks() / dance() / onScreenPeople() + 电台歌单。

成本:S-M | 风险:容易变成花哨的特效秀,要绑定「真实内容」(唱的是真歌)才有意义。


💡 思路 7|人群即流动:把演唱会和节日的人群做成一条服务流

借自:餐厅模拟 / 双点系列的客流

长什么样:现在演唱会的人群是装饰。改成一条真实的流:远处走来 → 排队进场 → 找位置 → 跟着节奏 → 散场四散。节日同理(游行队伍沿街道走过)。

为什么:现场感翻倍,且完全不需要玩家操作——它是背景,但背景动起来,整个场子就成立了。

复用:现成的 dancersgigFx 特效系统。

成本:M | 风险纯观赏性收益,不增加玩法深度。老实说:这条应该排在 1/2/3 之后再做,别被它的视觉诱惑力骗了优先级。


💡 思路 8|结构判断:把 NPC 分成「路人」与「住民」两类

借自:动物森友会的固定住民 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 实体的实际影响未测);各游戏机制未逐条联网复核。