41. 测试你的世界
第 40 章把单条 bug 怎么查讲完了。但「能查 bug」和「世界能拉去给陌生人玩」之间还隔着一层:那些只在多人、只在 Quest、只在后加入者身上才出现的问题,单人调试根本撞不到。多数发布后差评累积、收藏数掉头的世界,问题不是单人 bug 没修,是这一层根本没测。
这一章按「成本由低到高」的顺序铺一遍 VRChat 世界开发的三层测试环境,把它们各自能验出什么、不能验出什么写清楚。每发一次新版本,按这个顺序走一遍。
ClientSim 单人/伪多人,秒级反馈,遗漏多Build & Test 本地多客户端,分钟级反馈,最接近真实Friends 私密上传 真实 VRChat 网络,邀请朋友测,最贵三层不是替代关系,是补足关系。每层只能验证一部分事。
第一节:ClientSim 是 VRChat 世界的快速预演
Section titled “第一节:ClientSim 是 VRChat 世界的快速预演”ClientSim 是 VRChat 官方的客户端模拟器,作为 Worlds SDK 的一部分附带。在 Unity 编辑器里按下 Play 按钮就启动,几秒钟内就能行走、按按钮、捡东西,不用编译、不用上传。
按官方文档(ClientSim)和社区指南(VRCreators ClientSim Testing)的总结,它能模拟的:
- 行走、跳跃、视角控制:在 Game 视图里 WASD 移动、鼠标转视角,跟桌面 VRChat 客户端一致。
Interact事件:靠近可交互物体,发起 Interact 触发。VRC Pickup:靠近能抓的物体,右键握住、再右键松手。VRC Station(座椅):进站、出站。- World Space UI:Canvas 上的按钮、Toggle、Slider 都能点。
- 简单的 Udon 变量变化:能在 Inspector 里实时看到
[UdonSynced]字段当前值。 - PlayerData / PlayerObject:可以做初步观察和逻辑检查,但真实保存、回访恢复、不同玩家隔离和多人生命周期仍要在 VRChat 客户端里验证。
- 本地玩家事件的初步检查:ClientSim 可用于检查部分玩家状态和本地事件,但不能把它当成真实多人网络环境。
它不能替代真实环境验的:
- 真实的网络同步:ClientSim 模拟 Master / Guest 切换是简化版,时序跟真实 VRChat 网络对不上。所有权竞争(两个真实玩家同时按一个按钮)的细节,ClientSim 看不出。
- 真实的 Late Joiner 行为:ClientSim 加入的「Remote Player」是脚本造的,跟一个真人客户端从零开始接入世界、拉同步数据的过程不一样。
- Quest / Android 平台限制:所有内容都跑在 PC 编辑器里,Shader 白名单(允许在 Quest / Android 上使用的 Shader 清单)、纹理 1K 上限、面数预算这些 Android 限制全部不生效。
- VR 舒适度:晕动、走廊宽度、视高,ClientSim 是桌面视角,体感为零。
- 真实多人混乱:十个人在一个房间各按各的、各抓各的、各开各的镜子,性能怎么样、网络稳不稳,没法在编辑器里复现。
ClientSim 安装方式:第 4 章 装的 Worlds SDK 已经把它带进项目,不用单独装。Unity 里按 Play,下方会冒出 ClientSim 的设置浮窗(玩家身高、Add Remote Player、PlayerData 视图等)。
第二节:Build & Test 是真正的本地客户端
Section titled “第二节:Build & Test 是真正的本地客户端”ClientSim 之后下一层是 Build & Test。这是 VRChat SDK 提供的一键流程:把当前世界编译成一份临时构建包,在本地启动一个或多个真实的 VRChat 客户端进入这个世界。
打开 VRChat SDK Control Panel(菜单 VRChat SDK → Show Control Panel),切到 Builder 标签。下方有一栏 Local Testing:
| 字段 | 作用 |
|---|---|
Number of Clients | 启动几个 VRChat 客户端实例(1-N) |
Force Non-VR | 全部以桌面模式启动(不进 VR) |
Build & Test New Build | 编译一份新构建并按上面设置启动 |
Last Build | 不重新编译,重新启动上次构建(小调整后跳编译省时间) |
Number of Clients 设成 2 是常用值,Master + 一个 Guest,能把多数同步问题挑出来。设成 4 时机器需要扛得住四份 VRChat。设成 1 时跟普通桌面客户端没区别。
按 Build & Test New Build,Unity 走一遍 Build 流程(视场景大小,几十秒到几分钟),完成后自动启动若干 VRChat 客户端,每个都进入这个测试世界。
Build & Test 跟编辑器内的 ClientSim 比,区别核心是「跑的是真正的 VRChat 客户端」:
- Shader 走真实 VRChat 渲染管线(从场景数据到屏幕画面的绘制流程),纹理、光照、Skybox 显示效果跟发布后一致。
- 网络同步走本地局域网回环,但用的是真实的 VRChat 客户端和本地测试流程。Master / Guest 行为、同步变量、网络事件和所有权转移,比 ClientSim 更接近真实环境,但仍不能替代私密上传后的公网测试。
- 性能数据是真实数据。FPS、Draw Call、显存占用都准(第 38 章 里 Stats 提到「编辑器有 overhead(额外开销)」,Build & Test 没这层 overhead)。
它不能模拟的:跨平台(Android / Quest 必须切平台单独构建测)、外部 VRChat 网络的延迟和丢包(公网走的不止本地环回)、真实陌生玩家的乱按。
第三节:用 —profile 让两个 VRChat 同时登不同号
Section titled “第三节:用 —profile 让两个 VRChat 同时登不同号”Number of Clients 启动的多个 VRChat 客户端默认全用同一个账号登。这在测「同步」够用,但有几种场景需要不同账号:
- 测玩家展示名(DisplayName)相关逻辑(同账号显示一样的名字)
- 测私密上传后的 Friends-Only 实例(账号 A 上传,账号 B 用好友身份进)
- 测好友区分逻辑(IsFriend 之类的判断)
VRChat 客户端用 --profile=N 参数把每个实例的本地数据隔离开。N 是任意整数,每个值对应一份独立的登录态、设置、缓存。
最简单的做法是在 VRChat 安装目录建几份 bat:
VRChat.exe --profile=1VRChat.exe --profile=2第一次运行各自登录不同账号,之后每次双击对应 bat 就用对应账号启动。两份 VRChat 可以同时跑。
社区还有专门的多窗口启动器(如 VRCMultiLauncher),把 --profile、分辨率、--no-vr、OSC 端口等参数做成可视化配置。如果只是偶尔多账号测,bat 够用;如果经常需要四五个账号同时上线测大场景,启动器更省事。
启动一份再启动一份的工作流:
1. 账号 A 上 PC,开 VR 当 Master,进自己的世界。2. 账号 B 用 vrchat_b.bat 桌面启动,从 VRChat 菜单加入账号 A 的实例。3. 同时开两个 VRChat 客户端,分别测 Master 视角和 Guest 视角。VRChat 客户端支持同一台机器同时跑多份。各账号要分别登录,不要在不同 profile 间共用同一个账号(VRChat 服务端会判定「账号在两个地方登录」,可能踢线)。
第四节:Friends 私密上传是最后一道关
Section titled “第四节:Friends 私密上传是最后一道关”Build & Test 跑通之后,下一步是真的把世界传上去,但只对自己 / 朋友可见。VRChat SDK Control Panel → Builder 里点 Build & Publish,上传完成后世界默认是 Private(私密),只有自己和被邀请的好友能进。
为什么需要这一层:
- 真实公网延迟:Build & Test 在本地回环上跑,往返几乎零延迟。公网平均往返几十到几百毫秒,丢包偶发。同步逻辑里假设「立刻收到」的代码,公网上会暴露成「按按钮三秒后灯才亮」。
- 真实账号分隔:好友、关注、陌生人之间的权限边界,本地客户端走不全。
- 真实平台路径:上传 → CDN(分布在各地的下载节点)→ 玩家下载 → 进世界,这条链路里任何一步出错都只有真上传才发现(构建包过大被截断、特定资源 import settings 在线上炸、缩略图缺失等)。
Friends 私密上传后的测试流程:
- 私密上传成功后,VRChat 客户端里去
Worlds→Mine,找到刚上传的世界。 - 邀请几位朋友(在线或离线邀请都行)。
- 让朋友报「现在你那边看到什么」「按按钮有没有反应」「门是开还是关」。手机上同步开个语音通话,跟自己进世界后的对照效率最高。
- 故意制造测试场景:让朋友先进,自己后进(测 Late Joiner);自己按一下按钮立刻退出,让朋友报有没有看到(测同步是不是发出去了)。
- 让朋友重启 VRChat 客户端再加入,确认重新进的人状态正确。
每发布一次重大改动(新功能、动了同步逻辑、改了出生点),私密版本至少跑一轮再公开发布。多数发布后口碑下滑的世界,都是没经过这一层就 Public 了。
第五节:Quest / Android 必须单独测一遍
Section titled “第五节:Quest / Android 必须单独测一遍”第 39 章 已经讲过 Quest 平台的限制。这里只补「测试流程怎么做」。
PC 平台测好之后,切到 Android:菜单 File → Build Settings → 选 Android → Switch Platform。等待资源重新导入(首次切平台 5-30 分钟,之后切回来用 Library 缓存几秒就行)。
切完 Android 后再走一遍 Build & Test:
- 如果有 Quest 头显,挑一台 Quest 直接进自己的私密世界,看能不能进、纹理有没有掉、帧率能不能上 72。
- 没有 Quest 也可以用桌面端的 Android 客户端(VRChat 在 Android 平板 / 移动端有客户端)替代验。
- 重点看 SDK Validation(SDK 上传前的自动检查)上有没有红色错误。Quest 平台 Validation 比 PC 严格得多:超规格的 Shader 会被替换成 Standard Lite,纹理超过 1K 会强制压。这些行为用 Build & Test 能直接看到。
PC 上最华丽的世界到 Quest 上经常需要砍一半内容(关掉实时光、合并镜子、换 Shader)。这种砍在私密发布前做完,比公开发布之后再修代价小得多。
第六节:发布前的分层测试清单
Section titled “第六节:发布前的分层测试清单”把上面四节合成一份清单。每发一个版本走一遍:
ClientSim 层(5–10 分钟)
- 进入 Play Mode,无 Console 红字
- 主路线走一遍:出生点 → 主交互 → 关键 UI
- 每个按钮、Pickup、Station、传送门各点一次
- 临时禁用一个关键引用,看看是否优雅降级(不挂整个场景)
Build & Test 层(10–30 分钟)
-
Number of Clients = 2,两个 VRChat 客户端同时进 - 用
--profile至少试一次双账号 Master / Guest - 按
R Shift ++3看实时日志,无红字 halted - Stats 浮窗 FPS 90+ / Quest 72+
- 关键同步交互:开关灯、抓 Pickup、坐 Station,两端一致
Friends 私密层(30 分钟+)
-
Build & Publish成功,世界设为 Private - 邀请至少 1 位朋友进,全程开语音通话
- 测 Late Joiner:朋友先进、自己后进
- 测随机崩溃:朋友重启客户端再加入
- 平台抽测:用 Quest 头显或 Android 客户端进一遍
每一项都能勾上,再考虑公开发布。漏掉某一层而出问题的世界,玩家进去十秒就退是常态。
挑一个练手:
- 当前项目里把第 17 章的门加上
Debug.Log,分别用 ClientSim、Build & Test(Number of Clients = 2)、--profile双账号三种方式各按一次门。对比三处看到的日志和行为差异。第二种和第三种里,Master 和 Guest 看到的是不是同一件事? - 故意制造一个 Late Joiner 场景:账号 A 先进世界、按一下开关把灯打开。然后账号 B 用
--profile=2启动后加入。账号 B 看到的灯是开还是关?这是 第 29 章 Late Joiner 同步的实际表现,亲眼看一次比看十遍文字描述都管用。
走完这两个之后,发布前测试这件事就有了一份分层清单可以照走,不再凭感觉「跑一下试试」。