跳转到内容

第 46 章 · 项目改造对照表

约 7 分钟 难度:5 动手章

这一章解决:合作防守项目已经跑通之后,如何把同一套架构改造成其他玩法,而不是从零重写。

先看一下

第八部主项目是 2–4 人合作防守。它是一个完整样本。真正可迁移的是状态归属和同步边界:PlayerObject 存每位玩家的状态,GameState 存全局流程,玩法对象存单体状态,本地层处理体感。

这一章会拿到什么

  • 一张合作防守 → 其他玩法的改造总表
  • 卡牌、解谜、派对、轻 PvE、PvP 一对多的字段替换方向
  • 哪些章节要回查,哪些代码可以保留
  • 改造时最容易破坏的边界
  • 本卷最后的回查索引

依赖前面

  • 第 40 章 ADR
  • 闭环 4 最小可玩版本
  • 第 42 章 EnemyObject + 对象池
  • 第 43 章体感优化
  • 第 45 章迭代与拆新世界判断

把合作防守改成其他玩法时,底层骨架大多不动。

保留原因
PlayerObject每位玩家一份状态和请求入口仍然需要
GameState全局阶段、版本号、结算和 Owner 候选仍然需要
requestId / lastProcessedRequestId网络重复和乱序仍然存在
stateVersion远端整批应用状态仍然需要
matchId跨局残留和旧事件仍然需要隔离
测试矩阵迟入、Owner 离开、重开、拥塞仍然要测

真正变化的是玩法对象和节奏:敌人可以变成卡牌、机关、派对道具、Boss、小队目标。只要状态归属不乱,项目不需要推倒重来。


目标玩法保留最多的部分主要替换回查章节
回合制卡牌PlayerObject 请求、GameState 阶段、结算EnemyObject → Card / Board;时间 tick → 回合 tick第 25、19、22、24 章
多人解谜GameState 阶段、可恢复状态、对象状态EnemyObject → PuzzleObject;分数 → 进度第 5、16、19、28 章
派对小游戏大厅、Ready、轻实时 tick、体感反馈敌人 → 多个短小游戏模块第 15、26、29、44 章
轻 PvE / Boss 战EnemyObject、对象池、体感反馈多个普通敌人 → 少量关键 Boss 阶段第 34、36、39、43 章
PvP 一对多PlayerObject、GameState、结算队伍、胜负、权限和旁观策略第 17、27、28、33 章

这张表的用法是先选目标玩法,再回查对应章节。不要先复制代码。先复制 ADR,再改字段。


合作防守的核心是时间驱动,卡牌的核心是行动窗口。改造重点是把 wave 换成 turn,把 EnemyObject 换成 board state。

合作防守字段卡牌替换
waveIndexturnNumber
waveStartServerTimeturnStartServerTime
enemyAliveCountremainingActionsdeckCount
EnemyObjectCard / Board slot
命中请求出牌请求
teamScore玩家生命 / 回合分 / 胜负快照

卡牌更适合命令同步。每次出牌是一条低频命令,命令日志有价值:复盘、撤销、迟入时重建棋盘,都能从命令流或快照里做。第 24 章的 VRCJson 也更适合这类低频复杂状态。

对象池通常不再是主轴。卡牌可以是 UI 或预放置对象,重点是棋盘状态和手牌归属。


解谜玩法的关键是可恢复状态。机关开关、门、镜子、压力板、密码进度,都要让迟入玩家看到当前状态。

合作防守字段解谜替换
enemyAliveCountpuzzleSolvedCount
EnemyObject HPPuzzleObject 状态
命中特效机关反馈事件
resultReason解谜完成 / 超时 / 放弃
teamScore可选,通常不需要

解谜世界可以少用体感预演,多用同步字段。玩家拉下拉杆后,所有人都要看到门开了;迟入玩家也要看到门已经开。Network Event 只播音效和粒子,门状态必须是同步字段。

旁观和重入要按第 28 章处理。解谜中途加入的人通常可以直接参与,但如果谜题依赖前置知识,可以先给旁观或提示状态。


