双人电驴与僵尸突围实施计划
2026-10-11 整合更新:当前「僵尸突围」统一为城市中的 1–4 人活动,寻找电动车、驾驶、双座共乘与停车下车成为同一局的操作。本计划保留旧双座固定路线交付过程和历史验收记录;旧房间与邀请经 /coop-legacy.html 兼容,旧阶段记录不代替新 v3 规则验收。当前能力见僵尸突围,历史规则见双座路线兼容记录。
状态:阶段 1–3 已实现,阶段 4 的合作模式本地检查已通过;生产 Play 合作房与 CloudBase 签票已部署,并通过两个专用测试客户端的真实签票与房间冒烟。真实 Steam 跨设备验收待正式 App ID 与设备,网页实际部署版本、真人登录及目标设备完整对局仍需确认,生产带宽与负载尚未验收。日期:2026-10-09。最新证据见 合作战斗发布验证。
目标:两名玩家共乘一辆电动车,一人驾驶、一人后座射击,完成一局约 5–8 分钟的短路线突围。先交付可游玩的载人与打靶原型,再接入联机和僵尸关卡。作为 GZA 的独立挑战入口,按需加载。
已采纳的产品决策
| 决策 | 已采纳方向 | 对实施的影响 |
|---|---|---|
| 首发联机路径 | Steam 桌面好友房优先;Web 后续适配同一规则核心 | Steam 主要在本仓库开发,真实验收需要正式 App ID 与两个账号/设备;Web 需要同步修改 play 服务、签票、本仓库 BFF 和 SDK |
| 载人车型 | 同时支持单座与双座,现有车型增加双人套件;双座收起配送箱及占用后座的音箱/货架 | 单座保留原配送外观;双座使用长坐垫、后脚踏和扶手,切换复用已创建模型 |
| 座位与上下车 | 开局选座,补给点停车后可换座 | 不需要首版同时实现多人步行与地面战斗;若要求自由上下车,增加人物移动、登车竞争、落脚检查及掉队处理 |
用户已要求遵循建议实施,并明确单座与双座均需支持。首发联机平台与换座方向按上述建议推进;真实 Steam 验收前仍需正式 App ID、测试账号与设备。当前已完成模型、真实开发双客户端与 Steam 合作房代码,真实 Steam 平台连接不视为已通过。
其余暂定值可在打靶和试玩阶段调整:首版两人、一辆车;桌面键鼠和手柄优先;乘客正常坐姿与肩后瞄准镜头;两位玩家使用各自角色外观,车体外观由当前驾驶员决定;卡通、夸张击退、无血腥;首版不造成友军伤害。手机合作、四人两辆车、单人 AI 后座和自由步行战斗列入后续阶段。若这些能力必须首发,需要补充范围。
实施前的基础与缺口(启动时基线)
以下描述本计划启动时的代码状态;共享世界载具、乘客锚点与独立合作协议现已按阶段 1–3 补齐。
电动车与角色
- 电动车外壳与骑手均由 Three.js 本地几何生成,现阶段沿用程序模型。
- 当前坐垫长 0.66、中心 Z=0.27,司机骨盆 Z=0.22;后方约 Z=0.93 有配送箱。货架本身高于坐垫,部分皮肤另有后置音箱;需一起调整。
- 布局参数有车把、轮轴与司机骨长,没有乘客座位、脚踏、扶手或枪口锚点。
- 座舱挂在相机下,带第一人称视口适配;不能直接用它代表两位玩家共享的世界载具。联机对手当前是独立线框模型。
- 上下车属于单玩家载具切换。骑行胶囊与停车车体碰撞并非统一双人车辆形状,需重新验证双座车尾、转弯与上下车净空。
联机与射击
- Steam 好友房已有大厅、邀请、准备、消息序号、断线处理,以及房主主进程 60 Hz 模拟/20 Hz 快照框架;真实连接验收仍待正式 App ID 和多设备。
- 现有协议面向竞速
x + distance,没有完整街区位置、共乘座位、瞄准、动态敌人与枪械。合作模式需要新消息和规则。 - Web / Play 当前是独立的竞速房间,默认 60 Hz 模拟/10 Hz 快照;不能把 Steam 的 20 Hz 当作网页既有配置。新增网页合作房间需要新房间注册与 ticket audience,并同步 BFF/SDK。
- 坦克的命中查询、开火反馈及部分资源组织可复用;慢速抛物线炮弹与建筑伤害规则不能直接作为后座枪械。
- 街区模拟目前受渲染循环与本地菜单暂停控制。合作房间需独立权威循环,某一客户端打开菜单不能冻结所有玩家。
实施原则
- 车辆、座位、敌人、命中、弹药及关卡状态由权威模拟拥有,Three.js 只负责显示。规则核心不依赖 DOM、Steam 或 Colyseus。
- 一辆车辆只同步一套姿态。两位角色的位置由车辆姿态和座位局部坐标推导,避免后座单独插值造成脱座。
- 司机与后座输入分开。驾驶、换座、开火均由权威端核对身份和座位;换座是原子操作,不能让两人同时占同一座位。
- 世界车辆与第一人称显示共用布局、几何工厂和皮肤配置,第一人称适配保留独立镜头;只提取本模式需要的边界,不一次重写整个街区。
- 启动阶段建立新模式入口与协议版本,逐步交付并回归经典竞速、单人上下车和车库外观。
阶段 1:双座模型与本地打靶
交付:开发预览中能看到完整双人电动车,能分别检查驾驶和后座瞄准;有静态靶与移动靶。
- [x] 在共享布局中定义司机/乘客座位、脚踏、握持、相机与武器挂点,统一车体局部单位与朝向。
- [x] 提取世界坐标载具组合,包含车架、转向、灯光及两个乘员根节点;接入必要的座舱与车库适配。
- [x] 增加长坐垫、后脚踏和扶手;将占用后座的货架、配送箱及音箱纳入可切换配置。
- [x] 以“车辆配置 + 外观”共同决定附件可见性,避免换肤后附件重新穿进乘客。
- [x] 复用骑手比例和固定骨长 IK,新增乘客坐姿、持枪、瞄准与换弹姿态;两个角色分开应用外观和姿态。
- [x] 实现后座肩后镜头与独立瞄准;准星对齐枪口方向,实际枪口射线检查遮挡。首版坐姿支持左右 85°、上下 40°,完整后向转身留作后续能力。
- [x] 开发预览提供单人/双人、司机/后座/侧面视角,诊断仅开发加载。
验收:两人坐实、脚踏正确;转向、踢击、瞄准与换弹不穿模;司机仪表清楚、后座不被头盔或车尾附件挡住;桌面与窄屏的世界模型尺寸一致;重复切换配置和皮肤、离开预览后无资源增长。打靶验证瞄准方向与枪口命中一致,近墙射击被遮挡。
阶段 1 验证记录
以下为阶段 1 当时的验证记录,本轮合作入口的最新检查另见文末阶段 2–4 记录。
- 全仓库类型检查、生产构建、发布产物校验及现有包体预算通过,未提高预算;开发预览不进入生产入口。
- 相关 7 个单测文件共 86 条通过,覆盖双座配置、独立乘客外观、异步附件切换、世界座位变换、资源释放、弹药规则与射线遮挡。
- 相关 18 条 E2E 分批通过:骑手预览 2、双座预览 4、车库 2、皮肤 7、单人上下车 3。检查桌面与 390 × 844 触屏、司机仪表、真实枪口命中、拖动瞄准、开火/换弹、异步换肤与返回单座。
- 双座模型重复切换座位和视角,已上传的 GPU 几何数量保持不变,静止 500 ms 新增绘制为 0;换弹途中切回单座同样回到空闲。资源单测核对异步加载后释放且不重复释放。
- 既有皮肤 E2E 的装备定位器限定到装备按钮;音频关闭时检查未加载音源,打开并恢复比赛后再检查播放地址,符合原有惰性加载行为。
公共皮肤选择与持枪姿态补充验证(2026-10-08)
RiderSkinSelect已复用公共GameSelect;调整乘客肩转轴、支撑手握点和侧向弯肘,使用独立aimOrigin保持换弹时瞄准相机稳定。乘客与整车专项单测 17/17 通过,覆盖实际手臂实例盒体的穿模回归及瞄准基准世界变换。- 本轮原生 GPU E2E 共 7 项分批通过:骑手预览 2、双座预览 5。桌面覆盖公共下拉键盘选择、Esc 焦点恢复、Space/R 输入隔离、初始中心靶命中及资源复用;390 × 844 Chromium 触屏模拟覆盖换肤、开火、换弹、司机视角与至少 44 px 的触控目标。已查看桌面持枪两侧、手机浮层及各视角截图。
- 手机测试原先在浮层打开后通过可访问角色查找背景触发器而超时;改为打开前检查触发器尺寸,并等待浮层完成绘制后截图。仅重跑该手机用例,最终 1/1 通过;其余已通过项未重复运行。
- 本轮运行时代码的应用类型检查、生产构建、
verify:performance、verify:release均通过,最新产物 211 个文件,开发预览未打包,预算未提高。收尾只修改测试及文档,沿用该构建结果;工作区其他并行改动也在构建内。
模型预览:运行开发服务器并打开 /rider.html,点击「座位:双座」检查长坐垫、脚踏和乘客;点击「司机视角」检查仪表,点击「后座瞄准」拖动瞄准,Space 开火、R 换弹,或使用触屏按钮。该诊断页的后座瞄准尚未接入手柄;当前 /coop-legacy.html 已提供手柄操作、开发联机及下述网络/尸潮验证,真实 Steam 验收仍待完成。
阶段 2:双人共乘同步
交付:两个客户端能进房、选择不同座位、准备、开始、驾驶和射击;允许房主选择任一座位。
- [x] 新增独立合作输入/快照与房间模式标识,复用现有 transport 和大厅生命周期。
- [x] 以 matchId 标识本局唯一共享车辆;规则状态包含两个座位的玩家 ID、位置/高度/朝向/速度、瞄准方向、弹药、射击 ID、输入序号和模拟 tick。
- [x] 权威循环处理驾驶、座位权限、敌人与命中;前台渲染暂停不停止房主模拟。
- [x] 车辆预测/校正与远端插值独立于视角;射手立即获得本地开火反馈,伤害与击杀等待权威确认。
- [x] 基于 observedTick 建立有界目标/车辆历史,最多回查 15 tick / 250 ms;旧序号、重复射击、越权输入和乱序快照不能重复改变状态。
- [x] 可靠消息传递准备、换座、关卡切换和结算;持续姿态使用有界快照与事件去重。
- [x] Steam 与开发 WebSocket 分别使用 60 Hz 模拟/20 Hz 快照,并验证双客户端同步。
- [x] 生产 Play 合作房与 CloudBase 签票接入并部署;两个专用测试客户端通过真实签票链完成创建/加入、准备/开始、整匣射击、换弹与主动断开,房间和连接回收为 0。见 2026-10-09 生产后端验证。
- [ ] 确认实际网页/BFF 部署版本与生产玩家会话,测量部署端 RTT、带宽和负载,并完成目标设备完整对局。
断线草案:开局后首版不接受新玩家;任一队员断线则停止本局驾驶/射击、显示原因并结束本局,重新组队重试。停止后释放所有持续输入。房主退出结束房间,主机迁移和断线重连另行设计。
验收:房主驾驶和房主射击两种组合都可玩;两个客户端车体、座位、命中及弹药一致;座位冲突被拒绝;菜单、切后台和断线行为明确;模拟网络覆盖延迟、丢包和消息乱序。模拟测试与真实平台连接验收分别记录。
阶段 3:短路线僵尸突围
交付:一局约 5–8 分钟,有出发、补给、尸潮与撤离,以及明确成功/失败结算。
- [x] 复用城市美术元素,制作独立 5.4 km 平地突围道路,确认出生点、三处补给和撤离点;只加载本局内容。
- [x] 加入普通僵尸和跑动僵尸,两种武器暂定冲锋枪与霰弹枪。初版用原创简化程序模型。
- [x] 敌人实现生成、追逐、攻击、受击、死亡和回收;数量、碰撞与特效均有上限,实测后确定并发上限。
- [x] 以道路障碍、追击敌人与停车补给形成压力,司机通过路线、速度和近身清障参与战斗。
- [x] 定义共享车体耐久、弹药补给与失败条件;补给点按权威停车条件自动领取一次补给,换座单独由双方确认,不必引入多人步行。
- [x] 用共享 UI token、GameMetric、GameNotice、GameButton 展示目标、耐久、弹药、伙伴座位与结算;保留键盘、手柄焦点及输入释放。
- [x] 合作结算使用独立本局统计;首版不接入竞速排行榜、云端奖励或收费权益。
验收:两人均有持续决策;交换座位后操作易理解;能完整胜利、失败和重试;暂停菜单不会影响伙伴模拟;命中、击杀、补给及结算只发生一次。
阶段 4:回归、性能与真实联机验收
- [x] 针对座位与输入权限、射击去重、遮挡、换座、断线和结算运行有意义的规则测试。
- [x] 浏览器/Electron 回归双人模型、瞄准、皮肤、车库、既有单人上下车、竞速、键鼠和手柄。
- [x] 模拟网络覆盖 RTT 0/80/150/250 ms,以及 0/2%/5% 丢包,验证权威状态、输入和射击去重并记录快照年龄;真实驾驶视觉校正误差仍待测量。
- [x] 采样合成满池压力场景,包含双座角色、活动与倒地敌人、射击/命中特效及本模式实际渲染步骤;目标设备完整对局留待真实平台验收。
- [x] 按现有 300 calls/90,000 triangles 门槛与桌面 60 fps 目标测量;当前包体预算以 performance-budgets.mjs 为准,不调整预算来通过检查。
- [x] Web 生产构建、发布产物与预算检查通过;生产 Electron 合作入口与离线提示 E2E 通过,开发预览及诊断代码不进入生产入口。
- [x] 完成本轮最终类型检查及输入/资源清理调整后的四项 GPU E2E,汇总收尾结果。
- [x] 生产 CloudBase 签票与 Play 合作房的双客户端冒烟通过,已验证连接、开赛、射击/换弹与退出清理;候选规则包与已发布 Play 规则包的 22 个 JS/声明文件逐字节一致。
- [ ] Steam 路径用正式 App ID、两账号/设备和不同网络实测邀请、准备、两种房主座位、后台、退出及断网。
- [ ] 网页路径确认实际部署版本,使用真人账号与目标设备验证登录、权限边界、完整对局及跨网络连接,测量生产服务端带宽、负载与客户端帧率。双专用客户端签票冒烟不替代这些验收。
既有地图机位若已有性能失败,单独记录基线与本模式新增开销;不能以轻量预览或无敌人场景代表战斗性能。实体手机联机与 Steam Deck/Windows 验收按最终首发范围补充。
阶段 2–4 本地验证记录(2026-10-09)
已实现独立合作入口、共享纯规则、Steam 双人房与真正的开发 WebSocket authority。最终合作单测 99 项及音效/main/preload/Steam/双座模型相关单测 47 项通过;覆盖完整 5.4km 胜利、权限、射击遮挡/去重、250ms 命中历史、补给、换座、输入超时、断线与胜负;12 场 Steam 模拟延迟/丢包矩阵通过。输入/资源清理修复后的四项双浏览器 GPU E2E 全部通过,验证两种房主座位、同步、换弹、菜单输入释放、真实 WebGL 连接丢失/恢复、断线重组及 390×844 触屏。补充首轮输入与换座武器时序回归,并验证退出时释放画布。手机首页 ready-menu 两项回归通过。合成满池战斗 GPU 为 136 calls / 30,080 triangles,平均 16.46ms、P95 16.80ms。
本地阶段的全仓类型检查、Web/桌面构建及 Web 性能预算与发布产物校验通过(221 文件):合作入口 314.0 KiB gzip / 350 KiB,CSS 5.1 KiB / 16 KiB,完整资源 12.44 MiB / 20 MiB;打包资源预算相关 9 项测试通过。生产 Electron 合作入口 E2E 1/1 通过,核对合作页、标题栏、可信桥接、App ID 0 离线提示、无 DEV 入口及返回单座首页。这些为本地阶段快照;同日后续发布候选的最终类型检查、1034 项单元测试、剧情校验、构建、打包预算与 365 文件产物校验通过,生产 Play/CloudBase 签票链也已验证,详见发布记录。
本地阶段曾记录街区冷启动 21,230 ms / 15,000 ms,以及四项既有街区桌面绘制预算 E2E 失败。同日后续工作区优化已通过街道与全部总部机位的原绘制预算回归;冷启动最终 Metal 样本仍为 16,671–17,362 ms,原样性能配置的 SwiftShader 样本为 39,274 ms,继续未达到 15 秒。详见后续渲染与冷启动复测,不能记为全部 E2E 或性能验收通过。实际 Steam 双设备、跨网络、实体手机、Windows / Steam Deck 尚未测试;真人账号 SSO、网页实际部署回执以及生产带宽/负载与目标设备完整对局仍待验收。详细操作和验证边界见僵尸突围。
第一交付与后续范围
实现按交付顺序推进:阶段 1 先完成双座模型与本地打靶,检查座位比例、射击空间和视角;阶段 2 接入两个客户端的共乘与射击;阶段 3 已加入独立僵尸关卡。阶段 4 区分本地自动验证与真实平台验收。
后续候选:城市漫游载人、自由上下车和步行射击、单人 AI 后座、手机合作、四人两车、武器/车辆改装、主机迁移与断线重连。分别进入后续范围,避免首版同时扩张地图、角色状态与网络规则。