跳转到内容

第 45 章 · 上线后的迭代

约 8 分钟 难度:5 动手章

这一章解决:合作防守世界上线之后,如何根据日志和真实使用持续修复、平衡、迁移版本,并判断什么时候该拆新世界。

先看一下

第 44 章给了上线前停手线。上线后,玩家会把世界当成社交房、练习场、刷分房、截图场,也会在对象池边界、重开流程和迟入路径上做出测试时没覆盖到的行为。迭代的目标是让世界继续可维护,而不是把第一版扩到无边界。

这一章会拿到什么

  • 上线后一周的观察清单
  • Bug、平衡性、内容需求、运营需求的分流规则
  • 版本迁移与旧实例兼容的处理方式
  • 与 Vol.5 持久化系统的边界
  • 拆新世界的判断标准

依赖前面

  • 第 44 章的问题优先级和日志格式
  • 创作者视角 8 的真实使用视角
  • 第 27 章的复杂计分边界
  • 第 28 章的重入策略
  • 第 39 章的 Quest 与性能预算

上线后先观察四类信号。它们对应四种处理,不要混在一个「待优化」列表里。

信号例子处理入口
Bug重开后敌人不生成、分数重复加、迟入看到错误阶段回第 44 章问题优先级
平衡性第 1 波太慢、第 3 波突然过难、4 人房比 2 人房简单太多调参数和波次配置
偏差使用玩家不开局只聊天、把敌人引到出生点、结算屏停留截图判断是否纳入设计
长期需求排行榜、累计等级、每日奖励、跨实例活动接 Vol.5,不在本卷展开

这四类信号的修法不同。Bug 要复现和修;平衡性要用数据和反馈调;偏差使用要判断是否好玩;长期需求要先定义持久化边界。


第 44 章的优先级上线后继续使用。

优先级上线后动作
P0 阻断尽快修复并重新上传;必要时临时隐藏入口或提示玩家避开
P1 严重排进最近一版;如果与新功能有关,先禁用新功能
P2 普通累积到小版本一起处理
P3 观察收集更多日志和复现路径

上线后处理 Bug 的关键是保留复现路径。每条 P0 / P1 至少记录:世界版本、实例人数、平台、matchId、阶段、Owner、相关日志、玩家操作顺序。

如果一条问题三次修复仍然复现,按设计缺陷处理。不要继续在同一段代码上补丁叠补丁。回到 ADR,看状态归属、Owner、迟入恢复和降级入口是否写错了。


平衡性优先调参数,不先改架构

Section titled “平衡性优先调参数,不先改架构”

合作防守世界最常见的平衡项是波次时间、敌人 HP、敌人数量、得分、冷却、对象池容量。

参数先看什么常见调整
波次时间多数队伍是否能在剩余 20% 时间内清完缩短或延长每波持续时间
敌人 HP单人是否打不动,4 人是否秒清按人数缩放 HP 或数量
敌人数量对象池是否经常耗尽降低同屏数量,增加波内批次
得分玩家是否知道自己贡献调整个人分和队伍分展示
冷却攻击是否卡手或刷分过快调 pending 和确认冷却

平衡性优先放进配置,不改请求式架构。敌人多一只、HP 多一点、波次短一点,都不应该牵动 PlayerObject、GameState 和 EnemyObject 的状态归属。


偏差使用:能变玩法就收编,破坏状态就挡住

Section titled “偏差使用:能变玩法就收编,破坏状态就挡住”

玩家会用设计之外的方式玩世界。处理方式分两类。

偏差使用判断处理
在大厅聊天不开局不破坏状态,可能是有价值的社交行为保留,改善大厅 UI 和等待体验
在结算屏停留截图不破坏状态保留,给结果面板更清晰的展示
把敌人卡在出生点破坏战斗流程调碰撞、出生点、重置规则
反复进出触发迟入路径可能破坏状态用第 28 章重入策略和日志定位
利用对象池耗尽刷分破坏共识状态P1,修裁决和幂等

设计之外不等于错误。判断标准是:它是否破坏 GameState 共识状态,是否让其他玩家无法继续一局,是否造成无法恢复的性能或网络压力。