派对玩法通常是一串短局:选小游戏、倒计时、玩 30 秒、结算、换下一轮。合作防守的大厅和轻实时 tick 可以保留。

合作防守字段派对替换
waveIndexroundIndex
EnemyObjectMiniGameObject
enemyAliveCount当前小游戏目标计数
matchDuration每轮时长
resultReason本轮结束原因

派对玩法的风险是模块边界。每个小游戏都想加自己的字段,最后 GameState 会膨胀。更稳的写法是每个小游戏模块自己保存局部状态,GameState 只保存当前小游戏 ID、轮次、倒计时和总分。

第 44 章测试矩阵要扩大:不只测一局,还要测连续 5 轮小游戏切换。旧模块字段不能串到下一轮。


Boss 战和合作防守很接近。差异是敌人数量少,单体状态更重要。

合作防守Boss 战
多个普通 EnemyObject一个或少量 BossObject
enemyAliveCountbossPhase / bossHp
对象池耗尽技能对象池耗尽
普通命中特效降级Boss 关键技能反馈保留
波次推进阶段推进

Boss 的 HP、阶段、技能冷却要同步。小怪和技能弹幕可以降级成本地表现或对象池。第 34 章讲过:影响胜负的关键 NPC 必须同步,制造压力的装饰敌人可以只做本地表现。

Boss 战更需要第 43 章的体感优化。玩家按技能后要立刻有反馈,但 Boss HP 和阶段仍等 Owner 确认。


PvP 一对多是本部对照小练 D 的方向。它改动最大,但仍然复用骨架。

合作防守PvP 一对多
一支合作队攻击方 vs 防守方
teamScore[0]teamScore[attacker] / teamScore[defender]
敌人对象玩家目标 / 资源点 / 守护目标
resultReason=ALL_TARGETS_CLEARED攻击方达成目标 / 防守方守到时间结束
INGAME 迟入默认旁观按队伍人数决定旁观或补位

PvP 的关键是把胜负条件写清楚。一对多通常需要不对称目标:攻击方摧毁目标,防守方拖到时间结束。ComputeWinningTeam 不能只比较 teamScore[],要按模式写专门规则。

权限也要更保守。玩家不能自己声明「我赢了」;PlayerObject 只能发请求,GameState 裁决目标是否被占领、目标是否被破坏、时间是否到。


每次改造前,先回答这五个问题。

  1. 这类玩法的 tick 由什么驱动:玩家行动、时间,还是阶段事件?
  2. 迟入玩家必须看到哪些状态?
  3. 哪些对象影响胜负,哪些只是表现?
  4. 结算依据是什么:分数、时间、目标状态,还是队伍条件?
  5. 第 40 章 ADR 里哪些行需要改?

答完这五个问题,再写字段表。字段表写清楚后,代码通常只是闭环 4 的替换。


挑一条试。

  • 把合作防守改成「两队抢占据点」。只改 ADR 和字段表,不写代码。enemyAliveCount 会变成什么?resultReason 有哪些新值?
  • 把合作防守改成「两人回合制卡牌」。哪些第八部章节可以直接跳过?哪些第四部章节反而要回查?
场景预期实际
1. 改造前 ADR新玩法的状态归属表完整,能指出保留和删除的字段
2. 迟入恢复检查新玩法中迟入必须看到的状态都走同步字段
3. Owner 离开新玩法的全局状态能继续或安全回 Lobby
4. 结算条件胜负只由 GameState 裁决,不由 PlayerObject 直接写
5. 降级入口高风险对象都有对象池耗尽、网络拥塞或性能降级策略
6. 连续 3 局matchId 隔离旧局事件,新玩法字段不串局
  • 能说出合作防守改造时哪些底层骨架不动
  • 能把 wave / enemy / score 替换成目标玩法自己的字段
  • 能说明卡牌、解谜、派对、Boss、PvP 一对多各自回查哪些章节
  • 能用五个问题开始一次玩法改造
  • 能判断一个改造适合继续迭代还是拆新世界