下载 App
《公交公司》开发者日志5
修改于10/226 浏览
《公交公司》开发者日志 5 · 教学从 6 步重做成 10 步,以及下一步
这一期聊新手教学的重做、声音系统,以及我们对「涌现」这个主题的最终回答。
一、为什么要重做教学
第一版教学是 6 步硬编码链:if step==1 ... elseif step==5。它教了建线、延长、加车、第二条线、换乘。
但玩家反馈「玩到后面不知道能干什么」,一查发现:游戏已有的编辑能力,大半根本没教。
能力 原教学
缩短线路 未教
加站 / 拆站 未教
连成环线 / 取消环线 未教
移动公车 未教
回收公车 第 4 步后才显示按钮,从未解释
删除整条线路 有按钮,从未解释
概念:乘客 / 座位 / 候车容量 未教
玩家不是不会玩,是不知道这些操作存在。
二、三个关键设计决策
决策 1:教学用独立地图。
原教学和自由运营共用同一张 12 站地图,教学「完成」就是让同一个世界继续跑。这导致教学地图没法为「环线闭合」「缩短绕行」这类需要特定路网的课程专门编排。
现在教学用一张 6 站专用小图,教学结束后重建世界,玩家从正式局的标准初始局面开始。
6 创意园
│
1 ─────── 2 ─────── 5 新港
│ ╲ ╱ │ ╱
│ ╲ ╱ │ ╱
│ ╳ │ ╱
│ ╱ ╲ │╱
│ ╱ ╲ │
4 ─────── 3 街角
决策 2:每步分「操作」和「观察」两个阶段。
act 阶段等玩家操作(自动暂停),watch 阶段等仿真证据(自动运行)。玩家操作时暂停,操作完自动开始——不用玩家自己去点暂停/继续。
决策 3:概念卡分散弹出,可随手划掉。
三张概念卡挂在第 1、3、8 步完成后:
- 乘客(第 1 步后):每位乘客有自己的出发站和目的站。只有线路真的把他送到目的站,才算送达。经过、路过都不算。
- 公车座位(第 3 步后):一辆公交有座位上限。车到了站但坐满了,站上的人就上不来——这时候要加车,不是加线路。
- 站点候车容量(第 8 步后):每个普通站点能容纳 6 人候车。站上满 6 人、或有人等超过 60 秒,该站开始警戒。
三、10 步课程表
# 步骤 动机 玩家操作 完成条件
1 连接 松林社区有人要去中心办公 拖线连 1→2 一名真实乘客送达
2 延长 街角商店开放 端点拖到 3 去商店的乘客送达
3 加车 线变长、车回来慢 拖车到红线 第二辆车实际接客
4 缩短 红线绕远了 拖端点柄到空白 站数减到 3
5 加站 新港社区开放 拖线路段到站 5 站 5 获得真实服务
6 第二条线 + 换乘 创意园还没服务 建蓝线 4→2→6 一位乘客完成换乘抵达
7 环线开合 环线免掉头 红线闭合 → 再打开 先环线再往返
8 车辆调度 一条线车多、一条车少 拖车换线 + 拖车回收 车实际改属
9 删除线路 前任留下一条重复线 点 ✕ 金线停靠清空
10 概念收束 — 读卡 —
四、第 4 步「缩短」是最值得讲的一步
这一步我们在设计上花了最多心思,因为它跟玩家的直觉相反。
流程是这样:
- 进入时激活站 4,指示玩家「河畔社区开放,把红线延到 4」→ 红线成为 1→2→3→4;
- 站 4 与站 1 之间有直连道路,所以 1→2→3→4 其实绕了一圈,班次间隔变差;
- 目标改为:「红线现在绕远了,车回来更慢了。把末端 4 从红线上摘掉——拖住 4 的停靠柄,拖到地图空白松开。」
这正好对应设计文档里的一句话:延长不是唯一办法,有时要收回。
很多模拟游戏的隐含暗示是「线路越长越好」,我们想让玩家在第 4 步就学会:网络规划里有减法。
五、几个实现上的坑
坑 1:教学和玩家手动暂停互相顶掉。
原来教学推进时直接写 world.paused = true,会覆盖玩家自己的暂停状态。改成派生值:
paused = pausedManual or pausedByTutorial or status ~= "playing"
教学只写 pausedByTutorial,玩家/HUD 只写 pausedManual,二者任一为真则世界冻结。
坑 2:步骤一重排,散落的硬编码判断全线错位。
HUD 里有十几处 step >= 3、step < 6 这种判断控制按钮显隐。10 步一重排必然全错。改成能力解锁集合 tutorial.unlocked.addBus,判断「这个能力解锁了吗」而不是「第几步」。
坑 3:环线闭合段必须走真实道路。
红线成环是 1→2→5→3→1,闭合段 3→1 如果没有直连道路,只能走 3-2-1(重复经过停靠站 2)或 3-4-1——而这两条长度相等,最短路算法会二选一,结果不确定。
所以我们在教学地图里专门加了一条 1-3 直连道路,让闭合段稳定走直连、不重复经过任何停靠站。
这个细节值得一提:看起来只是地图上多一条线,实际上是为了让教学结果可复现。
坑 4:未知模式静默降级。
场景构造器对未知模式会静默 fallback 到默认短局。如果不显式加教学分支,教学会悄悄跑成 360 秒短局。加了显式分支。
六、声音系统
教学和主界面都补齐了声音。这块设计原则很朴素:
- BGM 带淡入淡出:3 秒淡入、2 秒淡出,切场景不会突然断掉;
- 音效节点池:预创建 6 个节点环形复用,播放路径零分配、零资源加载,不产生 GC 压力;
- 音乐/音效独立开关,互不影响。
音效按场景分类命名(UI 交互 / 抽卡 / 成就奖励 / 展馆交易 / 升星),业务代码直接调用对应方法,不在业务里直接创建音源。
七、回到「涌现」
现在回头看,我们这一路做的所有事情,其实都在服务同一个目标:
让玩家的每一个决定,都能在城市里长出一个可以观察、可以理解、可以挽回的后果。
- 城市成长不是为了拉长时间,而是为了改变问题类型;
- 乘客不是计数,而是带着真实行程、真的被送到目的地;
- 诊断不弹「运力不足」,而是指向具体的站、具体的目的地、具体的班次;
- 界面砍到只剩地图,是为了让后果一眼可见。
大量简单规则相互作用,诞生出未曾预设的结果——我们希望这个「结果」不是随机数,而是玩家自己造出来的。同一个城市布局,两个玩家会画出两张完全不同的网络,然后面对两种完全不同的问题。
这就是我们对「涌现」的回答。
八、下一步计划
- 存档与继续游戏:目前一局结束后进度不保留,这是最该补的;
- 网络画像:让玩家看到「哪条通道被几条线路共用」,把瓶颈可视化;
- 完整六阶段长局:把 A—F 六阶段的完整曲线做出来(目前只实现到三阶段 + 潮汐);
- 真机体验打磨:触摸热区、手指遮挡这些只能在真机上验证的细节。
九、写在最后
从「被试玩否定的 18 分钟版」到现在能跑通的四种节奏,中间推翻重做了不少东西。最深的体会是:
做模拟游戏,最难的不是加系统,而是让每个系统都说真话。
一辆车是不是真的到站了、一位乘客是不是真的到了目的地、一次改线是不是真的让候车下降了——只要有一处是「假装」的,玩家迟早会察觉到,然后整个游戏的可信度就塌了。
这一路上我们修掉的每一个 bug,本质上都是「某个系统在说假话」。