版本迁移:新版本要能识别旧状态

Section titled “版本迁移:新版本要能识别旧状态”

VRChat 世界上传新版本后,旧实例和新实例的过渡要谨慎。同步字段结构一旦改变,旧版本玩家和新版本逻辑之间可能出现不一致。

推荐在 GameState 上保留一个同步字段:

[UdonSynced] private int rulesVersion = 1;

它不等于世界上传版本号。它只表示当前运行规则的状态格式。加字段通常不需要改;改字段语义、改结算规则、改 matchId 或敌人状态结构时,递增 rulesVersion

private bool IsCompatibleRulesVersion()
{
return rulesVersion == CURRENT_RULES_VERSION;
}

发现不兼容时,最稳的做法是让当前局安全结束或回到 Lobby,不在半局里尝试迁移全部字段。


旧世界兼容:能读旧字段,别让旧字段继续写

Section titled “旧世界兼容:能读旧字段,别让旧字段继续写”

第一版上线后,玩家可能还在旧实例里。新的脚本字段默认值必须安全。

改动安全写法
新增同步字段给默认值,让旧局迟入时不会误判
新增枚举状态未识别值回到 LOBBY 或 RESULT 安全态
改结算规则rulesVersion 分支处理旧规则
删除字段语义保留一版只读兼容,不让旧字段继续影响分数

字段删除最危险。教程项目里更推荐「废弃但保留」:字段还在,但新逻辑不再写它,只在迁移期读取或清理。等下一轮大版本再删。


排行榜、累计等级、每日奖励、跨实例活动都属于长期系统。本卷只留边界。

需求本卷负责Vol.5 负责
本局个人分PlayerObject personalScore结算后写入长期分
本局 MVPGameState.resultMvpPlayerId计入成就或徽章
本局完成次数OnMatchEndedHook 接口PlayerData / Persistence 存储
全局排行榜不实现远程内容或持久化体系
跨实例活动不实现运营和长期数据系统

OnMatchEndedHook 是边界。它在本局结算结束时抛出结果,长期系统自己决定保存什么。本卷不让持久化反过来影响一局内的实时状态。


有些需求适合迭代,有些需求适合拆新世界。

继续迭代拆新世界
调波次、HP、得分、UI 文案从合作 PvE 改成强竞技 PvP
加少量敌人类型把地图结构改成完全不同玩法
加结算展示和战报引入长期经济和跨实例活动作为核心
优化 Quest 性能需要完全不同的 Owner 拓扑
改大厅等待体验现有 ADR 大部分失效

判断方法很直接:如果第 40 章 ADR 里的大部分状态归属还能保留,就继续迭代;如果 PlayerObject / GameState / EnemyObject 的边界都要重写,拆新世界更干净。


挑一条试。

  • 选一个 P2 体验问题,例如普通命中特效偶尔丢。把它写成两种方案:修到 100% 送达,或承认为可降级表现。哪一种更符合第 43 章的体感边界?
  • rulesVersion 设计一次迁移:旧版本没有 resultMvpPlayerId,新版本有。RESULT 阶段迟入时应该显示什么?
场景预期实际
1. P0 修复后回归原复现路径不再出现,项目级测试清单第 1–3 行通过
2. 调整敌人 HP状态归属不变,只改配置,迟入和结算仍正确
3. rulesVersion 不兼容当前局安全回 Lobby 或保持 RESULT,不出现半局错误状态
4. 旧字段保留只读新逻辑不再写旧字段,旧字段残留不影响分数
5. OnMatchEndedHook 调用长期系统只读结算结果,不反写本局实时状态
6. 判断拆新世界新需求对第 40 章 ADR 的影响被列清楚
  • 能把上线后反馈分成 Bug、平衡性、偏差使用、长期需求四类
  • 能说明为什么平衡性优先调参数
  • 能给版本迁移加 rulesVersion 边界
  • 能说出 Vol.2 和 Vol.5 的接口分界
  • 能判断一个需求适合迭代还是拆新世界