跳转到内容

第二部 · 玩家对象与权威拓扑

这是第二部。读这一部之前建议先做完闭环 1,亲眼看到 Master 离开整局丢失、Ready 状态互相覆盖这两个问题。

第一部把通道讲清楚后,下一个问题是:谁能改这些状态。VRChat 没有权威服务器,权威拓扑要在写代码之前就设计好。代码里到处出现 SetOwner() 通常意味着权威拓扑还没想清楚。

  • 玩家进入房间后,系统要给他什么:身份、准备、队伍、输入通道、个人 UI
  • VRCPlayerObject:每位玩家固定拥有自己的对象。它适合什么、不适合什么
  • CyanPlayerObjectPool:作为历史方案与兼容案例理解
  • 全局状态管理器(GameState)的三种 Owner 策略:固定 Owner、Owner 候选队列、Owner 重选
  • 请求式架构:玩家对象请求,状态管理器裁决(本部给出固定代码模板,后续章节复用)
  • 权限与冲突:抢按钮、抢拾取、同时加入队伍
  • Owner 离开后,玩家对象、全局状态、物理对象的不同恢复路径
  • 第一部第 3 章:Owner 是「这份状态托管在谁那里」。IsMaster 是旧逻辑,新系统不再当作默认权威。
  • 第一部第 5 章:事件不会重放,迟入玩家只能拿到当前同步状态。
  • 第一部理解章 A:同步不是广播,是状态复制。每份状态都有一个明确的托管者。
  • 闭环 1 留下的两个缺陷:Master 离开整局丢失;每位玩家的 Ready 状态共用一份字段,会互相覆盖。

第二部从第 11 章开始按当前推荐写法给网络事件方法加 [NetworkCallable],第 12、13 章还会使用参数化网络事件。这些能力需要 VRChat World SDK ≥ 3.8.1。在 VCC 里把 VRChat Worlds 包升到 3.8.1 或更新。同时本部用到的 VRCPlayerObjectVRCEnablePersistence 组件来自 Persistence 相关 SDK 功能,用最新版即可。

涉及的 using 段(出现过的几个新命名空间):

using VRC.SDKBase; // VRCPlayerApi, Networking, Utilities 等
using VRC.SDK3.UdonNetworkCalling; // [NetworkCallable] 属性
using VRC.Udon.Common.Interfaces; // NetworkEventTarget 枚举
// 用到 VRCPlayerObject / VRCEnablePersistence 类型时再加:
// using VRC.SDK3.Persistence;

具体每个脚本要用哪几个,看章节代码里的 using 段。

每位玩家有自己的轨迹:分权的理由不是省带宽,是承认每位玩家本身就承载着独立的一组状态。

  1. 第 8 章 · 玩家进入房间后,系统要给他什么
  2. 第 9 章 · VRCPlayerObject:每个玩家一份对象(含 PlayerObject 边界卡)
  3. 第 10 章 · CyanPlayerObjectPool:历史方案与兼容案例
  4. 第 11 章 · 全局状态管理器(含三个反向案例与「GameState Owner 不是服务器」红线)
  5. 第 12 章 · 请求式架构:固定模板(PlayerObject + GameState 代码骨架)
  6. 第 13 章 · 权限与冲突
  7. 第 14 章 · Owner 离开后的恢复(含 Owner 失效恢复检查表)