Godot 完整迁移计划
决策日期:2026-10-16。目标引擎确定为 Godot;执行顺序为 第一章与一个完整街区 → 原生发行验收 → 地图分块加载 → 逐区扩城。本文是实施计划,不代表功能、性能或发行已经验收通过。
应用显示名保持《GZA:暴力电驴》,仓库、包名、应用 ID、账号和既有存档标识继续使用 dayun-kicker。游戏源码仍在原私有仓库;本次迁移不涉及公开源码或搬迁仓库。
实施状态见迁移进度与验收记录:M0–M1 工程和午餐切片已落地,M2 已接入七单首章与客村 / TIT,可玩候选与验证边界见 M2 记录。维护者已明确将 Windows 实机测试后置,因此允许先实施当前功能切片;G1.3 / G2.0 的 Windows 运行验收仍开放,不据此切换生产入口。
1. 交付范围与里程碑
第一目标是 Steam Windows x64 的离线单人版;macOS 用于当前开发和回归,通过独立打包与签名验收后才列为发行平台。Linux / Steam Deck、手机、原生线上账号与多人分别验收,不绑定第一章工期。
| 阶段 | 可交付结果 | 开始下一阶段的条件 |
|---|---|---|
| M0 基线与契约 | 功能清单、完整冻结版本、首章地点范围、兼容与验收矩阵 | 明确哪些迁移、哪些后续恢复,记录目标机器和既有门槛 |
| M1 原生工程 | 可重复构建的 Godot 工程、资源导入、物理与任务数据接口、Windows 薄包 | 干净环境能恢复资源、导出并运行包含原生物理扩展的小场景 |
| M2 第一章与完整街区 | 客村 / TIT 生活街区、完整「粥还热」、菜单与存档、通关后继续游玩 | 全章连续实玩、关键分支与恢复、街区循环及原生输入通过 |
| M3 原生发行候选 | 包含第一章的 Windows 离线候选、旧档导入、发布与回退流程 | 功能、性能、资源、目标机器、正式平台声明逐项达标,才切默认客户端 |
| M4 地图分块 | 在已有地图上验证有界加载、无缝跨块、卸载恢复 | 同一内容在分块前后行为一致;跨块和长时资源预算通过 |
| M5 逐区扩城 | 每次增加一个相邻、有任务和生活内容的街区 | 每个街区独立通过内容、边界、存档、性能与来源检查 |
| M6 后续功能回迁 | 经典赛事、其余城市设施、多人、平台服务及手机 | 依赖满足后按功能包恢复,无须等待所有街区完成;逐项验收 |
Godot 是后续原生开发方向。Three.js / Electron 在 M3 通过前继续作为可运行的对照与回退版本;不同时新增两份首章剧情。现有 Web 试玩、账号与后端继续运作,Web 后续只维护明确的试玩范围。M3 的“默认客户端切换”与“所有历史功能迁完”分别记账,后者需要完成 M6 清单。
双宿主分工
决策日期:2026-10-17。Godot 承载完整游戏,Three.js Web 承载吸引下载的即点即玩展示;不以 Godot Web 导出替代 Web 宿主。
| 宿主 | 定位 | 新功能如何落地 |
|---|---|---|
| Godot 原生 | 完整游戏:章节、城市生活与环境车流、存档、设施、合作和平台服务 | 新玩法与系统先在此实现并验收 |
| Three.js Web | 即点即玩试玩与展示:精选街机赛事、街景与夜景片段、手机打开与分享、下载引导;同时是 TS 程序美术的源头 | 只加入服务展示与转化的片段,不追平完整功能 |
不采用 Godot Web 导出作为同构方案:工程使用 Forward+,Godot Web 只支持 Compatibility(WebGL2),夜景与描边会降级;Rust Rapier GDExtension 的 wasm 构建仍属实验路径;引擎 wasm 与 PCK 远超 Web 资源预算,手机浏览器首载代价高。条件变化时可另做实验,不作为发行依赖。
两端共享以下三层,避免逐步分叉:
- 美术:TS 程序模型是唯一源头,构建期导出 GLB 供 Godot 导入。
- 内容与数值:
dayun-kicker-content数据包和章节 / 配送 / 节点图 fixtures。 - 规则:写成规格与两端共用的 fixtures,各自实现并逐条对照;计算密集且需确定性的模拟,在 Web 确需完整运行时再下沉到可同时编译 GDExtension 与 wasm 的 Rust 核心。
一个街区与完整第一章如何同时成立
完整打磨街区定为 客村 / TIT 骑手站及周边生活圈。M0 用现有道路、任务点和可达边界冻结具体多边形与地点清单,不用任意面积替代可玩范围。
第一章仍从客村开始、在陈家祠南门结束,保留丽园雅庭、滨江、取药点、两条解药路线和祠堂任务。M2 使用固定的章节地图包,保留这些地点之间必要的可骑行道路、碰撞、任务点和远景;完整生活内容先集中在客村 / TIT。章节以外未完成区域保留明确边界,不承诺整座广州已经可玩。
M2 不引入通用运行时地图流式系统,不用传送、改地点或跳过路口代替连续骑行。先通过构建期裁剪与固定资源包控制规模;若章节路线资源超预算,先处理资源和场景表达,再推进。通关后可继续游玩已经交付的街区与章节路线。
2. 当前基础与真实缺口
制定计划时已有 Godot 工程为独立实验。实施后另建了生产目录和可重复流水线;下表保留实验基础与完整迁移缺口,当前交付范围见实施进度。
| 范围 | 已有基础 | 迁移工作 |
|---|---|---|
| 地图与画面 | 广州地图、卡通增强效果、水面、立面、公交与行人原型 | 转成可重复导入的生产资源;落实导出后纹理、缓存和资源预算 |
| 骑行与碰撞 | 原有 tuning;最新可玩切片使用 Rust Rapier 查询扩展 | 固定扩展版本,补 Windows 构建与真实地图回归;不沿用早期 CharacterBody / Jolt 候选结论 |
| 配送 | 园区午餐、阿婆热粥、滨江咖啡三个取送任务 | 补登记、整章七个订单、场景交互、分支对白与据点变化 |
| 剧情 | Web / Electron 已有完整「粥还热」与相关回归 | 原生实现剧情执行与宿主命令;三单切片不能算完整首章 |
| 战斗 | 射击、近战、受伤、碰撞、踹飞及 300 只压力场景 | 按首章需要接入两名 / 三名感染者事件,并保留独立压力回归 |
| 存档 | 原生格式 1 / 2、自动 / 槽 1 / 检查点、备份与校验 | 设计正式 schema,补旧 Web / Electron 导入、更多槽及完整剧情字段 |
| UI 与输入 | token 导出、原生 HUD / 菜单、部分键盘与显示回归 | 补步行 / 上下车、地图、剧情、设置、手柄与焦点、音频和无障碍检查 |
| 联机 | 双人本机 / 局域网共乘原型,主机权威与 ENet 检查 | 不等同于现有 1–4 人城市玩法;四人、自由移动、Steam / 云房间后续回迁 |
| 发行 | 现有 Electron 候选与资源发布工具 | Godot 导出、原生扩展、安装包、签名及真实 Steam App ID 独立验证 |
最新性能结论以渲染记录与性能手册为准。2026-10-16 受控三轮短窗平均约 73.5–73.8 FPS,但 P99 为 21.29–21.65 ms,仍未通过既定稳定 60 FPS 门槛;当前接触 / 踹飞版本也不能借用早期三单或长途结果过关。本文不新增性能收益结论。
3. 生产工程与复用方式
生产工程已落在原源码仓库的 apps/dayun-kicker-godot/,保留 experiments/dayun-kicker-godot/ 作为历史验证入口。以下是当前 monorepo 布局;M2 已补章节和步行,平台接口后续按里程碑补齐。不把实验的临时导出、helper、压力默认值和本机路径整体搬入生产。
原生业务默认使用带类型标注的 GDScript;Rust GDExtension 先保留已经验证的 Rapier 查询与必要计算。TypeScript / Node 留在构建工具和现有服务端,不作为原生游戏运行依赖。新增原生优化须有实际热点证据。
apps/dayun-kicker/ # Web / Three.js 宿主
apps/dayun-kicker-desktop/ # 既有 Electron 宿主
apps/dayun-kicker-godot/ # 原生 project.godot / export_presets.cfg
scenes/ # 启动场景
scripts/game/ # Session、配送与存档
scripts/world/ # 固定地图;M4 才实现分块调度
scripts/player/ # 骑行
scripts/ui/ # Control / Theme 与焦点导航
native/ # 扩展声明;动态库留在忽略目录
generated/ # 构建期生成的内容,忽略
tests/ # 行为、存档、连续骑行与包检查
packages/dayun-kicker-content/ # 共享目录、规则、类型与范围
packages/dayun-kicker-physics/ # 固定版本 Rust Rapier 源码与锁文件
scripts/godot/ # 冻结、内容导出、构建、测试与包检查媒体、扩展动态库、导入缓存及导出包的位置须先加入忽略规则;上述树不表示允许把二进制提交进 Git。
| 现有实现 | 处理方式 |
|---|---|
| 地图 JSON、道路节点、地点 ID、模型 / 音频来源 | 复用数据和许可;导入时记录坐标、地图版本、单位与 hash |
| TypeScript 程序模型与导出脚本 | 先作为构建工具使用,产出固定场景资源;游戏运行不启动浏览器或 Vite |
| 配送、职业、制服、背包、剧情门槛 | 导出规则与 fixtures,移植原生逻辑;按行为对照,不能直接执行 TS |
| ADV.JS 对白源 | 保留单一内容源,构建期导出首章所需的中立指令与条件数据;原生执行已列明的子集,不支持的指令构建失败 |
| Vue / Reka UI | 用 Godot Control / Theme 重建呈现,映射既有 token;沿用交互语义、稳定操作 ID、文本与焦点用例 |
| Three.js 材质与后处理 | 改用原生材质 / shader;保留同画质对照与视觉差异清单 |
| Electron preload、文件存储、Steam Node 模块 | 接口迁到原生平台适配;Node 二进制不直接复用 |
| BFF、CloudBase、Play 服务与协议 | 保持服务端规则;后续实现原生客户端,不复制浏览器会话或重写服务端来迎合客户端 |
采用少量职责明确的 Module,Interface 同时约束调用顺序、失败、版本及状态:GameSession 管当前模式和暂停;ChapterDirector 处理章节点;DeliveryRules 校验实际取送并结算;WorldState 持有稳定实体与任务变化;SaveStore 处理版本 / 原子保存 / 迁移;M4 的 WorldLoader 才负责资源生命周期。UI 发送意图和显示状态,不发奖励、不改物理。
剧情执行只允许宿主白名单命令,宿主再次核对地点、订单、交付记录和幂等键。禁止对白直接设置通关或发奖;不嵌入 JavaScript 运行时来复用 Vue / ADV.JS。先覆盖首章实际指令和表达式,不先重造完整叙事引擎。
4. M0–M1:冻结基线并建好原生入口
- [ ] G0.1 盘点当前未提交源码与实验改动,记录完整可信源版本 / 工作树归档、依赖、资源、工具与原生库 hash;保留当前可运行版本,不把零散源码替换称为完整基线。
- [ ] G0.2 建迁移台账,每项记录现有入口、规则来源、原生目标、验收证据、状态和延期去向。冻结首章多边形、地点 / 订单 / 角色 ID、画质和目标设备。
- [ ] G0.3 固定 Godot、导出模板、GDExtension、Rust 与 Rapier 版本。现有实验记录为 Godot 4.7.2、
godotRust crate 0.5.5、Rapier 0.36.0;这是基线,不是自动升级授权。物理查询仅保留一个权威来源,避免 Godot 刚体与扩展重复处理同一接触。 - [ ] G1.1 建生产工程、输入动作、暂停 / 失焦释放、日志脱敏与开发 / 发布配置;发布构建排除编辑器 helper、诊断入口和压力快捷键。
- [ ] G1.2 将一次性导出改为可重复流水线:固定输入 → 模型 / 纹理与碰撞 / 任务导出 → 内容校验 → Godot 导入 → 导出包。缓存离线生成,避免玩家首次启动花几十秒重新烘焙整城。
- [ ] G1.3 先在 Windows 原生 runner 构建扩展并导出薄包,验证真实动态库装载、纹理、音频、物理查询与离线运行;macOS 执行相同小场景。此项不过,不进入大规模首章移植。
- [ ] G1.4 固定任务 / 剧情中立数据、存档与世界 ID 契约,导出当前 TS 行为 fixtures;创建原生 / 现有规则同输入的对照入口。
M1 验收制品是可独立运行的薄包、构建清单与逻辑对照报告;需要真实导出包,不以编辑器 Play 或拷贝本机缓存代替。
原始清单的勾选表示该项完整验收关闭;实现与平台延期分别记在实施进度表。Windows 实机延期期间不把交叉编译等同于 G1.3 通过,也不将薄包写成完整城市资源已迁入。
5. M2:先完成第一章与客村 / TIT
当前原生候选已实现下列生活与章节流程,具体功能证据与未关闭验收见 M2 记录。清单勾选仍表示整项验收关闭;实体手柄、人手全章、同画质性能和延期的平台验证尚待完成。
5.1 先打通角色与城市生活循环
- [ ] G2.0 Windows 薄包通过后,先完成午餐单最小闭环:
DeliveryRules接单 / 取送 / 幂等结算、SaveStore原生写入 / 读取、陈叔交互提示;实际退出进程再重启核对任务与积分。此项是 M1 出口后的首个切片,不等于完整街区或整章。 - [ ] G2.1 骑行、刹车、倒车、加速、左右踹、第一 / 第三人称、步行与上下车;保留桥面、水边、台阶、停车点和玩家 / 活体碰撞。菜单、地图、交谈时释放输入,恢复后不粘键。
- [ ] G2.2 客村 / TIT 可辨识路口、骑手站、麦当劳、交付点、车库、行人、公交、停车车辆、路灯与环境音;任务可达,碰撞与视觉对应,未完成区域边界可见。
- [ ] G2.3 完成“登记 → 接单 → 取餐 → 导航 → 停稳交付 → 奖励 → 车库装备 → 再接一单”。沿用当前制服门槛,不用迁移发新奖或修改价格。首章候选的车库完成免费 / 任务外观;付费权益记录保留,可信恢复见 G3.3,不把线上购买作为单机依赖。
- [ ] G2.4 首页剧情 / 自由模式、暂停、地图、图形 / 音频 / 操作 / 通用设置、对话、任务提示与结束卡。复用 GTA 风格和 token 语义;原生 Control 不保留 DOM 实现,但要保留可测操作标识、键盘 / 手柄焦点、选中态及输入取消行为。
- [ ] G2.5 接入日夜与既有天气、音效混音、音量持久化、暂停 / 后台音频策略、中文字体和长文本。首发键鼠与实体手柄完整验收;保留窄屏 / 触屏动作设计,手机出口在 M6 独立完成。
“完整街区”验收为:不进入主线也能从骑手站开始自由骑行、上下车、完成一单、得到进度、换装、存档、退出再继续;主线结束后仍能回到这一循环。附带不承担首章作用的完整室内、载具目录与城市活动在 M6 列项回迁。
5.2 完整迁移「粥还热」
以首章设计为规则来源,保留七个现有订单 ID、对白语气、任务门槛与据点进度,不用三单配送 demo 替代。
| 节点 | 原生必做行为 | 失败与恢复检查 |
|---|---|---|
| 客村上路 | 登记、午餐取送、停车交接及导航 | 未登记 / 未取件不能越级;暂停和重启恢复订单 |
| 阿婆热粥与咖啡遭遇 | 热粥交付、咖啡接近事件、后续救援解锁 | 咖啡允许按现有规则取消,已触发事件不重复 |
| 阿婆第二单 | 主动轻敲两下、运行两秒回应、引开或踢退两名感染者 | 暂停 / 地图 / 交谈不计时;未加载场景不能自动算清场 |
| 接阿婆出门 | 门前 22 米连续 1.5 秒安全,回门口停稳主动接人 | 记录已清场状态;取消再接、退出重启可续,不能停车自动跳过 |
| 密送解药 | 取箱、阿杰来电、主路 / 绕行真实导航、经过所选路口后南门交付 | 主路三名感染者;可改选绕行;到南门不能跳过路口,不新增交付倒计时 |
| 祠堂有灯 | 粮米与工具配送,救护棚 / 厨房 / 修车点按阶段出现 | 阶段由任务记录派生,加载 / 读档不重复生成或结算 |
| 街坊回信 | 收尾对话、通关卡、称呼“街坊骑手”、继续探索 | 旧档补救援、重看结尾、重启恢复;不重复积分,不虚构 Steam 成就 |
- [ ] G2.6 移植首章规则与原生剧情执行;测试对白数据版本变化后从本次交谈起点恢复,已完成取送 / 救援保持。
- [ ] G2.7 打通全部节点的 HUD、路线、镜头、暂停、交互和据点表现,覆盖主路与绕行两种结局路径。
- [ ] G2.8 完成全新档连续实玩、逐节点退出重启、取消重接、死亡 / 重试、旧档补任务和重复收尾;键鼠与实体手柄分别验证。测试传送只用于夹具,不作为全章实玩证据。
首章普通模式按原剧情事件生成敌人。已有“初始 300 只”的真实战斗与同屏压力保持独立场景、同等规则和门槛;不能删掉该压力矩阵后宣称已经通过原验收。
6. M3:存档兼容、资源与原生发行
存档迁移与回退
现有 Web 街区存档是 dayun-kicker.district-save.v1.guangzhou.<slot>,原生实验使用独立目录与格式 1 / 2。正式原生 schema 需显式标明格式、城市 / 地图 / 规则 / 剧情版本;保留 dayun-kicker 技术标识,不把实验自动档冒充正式首章档。
- [ ] G3.1 提供只读导入旧 Electron 文件 / 显式导出的 Web 存档;覆盖自动及槽 1 / 2 / 3、职业、制服 / 装备、积分、背包、任务与据点、救援、路线与路口、通关、车辆 / 位置、昼夜等支持字段。原生实验档另设格式转换,不混用解析器。
- [ ] G3.2 白名单解析、大小 / 数值校验、校验和、原子写入、备份恢复、未来版本拒绝覆盖;旧档在未迁移功能中的字段原样隔离保留,提示暂不可继续的活动,禁止静默丢弃。浏览器存档需通过导出入口获得,不扫描浏览器配置或复制会话。
- [ ] G3.3 导入前预览来源和目标槽;保持原文件与时间戳备份,使用独立原生路径。连续导入不叠加积分 / 奖励;付费权益从权威平台恢复,不因导入本地字段赋予购买资格。M6 接通可信恢复前,保留旧客户端的购买 / 使用能力,原生候选明确标注该项待恢复,不显示失去所有权、不重置权益或要求重新购买,也不宣传已支持付费外观。
- [ ] G3.4 位置在未开放区域时保存原位置并提示,提供已交付安全点恢复;任务阶段不回退、不伪造交付。未来重新开放区域后仍可定位原状态。
回退为继续运行已冻结的旧客户端与原始旧档。原生新进度不自动降级覆盖旧档;回退限制在发布说明中写明。M3 前演练旧档导入、原生损坏备份恢复和客户端回退。
资源和导出
- [ ] G3.5 复用媒体流程及
assets:publish/assets:pull/assets:check。新 Godot 目标目录、派生资源与原生依赖需要时扩充共享目标白名单、MIME 和来源清单,不另建 Godot 专用下载器。.godot/导入缓存、GLB / 贴图、动态库及安装包不进 Git;轻量手写场景、稳定 UID 和必要的.import文本设置可跟踪,保证导入参数可重现。 - [ ] G3.6 从干净环境恢复资源后导出;实际运行包内导入资源,不依赖
Image.load_from_file读取编辑器原始文件或本机绝对路径。固定 Godot、模板、原生库、资源和内容 hash,检查 helper / 调试接口未入包。 - [ ] G3.7 原生候选先完成 Windows 离线安装 / 升级 / 卸载与保留存档、窗口 / 全屏 / 分辨率、手柄、音频、错误恢复;其他平台分别构建、签名与测试,不能拿 macOS 扩展代替 Windows 库。
- [ ] G3.8 沿用现有发布资源和内容校验工具,为 Godot 包补检查适配。正式 Steam App ID / Depot 配置、启动与商店声明对齐;声明 Overlay / Cloud 等功能前逐项实测。不为首章强行接广告、内购或在线登录。
沿用客户端完整运行资源 128 MiB raw、每架构完整解包应用 768 MiB 的已有上限;当前约 491 MiB 实验模型不能直接作为发行资源。Web / Electron 的 JS gzip 门槛继续约束其产物,不能生搬成 Godot PCK 的指标,也不能因原生迁移默默取消总预算。应分别列出 PCK、导入纹理 / 模型、扩展、引擎和合计,超限先去重、裁剪、压缩和拆分。
7. M4:在已有地图上实现分块加载
M2–M3 通过后,先把相同内容改成分块,验证前后任务、道路、碰撞、画面和存档一致,再新增地理内容。已有静态合批网格、256 米碰撞窗口、启动分段构建都不等于完整流式系统。
数据与加载生命周期
维持既有“约 1 km 地图单元”的内容 / 分发方向;运行时渲染、碰撞子块可更细。以 256 / 512 米作为性能实验候选,不提前承诺固定尺寸或把 128 米合批范围直接当资源块。
- [ ] G4.1 定义
CityManifest/CellManifest:城市和坐标原点、cell ID / 包围盒、版本 / hash / 依赖、资源 / 碰撞 / 导航索引、全局实体 ID、跨块道路与任务引用、LOD 和构建成本。重复地物有唯一所有者;桥梁 / 河岸跨块几何按同一切分规则保留连续性。 - [ ] G4.2 实现
WorldLoader:unloaded → requested → loading → prepared → activating → active → retiring → unloaded;每个请求携带版本 / generation,取消后到达的旧结果不得挂入新世界。状态和错误可观测,失败保留重试入口与当前可玩区。 - [ ] G4.3 后台只做安全的数据准备与资源请求;资源已完成才获取,节点接入、碰撞 / 导航同步和 GPU 相关工作按帧预算分批提交。后台读取完成不等于已经可通行。官方后台加载说明
- [ ] G4.4 按位置、速度、朝向和路线预取;优先碰撞 / 支撑面 / 必要导航,再开放玩家进入,之后补近景和装饰。预取距离至少覆盖速度乘加载耗时及安全余量;加载赶不上时用明确安全边界等待,不允许先驶入空地再补碰撞。
- [ ] G4.5 对玩家、当前骑乘 / 停放车辆、活跃剧情、追逐 / 战斗、室内出口和跨块公交建立驻留引用;设硬上限及退出机制,避免任务 pin 整条路线导致无限驻留。只保留任务地点元数据,不为未来交付常驻整段地图。
- [ ] G4.6 跨块只更新实体归属,不复制实体;接缝的道路 / 导航连接在可用版本上原子切换。不可达目标明确返回失败,不每帧对整城重规划;导航结构保持简化和固定全局道路索引。官方导航性能说明
卸载、坐标与持久化
- [ ] G4.7
WorldState持有存档状态,场景节点只投影状态;卸载前记录已结算事件、任务 / 据点变化、物品与车辆归属。释放节点、计时器、信号、碰撞 / 导航、MultiMesh 和独占资源引用;共享资源按引用计数回收。 - [ ] G4.8 对远处交通 / 行人使用明确的简化模拟规则;活跃任务与战斗区域保留已承诺的物理和规则频率。任何模拟简化单独对照,不拿减少 AI 或碰撞工作量冒充同负载提速。
- [ ] G4.9 存档采用稳定城市坐标、cell ID 与局部坐标;地图版本不同先走迁移映射,缺块提供安全恢复。渲染原点变化不能改世界 ID、任务距离或联网位置。先测既有地图范围精度,再决定是否需要原点移动 / 大世界坐标;不直接把经纬度当场景米制坐标。大世界坐标说明
M4 出口验收
- 同一章节在固定包 / 流式包分别通关,订单、奖励、关键世界状态一致;两个解药路线和跨桥骑行都通过。
- 最高合法速度连续穿越、掉头、斜向跨四块、跨块上下车 / 追逐、室内返回、边界存读档;不坠落、不穿墙、不重复人物、任务不丢失。
- 单次失败、缺块、hash 错误、依赖缺失、旧请求回调和版本更新不会破坏已激活世界;离线安装包运行不依赖 COS 网络。
- 同一跨块路线往返至少 20 次,外加不少于 30 分钟持续游玩;记录驻留 cell、资源引用、碰撞数、CPU / GPU / RSS 和启动时间,热身后不得随累计访问区域持续增长。
- 在 M0 冻结的内存 / 驻留上限和性能标准内通过。块大小、单帧激活时间和预取量经数据确定;本计划不凭空宣布目标机器能加载多少块。
8. M5:逐区扩城
推荐顺序为 客村 / TIT → 广州塔与滨江 → 赤岗及取药任务关联街区 → 琶洲 → 其他相邻区域。陈家祠先维持已交付的首章场景与路线,完整生活街区按连通性和内容价值另排。每轮只扩一个可验收的街区,不为地图面积先铺满半径 5 km 的规划圆。
- [ ] G5.1 建街区交付模板:可复现来源与许可、道路 / 地物版本、公共交通连接、碰撞 / 导航、任务点、一个可重复活动、环境音 / 日夜、地图入口与未完成边界。
- [ ] G5.2 每区先补可骑行连通路线,再做一个识别性地标和任务循环,最后补生活密度;先复用共享建模与导出工具。
- [ ] G5.3 新区通过独立导入检查、首章回归、跨区往返、旧档恢复、分块卸载与资源预算后,才合入下一地图版本。
- [ ] G5.4 每次更新同时交付地图 / 内容 / 存档映射、构建与实机证据、已知未覆盖项;发布失败保留上一个固定资源版本和有效存档。
完成定义为“新增街区有可玩价值且不破坏老内容”,不以建筑数量或截图面积验收。
9. M6:完整迁移的后续台账
下列能力不能因为不阻塞第一章而被遗忘。每个功能在 G0.2 记录细项、现有完成状态、目标入口与恢复条件;发布文案只列当前原生版已完成能力。
M6 是独立回迁队列,不要求等待扩完整座广州:M3 后即可安排经典赛事、必要 Steam 服务和既有付费权益恢复;涉及跨块同步的合作与城市包需等 M4 契约稳定。按优先级与 M4 / M5 交错排期,GPU 性能测试仍串行。付费权益恢复优先于扩展新的付费功能;每个阶段复盘台账,避免无限扩城挤掉既有能力。
| 功能包 | 迁移范围 | 排序与出口 |
|---|---|---|
| 经典赛事 | 计时 / 得分 / 道具 / 节奏 / 冲刺 / 连踹、记录、车流、输入与结算 | M3 后按玩家价值排期;规则、存档和真实游玩逐模式验证 |
| 城市活动与设施 | 巡逻追逐、搜刮与生活武器、完整商店 / 车库、塔内游览、地铁 / 影院等既有设施及载具 | 先迁首章依赖;剩余按街区与交互系统归组,保持旧档可恢复 |
| 原生合作 | 1–4 人独立移动、步行 / 骑行 / 后座、战斗 / 救援 / 撤离、邀请与重连 | 先本地权威规则对照,再真实局域网,最后 Steam / 云端跨网络;旧双座兼容入口独立处理 |
| Steam 服务 | 身份、邀请 / Overlay、云存档、后续成就与 Workshop | 首章必需启动能力先做,其余单独集成;现有 Node 适配器及双人回环不算验证 |
| 云乐坊账号与购买 | 原生登录、权益恢复、钱包 / 支付、排行榜、后端 ticket | 复用现有 BFF / 服务端;原生 Redirect + PKCE / 回调及凭证存储另定契约,不移植浏览器 Cookie 或内置密钥 |
| 手机与其他平台 | Android / iOS 导出、扩展构建、渲染档、触屏、前后台、发热 / 内存与平台 SDK | PC 基础通过后独立原型与实机门禁;不将 M1 Pro 窄屏测试称为手机通过 |
| AI 玩法包与城市包 | 已设计的 schema / MCP / Skills、城市导入 / 分享 | M4 世界与任务契约稳定后接入,优先受控数据内容,不为第一章先做编辑器平台 |
长期只维护一份内容与规则契约,按需分别保留原生与 Web 试玩宿主。M3 后旧客户端只修严重问题、迁移 / 导出与必要兼容;待台账所需能力完成、旧档和回退窗口明确后,再单独归档旧生产入口,保留必要构建工具与来源信息。
10. 验收、风险与执行节奏
统一门禁
| 层次 | 必须提供的证据 |
|---|---|
| 逻辑 | 首章状态 / 取送 / 救援 / 路口 / 幂等结算、骑行碰撞与伤害、存档版本 / 迁移 / 备份 / 未知字段、坏数据拒绝 |
| 实机功能 | 原生发布包新档连续全章,主路 / 绕行,逐节点重启、死亡重试、暂停 / 焦点、键鼠及实体手柄;自动到点不代替实玩 |
| 性能 | 固定画质 / 真实缓冲 / 物理、同版本 / 路线 / 工具;串行至少三组且交替顺序,P95 / P99、最低完整一秒、>50 ms、CPU、内存、冷 / 缓存启动和资源代价 |
| 流式与地图 | 跨块接缝、失败恢复、驻留上限、长时回收、全章及旧地图回归、来源 / 坐标 / hash |
| 发布 | Windows 原生库和导出模板匹配、包内资源完整、离线启动 / 升级 / 重启恢复、helper 排除、许可 / 署名、声明平台与 Steam 功能实测 |
既有 Godot 压力门槛保留:正式窗口 最低完整一秒帧数 ≥60、P99 ≤16.667 ms、零 >50 ms 长帧。普通首章与压力场景分别报告,不混合不同敌人数、HUD、存档或锁血配置。已有增强档画质和实际 1821×1138 / 4×MSAA 对照继续保留;其他设备另列其实际画质与缓冲,不通过降质通过旧条件。
新增首章、跨块的冷启动、内存及实机配置预算在 G0.2 测量现状后、实施前固定;未确定项记为“待冻结”,不能算通过。不得提高已有门槛来消除失败。性能候选遵守三层反馈:逻辑 → 真实短窗筛选 → 通过后才跑三单 / 长途完整验收。M2 首章功能可在性能尚未过关时做内部验证;M3 切换、M4 正式启动和内容扩城需要前序出口通过。
优先复用 benchmark:camera 的输入 / 路线与报告语义、Godot 三层测试、存档 / 章节 fixtures 和原生显示回归。新增首章 / 流式测试入口需明确标注为待实现,不把浏览器 E2E 原样套到 Godot。profiler、trace、截图和诊断 helper 与正式计时窗口分开;失焦、绘制停滞、后台负载或冻结校验失败的样本保留并拒收。
主要风险与处理
| 风险 | 提前处理 | 阻塞位置 |
|---|---|---|
| 扩展只有 macOS 证据 | M1 先做 Windows 薄包与原生查询,不等到全章完成 | G1.3 |
| 任务对白两份实现逐渐分叉 | 固定单一对白源 / 指令子集 / fixtures,宿主统一校验奖励 | G1.4 / G2.6 |
| 单街区与跨城首章范围失控 | 一区完整生活 + 必需路线 / 场景,构建期明确裁剪 | G0.2 / G2.7 |
| 画质、帧节奏或缓存启动失败 | 保留当前增强基线、全部成本与失败;先解决已证实热点 | M3,不提前切默认客户端 |
| 实验导出资源过大或依赖本机缓存 | 导入 / 去重 / 预构建、共享 COS 与包体检查、干净机离线运行 | G1.2 / G3.5–G3.7 |
| 旧档丢进度、重复奖励或回退覆盖 | 只读导入、逐版本转换、幂等键、原档备份和独立路径 | G3.1–G3.4 |
| 分块让碰撞、任务和实体丢失 | 先状态后场景、驻留引用、事务化激活 / 卸载、边界回归 | M4 |
| 同时做手机、四人、AI 和全城 | 按 M6 功能包排队,先完成前序里程碑 | 计划执行全程 |
建议工作量与首批任务
以下为一名熟悉当前项目的开发者全职投入的初始工程估算,含开发与回归;不是发布日期承诺,不含等待平台审核、全新美术、外部许可、正式 SDK 准入及未定位性能问题。多个模块可交错推进,但阶段出口保持顺序。
| 阶段 | 初始工程量 |
|---|---|
| M0 基线与契约 | 2–4 个工作日 |
| M1 原生工程与 Windows 薄包 | 5–8 个工作日 |
| M2 第一章与完整街区 | 15–25 个工作日 |
| M3 兼容与发行候选 | 5–10 个工作日,性能失败另行重估 |
| M4 分块加载 | 10–18 个工作日 |
| M5 每个新增街区 | 5–10 个工作日起,建模 / 数据与任务量单独估 |
| M6 后续功能包 | G0.2 完成台账后分别估,不纳入首章承诺 |
先排 G0.1 → G0.2 → G0.3 → G1.1–G1.4 → G2.0。第一批成果应是:从干净环境导出的 Windows 薄包能骑行、与陈叔交互、完成午餐单并保存 / 重启恢复;之后继续 G2.1–G2.8,补齐整章和街区内容。M1 完成后按实际进度重估 M2–M3;每阶段把证据和剩余事项写回台账,只在检查通过后勾选。