2. VRChat 这家公司和这个引擎
第 1 章只聊了想做什么,没碰技术;后面几章要装工具、写脚本、在 Unity 里搭场景。
这一章夹在中间,提供一张背景图,回答四个问题:VRChat 是谁做的?跑在什么上面?SDK 为什么长成现在这样?这本书覆盖的是哪一块?
后续章节如果出现「SDK 为什么不让我这么写」「为什么 Quest 上跑不了这个 shader」之类的疑问,会通过链接回到本章对应小节。想直接动手的话,跳过这一章不影响后面跟做,等撞上具体疑问再回来翻也来得及。
一家美国公司,一个 Unity 项目
Section titled “一家美国公司,一个 Unity 项目”VRChat Inc. 由 Graham Gaylor 和 Jesse Joudrey 在 2014 年成立,最初的版本是 Oculus Rift DK1 上的小 demo:让两个戴头显的人能在同一个虚拟空间里看到对方、说话、挥手。
那时候 VR 圈子很小,「这套设备能用来做什么」还没人想清楚。VRChat 早期就是这股「先试试看」里冒出来的项目之一。它选的方向回应了一个很基础的需求:人想跟人在虚拟空间里待着,不一定打游戏,不一定完成任务,就是待着。
2017 年 2 月在 Steam 上以免费 Early Access 上线。2018 年初的 Ugandan Knuckles meme 让它第一次出圈,用户量从那之后一直在涨。粗略的时间点:
2017 Feb Steam Early Access 上线2018 Jan Ugandan Knuckles 出圈,DAU 暴涨2019 Quest 一代支持上线2020 SDK3 + Udon 发布,老的 SDK2 进入弃用倒计时2021 Jun D 轮融资 8000 万美元2022 VCC(Creator Companion)发布2022 Jul 强推 EasyAntiCheat 反作弊,Steam 涌入近一万差评2023 Jun Quest 一代停止支持2023 SDK2 的 UnityPackage 下架,新世界上传通道关闭2024 Jun 公司裁员约 30%2025 Oct iOS / Android 端结束 beta,正式上线写本书时(2026 年中),VRChat 公开过的全平台最高同时在线已经到 158,192,日均同时在线约 10 万。Steam 单平台的历史峰值在七八万人量级;按 2026 年中公开实时数据粗略对照,Steam PC 在线人数只占公开总在线的一半上下,剩下来自 Quest、移动端和其他非 Steam 入口。也就是说,Steam 图表只能看趋势,不能代表全部用户。但公司规模一直不大,公开员工数在百人量级,2024 年 6 月还经历过约三成的裁员。比起做大型 MMO 的工作室小得多,这一点下面要反复用到。
VRChat 是 Unity 之上的一层「世界格式」
Section titled “VRChat 是 Unity 之上的一层「世界格式」”技术上看,VRChat 客户端是用 Unity 做的。它内嵌一个 Unity Runtime,能在玩家电脑上加载用 Unity 打包出来的资源。
也就是说,渲染管线(GPU 把场景画成一帧画面的流水线)、物理引擎(决定物体怎么下落、碰撞、反弹的那套规则)、动画系统都直接来自 Unity,VRChat 不重做这些。VRChat 在 Unity 之上加了三件事:
- 网络层:让多个客户端能维护同一个实例的状态。
- 沙箱(给陌生代码套的「笼子」):阻止上传的世界访问玩家电脑的磁盘、网络、命令行。否则随便一个发光球都能变成木马。
- 平台抽象:让同一份世界能跑在 PC、Quest、iOS 上,给每个平台单独打包和限流。
剩下的事,按下按钮灯亮、地板有反射、镜子里照得到自己,全是 Unity 在做。SDK 的工作是让 Unity 知道「这个项目是给 VRChat 做的」:让场景里的 VRC Scene Descriptor 能被识别,让脚本能被编译进沙箱。
Worlds 和 Avatars 是两件不同的事
Section titled “Worlds 和 Avatars 是两件不同的事”VRChat 里玩家看到的内容大致分两类:
- Worlds(世界):能站进去的空间。一栋房子、一个迪厅、一个驾驶舱。
- Avatars(化身):套在身上的形象。Q 版小动物或写实角色都算。
两者都是用户自己做的,也都是从 Unity 项目打包出来的二进制。但它们对应两套不同的 SDK,走两条不同的上传通道:
Unity 项目 打包成 上传到───────────────────────────── ────── ─────────────World 项目(含 Worlds SDK) .vrcw → CDN 的「世界」槽位Avatar 项目(含 Avatars SDK) .vrca → CDN 的「头像」槽位工具链层面共享一些东西(VCC、Unity 版本、底层网络协议、登录账号),但项目层面是完全分离的。一个 Unity 项目里不能同时放 World 和 Avatar,VCC 建项目时是二选一。
这本书只讲 Worlds。Avatars 是另一个体系,逻辑、约束、社区文化都不一样。后面正文里出现「SDK」二字默认指 Worlds SDK,涉及 Avatars 的地方会明确写出来。
SDK 三件套和它的两代前身
Section titled “SDK 三件套和它的两代前身”打开 VCC 建好的 World 项目,看 Packages/ 文件夹,里面有三个 VRChat 的包:
com.vrchat.base 基础工具和共用代码com.vrchat.worlds 世界专用:Scene Descriptor、Pickup、Station、Udon...com.vrchat.clientsim 本地模拟器,不上传也能在 Unity 里测如果是 Avatar 项目,第二个会换成 com.vrchat.avatars。base 和 clientsim 两边共用。写本书时 com.vrchat.worlds 仍在 3.10.x 系列,具体小版本以 VCC 里显示的官方包版本为准。玩家持久化数据等较新的 API 需要 SDK 不低于 3.7.4,后面相关章节会再点出版本要求。
这三件套现在叫 SDK3。它的前面还有过两代:
- SDK1(2017–2019):早期版本,逻辑只能用 Unity 自带的 Animator 状态机硬凑。
- SDK2(2018–2020):引入
VRC_Trigger这个可视化事件触发器。节点可以拖出来就连,但写复杂逻辑时一个按钮会展开成几百个嵌套节点。 - SDK3(2020 至今):引入 Udon 和它的文本版本 UdonSharp。一次彻底重写,老世界要么迁移要么停在 SDK2 时代。
SDK1 和 SDK2 已经停止支持。SDK2 的 UnityPackage 在 2023 年初下架,SDK2 世界的新上传通道也在同年关闭,已上传的老世界保留运行权但不能再更新,新世界只有 SDK3 一条路。但现在搜资料还能搜到大量 2020 年之前的中文教程和 YouTube 视频,它们大概率是 SDK2 的,看着熟悉但每一步都跑不通。如果 Unity 版本和教程里的 SDK 对不上,或者照着 SDK2 教程做 SDK3 项目,步骤会大面积跑不通。
写的是 C#,跑的是 Udon
Section titled “写的是 C#,跑的是 Udon”到 Worlds SDK 这一层,写出来的 C# 走的是一条专属编译链。
表面上跟普通 Unity 项目一样:在 Unity 里建 .cs 文件,能 using UnityEngine,能定义 class,能写 Update()。底层不一样的地方在编译产物:先用 UdonSharp 编译器把 C# 翻译成一种叫 Udon Assembly 的字节码(一种比源码更紧凑、更接近机器的中间格式),最后跑在客户端里的是 VRChat 自己写的虚拟机(一段专门解释执行这种字节码的程序),取代了普通 Unity 项目里的 .NET 运行时(.NET 是 Microsoft 为 C# 等语言提供的标准执行环境:加载程序集、调度代码;普通 Unity 编辑器里 Play 模式跑的就是这套)。
绕这一圈是为了安全。VRChat 客户端要执行陌生人写的代码:点开一个 Public 世界,里面的脚本是某个不认识的人写的。如果这段脚本能调 System.IO.File.Delete、能调 System.Net.WebClient、能调 Process.Start,玩家电脑就会被任意操作。
VRChat 的解法是只允许调用一个白名单上的 API。这个白名单写死在 Udon 里,叫 Class Exposure Tree。UnityEngine.Transform.position 在白名单上能用;System.IO.File.Delete 不在,调用会被编译器直接拦下。想看完整白名单,可以在 Unity 编辑器里打开 Udon Graph,节点搜索框里翻一遍;或者查官方的 Udon Node Reference 页面,写脚本撞墙时第一个该问的就是它。
这件事会带来三个具体后果:
- 写脚本会不时撞上「这个 API 在 UdonSharp 里不能用」。常见 Unity API 大部分能用,但 LINQ、反射、
async/await、自定义泛型类、yield return、event等都不能用或行为不同。第 12 章会专门铺一节。 - 执行效率比纯 C# 慢一到两个数量级。脚本要写得保守,不要每帧
Update()里跑大循环。 - 沙箱保护的是客户端不被陌生世界脚本攻击;它不保护世界本身的运行性能。写得很糙的脚本仍然能把帧率拖到个位数。
沙箱管的是上传内容这一侧的代码。客户端进程那一侧 VRChat 用的是另一套机制:2022 年 7 月起强推 EasyAntiCheat 反作弊,禁用所有运行时客户端 mod,几天里 Steam 上涌入近一万差评,是平台史上最大的公关事件,最终妥协是保留 EAC 但开放部分挂件接口。这件事跟做世界没直接关系,但看到老教程提到「装个客户端 mod 就能 X」,可以默认那条路 2022 年之后已经走不通。
UdonSharp 之外还有 Udon Graph,可视化连线版本,长得像 Unreal 的 Blueprint。两者编译产物相同,但 Graph 写复杂逻辑时节点会乱成一团,可读性迅速下降。这本书全程用 UdonSharp。
Unity 版本钉死,跨平台一份场景多份打包
Section titled “Unity 版本钉死,跨平台一份场景多份打包”理解章 A 会展开 Unity 版本钉死和同一场景多平台分别打包的管线细节。这里只补一句:按 2026 年中公开数据粗略对照,Steam PC 只占玩家体量的一半上下,Quest 与移动端合在一起不是可忽略的小众平台。
围绕在外面的生态
Section titled “围绕在外面的生态”VRChat 官方做引擎、做客户端、做 SDK,不做内容,也不做大部分创作辅助工具。所有内容、几乎所有创作工具都来自社区,而这个社区有相当大一块重心在日本:日本用户占比常年居前,MMD 文化、Avatar 经济、线上活动场次密度整套生态以日本社区为引擎,这也解释了为什么下面 Booth 排在第一位。
- Booth:日本的同人销售平台,Avatar、Shader、世界 Prefab 的主交易市场。
- Gumroad:欧美创作者的销售主场,付费 Shader(poiyomi、lilToon Pro)和模型常在这里。
- GitHub:免费工具的主集散地,VRWorld Toolkit、各类自动化脚本在上面。
- Discord:知识、bug、未公开特性的口耳相传现场。VRChat 官方 Discord、UdonSharp Discord、各 Shader 作者的 Discord 都值得加入。
这个生态的好处是做世界不必从零起步:光照、Shader、对话系统、Pickup、传送方案都有现成的开源或付费版本可用。代价是判断成本上升,同一件事可能有五个相互冲突的轮子,如果不做取舍,可能在选轮子上耗掉几个月。第 43 章会教怎么挑。
这本书在哪一块上
Section titled “这本书在哪一块上”把上面这些叠起来,整张图大概是这样:
┌────────────────────────────────────────────┐│ VRChat 平台(公司维度) ││ 客户端、网络层、沙箱、CDN、账号、审核 ││ ── 它做的 ── │└────────────────────────────────────────────┘ │ ▼┌────────────────────────────────────────────┐│ Worlds SDK + Udon ││ 让 Unity 项目能被打成 .vrcw 并被识别 ││ ↑↑ 这本书在这 ↑↑ │└────────────────────────────────────────────┘ │ ▼┌────────────────────────────────────────────┐│ Unity 引擎 ││ 渲染、物理、动画、音频、骨骼、UI │└────────────────────────────────────────────┘ │ ▼┌────────────────────────────────────────────┐│ 社区生态 ││ Booth / Gumroad / GitHub / Discord 上的 ││ Shader、Prefab、工具、模型、教程 ││ 会用上,但不全是自己做的 │└────────────────────────────────────────────┘这本书覆盖中间那一层:Worlds SDK 加 Udon,再加用 Unity 做 VRChat 世界需要的那部分 Unity 知识。下面那层(Unity 通用进阶)只挑用得上的讲;上面那层(VRChat 公司自己在做什么)今天读完就够用,后面只在第九部聊发布时再深入碰一次。
这一章作为书里其他章节的底图存在。后面正文里凡是出现「SDK 为什么不让我这么写」「为什么 Quest 上不能用这个 shader」之类的话题,会通过链接回到这里相应的小节。