跳转到内容

第 1 章 · 一局游戏需要哪些状态

约 6 分钟 难度:1 动手章

Vol.1 的最后一站是同步灯。两个玩家都看到「灯亮了」,是 VRChat 的网络入门承诺。要做一局完整的合作防守游戏,仅仅亮灯是不够的。玩家会问:

  • 我加入的时候,分数应该是多少?
  • Master 玩家退出之后,怪是不是不动了?
  • 我按按钮触发陷阱,按完之后这个陷阱要不要进入冷却?冷却时间显示在哪里?
  • 第三个玩家迟入进来,他看到的世界是什么样?

这些都是状态问题。这一章不打开 Unity,先把「一局游戏里有哪些状态」列出来。后面六部讲的所有事情,都是把这份清单里的某一行落到代码上。


Vol.2 全卷会反复回到同一个示例:

  • 玩家从地图边缘的出生点进入。
  • 中心有一个核心。怪从外围向核心移动,核心被打掉就失败。
  • 玩家可以拾取武器、按按钮触发陷阱、补血、复活倒下的队友。
  • 一局五波,撑过即胜利,结算后回大厅。

这个项目比 FPS 更适合 VRChat:能覆盖实时状态、NPC、队伍、分数、对象池、观战与结算,又不把「精确命中判定」当成核心承诺。第七部会把它真的做出来。

之前章节出现的「2-4 人合作防守」「合作防守世界」「示例项目」指的都是它。回合制卡牌世界作为对照案例,会在这一章末尾的变式练习里第一次出现。


第一步:列出所有「被记住」的信息

Section titled “第一步:列出所有「被记住」的信息”

打开一份空白文档,跟着列。先不要管同步、不要管 Owner、不要管 VRChat 怎么实现。只问一句:哪些信息如果丢了,游戏就不能继续?

下面是一份起手清单,列完之后会再分类。

- 当前是哪一波
- 当前波数还剩多少敌人
- 总分
- 大厅 / 战斗 / 结算 三个阶段中的哪一个
- 倒计时还剩几秒
- 每个玩家的位置
- 每个玩家的 HP
- 每个玩家是否倒下
- 每个玩家手上拿了什么武器
- 每个陷阱是否在冷却
- 每个陷阱的冷却倒计时
- 核心剩多少血
- 每只敌人的位置
- 每只敌人的 HP
- 每只敌人在追谁
- 刚刚发生的爆炸特效
- 刚刚捡到道具的提示
- 鼠标悬停在哪个按钮上
- 本地音量
- ...

不到二十条就能起步。实际项目里会更多。

写完不要急着想「哪些要同步」。先做下一步。


把这份清单按两个问题打两次叉。

第一刀:持续时间。****持续状态指在游戏的某一段时间里始终是某个值,例如「当前是第 3 波」「玩家 A 的 HP 是 60」「核心还剩 1200 血」。瞬时动作指发生过一下、过了就没了的事件,例如「刚刚被打中了一下」「刚刚捡到一把枪」「陷阱刚刚触发了爆炸特效」。

第二刀:受众。****共享信息是所有玩家都要看到的状态。最典型的是游戏的全局数值(波次、分数、核心血量),以及每个玩家彼此都能看到的位置和 HP。私有信息只服务这个玩家自己:本地 UI 状态、私人音量、个人偏好这些不影响别人的东西。

两刀切完得到四象限:

持续瞬时
共享波次、分数、玩家 HP、陷阱冷却剩余、核心血量陷阱触发的爆炸特效、击杀提示、捡到道具的全局公告
私有本地 UI 状态、私人音量、个人偏好鼠标移过提示、本地点击反馈

四个象限映射到后面会出现的四种通道。共享 × 持续走同步变量(Synced Variable),共享 × 瞬时走网络事件(Network Event)。两类私有状态都不出本机,走本地逻辑。物理 / Transform 同步是这张表之外的第五类,由 VRCObjectSync 单独承担。

通道选择不是这一章的事。这一章先把分类做对。


把第二步分好类的清单,再过一遍:第三个玩家在游戏开始 30 秒后迟入进来,他需要看到什么?

这一关筛掉的是「看起来要同步、其实迟入根本拿不到」的东西。共享 × 持续状态他必须能看到:波次和总分这类全局数值、每个玩家的 HP、每个陷阱的冷却剩余,全要恢复给他。共享 × 瞬时动作他看不到过去发生过的:30 秒前那一波怪被打掉时的爆炸特效对他来说没意义,也不该给他。私有信息他自己的私有状态从默认值开始就行。

迟入恢复是第 5 章的专题。这里只先建立一个直觉:事件不会重放,状态会复制。这一句会在 Vol.2 反复出现。


把示例换成回合制卡牌世界,重做一遍前两步。持续状态变了:当前是谁的回合、桌面上的牌堆,加上双方各自的手牌和血量。瞬时动作变了:抽牌动画、打出牌的高亮、回合结束的提示音。私有信息变了:手牌只对自己可见,这是合作防守里没有的轴,共享和私有的边界变成了游戏机制本身。

回合制卡牌和合作防守的最大区别不在网络层,在状态结构:卡牌的状态变化离散、回合制、有明确所有者;合作防守的状态连续、并行、所有权交叉。第二部讲到 Owner 模型时会回到这个对比。

试着把自己最想做的世界类型也拆一遍:解谜、舞会、舞台演出、剧本杀。看哪些状态在四象限里、哪些状态难以归类。归类困难的那几个,常常就是下一章要讨论的边缘情况。


一局游戏的状态可以按「持续时间 × 受众」拆四象限。拆分先于通道选择:先把状态分清楚,再决定怎么实现。迟入玩家要拿到所有「共享 × 持续」状态,「共享 × 瞬时」动作他天然拿不到。

第 2 章会把这四类状态对到 VRChat 的四种通道,用同一个按钮示例分别写四种实现,看清它们各自解决什么问题。


  • VRChat Creator Docs · Network Components — 同步变量、网络事件、VRCObjectSync 的官方说明。
  • VRChat Creator Docs · Networking — 网络模型总览,包含 Owner、Master、迟入玩家的概念入口。
  • 附录 · 术语表 — 本章涉及的 OwnerMasterLate JoinerSynced VariableNetwork Event 等术语的客观定义。