附录 A · 术语表
正文按教学顺序展开,所以同一个术语可能直到下一章才被命名。这一份按主题分类,方便读到一半回来查。
每个词条尽量保持短:1–2 句客观定义 + 首次出现章节回链。深度解释回各自章节看。词条会随正文一起长大,目前覆盖第 1–2 部基础词、第 4 部(10–17 章)的编程基础与交互词、第 6 部(26–30 章)的多人同步词,以及第 7–9 部新增门槛词。
未覆盖的术语,等正文新章节写到时再回头补这里。
VRChat
社交 VR 平台,用户上传虚拟世界和化身后供他人加入。客户端跑在 PC(Windows)、Meta Quest,以及移动端 iOS / Android。
首次出现:第 2 章 · VRChat 这家公司和这个引擎。
VRChat Inc.
平台开发公司,2014 年由 Graham Gaylor 和 Jesse Joudrey 创立,2017 年 Steam Early Access 上线。
首次出现:第 2 章 · 一家美国公司,一个 Unity 项目。
Worlds(世界)
能站进去的虚拟空间。Unity 项目通过 Worlds SDK 打包成 .vrcw 文件后上传。本书全程讲 Worlds。
首次出现:第 2 章 · Worlds 和 Avatars 是两件不同的事。
Avatars(化身)
玩家套在身上的形象。通过 Avatars SDK 打包成 .vrca。本书不讲 Avatars。
首次出现:第 2 章。
Worlds SDK / Avatars SDK
两套独立 SDK,对应两类项目。一个 Unity 项目里二选一。
首次出现:第 2 章 · SDK 三件套和它的两代前身。
com.vrchat.base / com.vrchat.worlds / com.vrchat.clientsim
Worlds 项目里 Packages/ 下面的三个 VRChat 包。base 是共用工具,worlds 是 Scene Descriptor / Pickup / Station / Udon 等,clientsim 是本地模拟器。
首次出现:第 2 章。
SDK1 / SDK2 / SDK3
SDK 的三代。SDK1(2017–2019)依赖 Animator 状态机;SDK2(2018–2020)用 VRC_Trigger 可视化触发器;SDK3(2020 至今)引入 Udon。新世界只能用 SDK3,老教程出现 VRC_Trigger 字样基本是 SDK2 的。
首次出现:第 2 章。
Booth / Gumroad
两大第三方资产销售平台。Booth 是日本同人圈主场,Gumroad 是欧美创作者主场。
首次出现:第 2 章 · 围绕在外面的生态。适用 SDK3.x。
Udon 与脚本运行时
Section titled “Udon 与脚本运行时”Udon
VRChat 自研的虚拟机和字节码格式。客户端只执行 Udon 字节码,不直接执行用户写的 C#。
首次出现:第 2 章 · 写的是 C#,跑的是 Udon。
UdonSharp
把 C# 翻译成 Udon Assembly 的编译器,是写 VRChat 世界逻辑的主流方式。本书全程用它。
首次出现:第 2 章。
Udon Graph
Udon 的可视化连线编辑器,编译产物和 UdonSharp 相同。本书不用。
首次出现:第 2 章。
Udon Assembly
Udon 字节码格式。脚本最终被编译成它,由 VRChat 的虚拟机执行。
首次出现:第 2 章。
字节码(Bytecode)
比源代码更紧凑、更接近机器的中间格式。源码先编译成字节码,运行时再由虚拟机解释执行;好处是跨平台、装载快、适合做沙箱。Udon Assembly 就是 VRChat 自定义的一种字节码。
首次出现:第 2 章 · 写的是 C#,跑的是 Udon。
虚拟机(VM, Virtual Machine)
一段专门解释执行某种字节码的程序。VRChat 客户端里的 Udon 虚拟机负责跑 Udon Assembly,对应普通 Unity 项目里的 .NET 运行时。
首次出现:第 2 章。
沙箱(Sandbox)
给陌生代码套的「笼子」:限制它能调用的 API、能访问的文件、能联通的网络。VRChat 的沙箱由 Udon 虚拟机和 Class Exposure Tree 共同实现,目的是阻止上传内容里的脚本伤害玩家电脑。
首次出现:第 2 章 · VRChat 是 Unity 之上的一层「世界格式」。
Class Exposure Tree
Udon 允许调用的 .NET / Unity API 白名单。不在白名单上的 API(System.IO.File.Delete、System.Net.HttpClient、反射、LINQ 等)调用会被编译器拦下。async / await、自定义泛型类这类属于 UdonSharp 编译器限制,查附录 D。
首次出现:第 2 章。详细限制见附录 D · UdonSharp 限制。
UdonSharpBehaviour
VRChat 脚本必须继承的基类,对应普通 Unity 的 MonoBehaviour。把外部代码贴进 Unity 后,前两行如果出现 : MonoBehaviour 而不是 : UdonSharpBehaviour,要立刻替换。
首次出现:第 11 章 · C# 刚好够用。
MonoBehaviour
Unity 通用脚本基类。VRChat 世界脚本不用它,用 UdonSharpBehaviour。出现在搜到的 Unity 教程里很正常,但贴进 VRChat 项目要换。
首次出现:第 11 章 · C# 刚好够用。
编程基础与 C# 语法(第 10–11 章)
Section titled “编程基础与 C# 语法(第 10–11 章)”变量(Variable)
程序里给一块数据起的名字。int score = 0; 等于「开一个叫 score 的盒子,里面先放 0」。
首次出现:第 10 章 · 三种最基本的指令。
条件判断 if / else
按当前情况选一条路。Udon 脚本里大部分判断(if (player.isLocal)、if (gameStarted))都靠它。
首次出现:第 10 章、第 11 章 · 控制流:if / else / for / while。
循环 for / while / foreach
把一段事重复做。for 适合「重复固定次数」,while 适合「直到某条件不成立才停」。UdonSharp 官方文档列出支持 foreach,但本书前期仍优先写 for,因为索引和值的变化更清楚。
首次出现:第 10 章、第 11 章。
函数 / 方法(Function / Method)
把一段步骤打包起来起个名字,将来一句话调用。脚本里的 Start()、Interact() 都是方法。
首次出现:第 10 章 · 把一段流程打包:函数、第 11 章 · 方法。
类(Class)
把相关的字段和方法装在一起的容器。一个 .cs 文件通常就是一个类,VRChat 世界脚本里这个类继承自 UdonSharpBehaviour。
首次出现:第 10 章 · 把相关的东西归在一起:类、第 11 章 · 类。
字段(Field)
类里直接写出来的变量,整个类的方法都能访问它。设了 public 或加 [SerializeField] 后,Inspector 也能看到和拖引用。
首次出现:第 11 章 · 字段、属性和局部变量。
局部变量(Local Variable)
方法内部 { ... } 里临时声明的变量,方法跑完就消失。生命周期短、不出现在 Inspector。
首次出现:第 11 章。
int / float / bool / string
C# 基础类型。int 整数,float 带小数点的浮点数(写值要加 f,例如 1.5f),bool 真假,string 文字。
首次出现:第 11 章 · 变量和类型。
Vector3
表示 3D 空间里一个位置或方向的结构体,含 x / y / z 三个 float。transform.position、Networking.LocalPlayer.GetPosition() 都是 Vector3。
首次出现:第 11 章。
null
”什么都不指向”的特殊值。Inspector 引用槽空着、GameObject.Find 没找到时都会得到 null,再去 .something 就会抛 NullReferenceException。
首次出现:第 11 章 · 引用其他物体。
public / private / [SerializeField]
访问修饰符。public 字段对其他类和 Inspector 都可见;private 只在本类内部可见;[SerializeField] private xxx 是 VRChat 项目里推荐的中庸写法——Inspector 能拖,但代码外部碰不到。
首次出现:第 11 章 · 字段、属性和局部变量。
using 指令
脚本顶部的 using UnityEngine;、using VRC.SDKBase; 等行,告诉编译器「下面的代码可以省略这些命名空间前缀」。AI 给的代码缺命名空间引用时第一处要补的就是这里。
首次出现:第 11 章 · 一段最小脚本长什么样。
Start() / Update()
Unity 生命周期方法。Start 在物体启用后第一帧调一次,常用来初始化引用;Update 每帧调一次,开销最敏感的方法之一。
首次出现:第 11 章。
大驼峰 / 小驼峰(PascalCase / camelCase)
C# 命名约定:类名、方法名、public 字段用大驼峰(GameManager、Interact、PlayerCount);局部变量、private 字段用小驼峰(playerCount、localScore)。
首次出现:第 11 章 · 三件 C# 的语法基本功。
Time.deltaTime
上一帧到这一帧之间过了多少秒。脚本里要做”每秒移动 N 米”这类与时间挂钩的运算就乘以它,否则会被高帧率显卡跑得过快。
首次出现:第 11 章。
Mathf
Unity 的数学工具静态类,提供 Mathf.Clamp、Mathf.Lerp、Mathf.Sin 等常用函数。在 Udon 白名单内,可以直接用。
首次出现:第 11 章。
GameObject.Find
按名字在场景里搜物体的方法。性能差且容易因改名失效,VRChat 项目里通常改用 [SerializeField] 在 Inspector 拖引用。
首次出现:第 11 章 · 引用其他物体。
[Tooltip]
字段上方加的 attribute,会让 Inspector 鼠标悬浮时显示一行说明文字。给协作者或几个月后的自己留提示用。
首次出现:第 11 章 · 字段、属性和局部变量。
UdonSharp 限制与替代写法(第 12 章)
Section titled “UdonSharp 限制与替代写法(第 12 章)”SendCustomEventDelayedSeconds
UdonSharpBehaviour 自带的延时事件方法。传入方法名和延迟秒数后,Udon 虚拟机在那么多秒后调用那个方法。async / await 和协程在 UdonSharp 不可用,“过 N 秒之后做某事”统一写它。
首次出现:第 12 章 · 第二类:UdonSharp 编译器还没支持的 C# 特性。
Coroutine / yield return
普通 Unity 项目里写「等一段时间再继续做」的协程机制,依赖 IEnumerator 和 yield return new WaitForSeconds(...)。UdonSharp 不支持 yield,看到这种写法要翻译成 SendCustomEventDelayedSeconds。
首次出现:第 12 章。
DataList / DataDictionary(VRC.SDK3.Data)
VRChat SDK 提供的动态列表和键值字典,能装混合类型数据,是 UdonSharp 里 List<T> / Dictionary<TKey, TValue> 的替代品。当前 UdonSharp 集合只支持数组 T[],需要动态长度时用它。
首次出现:第 12 章 · 普通 C# 的数据类思路在这里走不通。
DataToken
DataList / DataDictionary 里每个元素的盒子。取值时用 .Int、.String、.Boolean 等属性把原始类型解出来。
首次出现:第 12 章。
Plugins/ 目录
Unity 的特殊目录之一。放在 Assets/Plugins/ 下的 C# 文件走另一条编译路径,UdonSharp 不会要求它继承 UdonSharpBehaviour。纯静态常量类、纯工具方法类要放这里,否则编译器报「Script without UdonSharpBehaviour definition should not have an associated UdonSharpProgramAsset」。
首次出现:第 12 章 · 纯静态类必须放在 Plugins/ 文件夹。
UdonSharpProgramAsset
UdonSharp 编译器为每个非 Plugins 区域的 UdonSharpBehaviour 自动配套的程序资产。它把脚本和 Udon 字节码绑在一起,运行时由 Udon Behaviour 引用。纯静态类不需要它,所以不能放在非 Plugins 目录。
首次出现:第 12 章。
Player Persistence API
VRChat SDK 3.7.4 起提供的玩家数据持久化通道,让世界保存少量玩家相关字段并跨实例读取。沙箱不让脚本读写本地文件,需要持久化时走它。
首次出现:第 12 章 · 第一类:白名单里没有的 API。
VRCUrl / VRCStringDownloader
VRChat 提供的受限 URL 类型与字符串下载工具。世界要从外部地址读文本只能走这套通道,普通 System.Net.* 调不到。官方 String Loading 文档列出一组可信域名;不在列表里的地址,需要玩家在设置中允许不受信任 URL 才会下载。
首次出现:第 12 章。
工具链与项目
Section titled “工具链与项目”VCC(VRChat Creator Companion)
官方项目管家。建项目、装 SDK 包、提醒 SDK 与 Unity 版本更新。VRChat 世界开发的事实入口。
首次出现:第 4 章 · 装好工具,准备出发。
Unity Hub
Unity 自家的版本管理器,管理本机已安装的多个 Unity 编辑器版本。配合 VCC 使用。
首次出现:第 4 章 · 即将装的几样东西。
Unity Editor
真正搭世界的工作台。VRChat 钉死了它的版本号。
首次出现:第 4 章。
Unity 钉死版本(写本书时是 2022.3.22f1)
VRChat 客户端和创作者必须用同一个 Unity 版本,连末尾的 f1 都不能差。版本不对的项目打不出有效 .vrcw。
首次出现:第 4 章 · 第二步:装官方指定版本的 Unity。理由见 理解章 A · 那 Unity 编辑器版本为什么要钉死。
LTS(Long Term Support,长期维护版本)
Unity 的版本类型之一。LTS 版只修 bug、不加新特性,维护周期约两年,是工程项目的稳定选择。VRChat 长期把创作者钉在某个 Unity LTS 版本上(写本书时是 Unity 2022 LTS)。
首次出现:第 2 章 · Unity 版本钉死,跨平台一份场景多份打包。
ClientSim
VRChat SDK 自带的本地模拟器(com.vrchat.clientsim),不上传也能在 Unity 里测玩家行为。
首次出现:第 2 章。详细用法见第 41 章 · 测试你的世界。
Library/PackageCache
Unity 项目下的本地缓存目录,Unity 编译时会高频读写。不要进 git,不要被网盘同步。
首次出现:第 4 章 · 踩坑预警 · 项目路径。
MAX_PATH 限制
Win32 API 传统路径长度上限 260 字符。Unity 项目里的深层资源很容易撑到 200 字符以上,再叠”中文项目名 + OneDrive 同步目录”就溢出。表现是「文件存在但读不到」「.meta 找不到对应资源」。
首次出现:第 4 章。
构建与发布管线
Section titled “构建与发布管线”YAML
一种纯文本的结构化格式,主打人类可读,用缩进表示层级。Unity 的 .unity 场景文件、.prefab 文件、.meta 文件都是 YAML 写的,因此可以用文本编辑器打开看,也能在 git 里做有意义的 diff。
首次出现:理解章 A · Unity 场景,本质是一份引用清单。
BuildPipeline
Unity 的构建系统。VRChat SDK 调用它把场景及依赖打成 AssetBundle。
首次出现:理解章 A · 打包:Unity AssetBundle。
AssetBundle
Unity 自有的二进制资源打包格式。VRChat 世界文件 .vrcw 内层就是它,外层套 VRChat 元信息。
首次出现:理解章 A。
IL2CPP
Unity 的中间语言转 C++ 编译流程。Unity 大版本之间会改它,是钉死 Unity 版本的原因之一。
首次出现:理解章 A · 那 Unity 编辑器版本为什么要钉死。
图形 API(Graphics API)
GPU 听得懂的指令规范,由操作系统/硬件厂商定义,让上层引擎用同一套语义控制不同显卡。常见的有 Direct3D(D3D11 / D3D12,Windows)、Vulkan(跨平台)、OpenGL ES(移动端,Quest 用)、Metal(macOS / iOS)。Shader 在打包时会被编译成这些 API 各自的字节码。
首次出现:理解章 A · 打包:Unity AssetBundle。
.vrcw
World 包文件后缀。AssetBundle + VRChat 元信息(世界名、容量、PC/Quest 标记)。下载到玩家本地后被 Unity Runtime 解包加载。
首次出现:理解章 A。
.vrca
Avatar 包文件后缀。本书不深入。
首次出现:第 2 章。
Build & Test
SDK 控制面板按钮:本地打包 + 唤起本机 VRChat 客户端读取本地文件,整条路不出本机。日常迭代主流程。
首次出现:第 5 章 · 第五步:Build & Test。
Build & Publish
SDK 控制面板按钮:打包后通过 token 把 .vrcw PUT 到 VRChat CDN,并把元信息写进数据库,得到 wrld_xxx ID。
首次出现:理解章 A · 正式上传:到 VRChat 云。
Token
一段临时的登录凭证。SDK 在登录账号时拿到 token,之后调用 VRChat 后端接口(上传 .vrcw、写元信息)都凭这段 token 证明「这是这个账号在操作」。token 有有效期,过期后需要重新登录。
首次出现:理解章 A · 正式上传:到 VRChat 云。
Build Target
Unity 当前编译的目标平台(Windows / Android / iOS 等)。同一个世界要给不同平台分别切换 Build Target 各打一次包。
首次出现:理解章 A · 跨平台:PC、Android(含 Quest)、iOS 各一份。
世界 ID(wrld_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
VRChat 后端给每个发布过的世界分配的全局唯一 ID。Build & Publish 后第一次产生。
首次出现:理解章 A · 正式上传:到 VRChat 云。
对象存储
可以理解成云端文件仓库,负责存放 .vrcw 这种世界包文件。VRChat 使用的具体云服务商 / CDN 没有公开声明,社区抓包观察到 files.vrchat.cloud 域名走第三方 CDN 分发。
首次出现:第 2 章 · VRChat 是 Unity 之上的一层「世界格式」。
CDN(Content Delivery Network,内容分发网络)
可以理解成分布在各地的下载仓库。玩家加入世界时,不是从作者电脑下载,而是从 CDN 拉取 .vrcw;世界越大,第一次加载越慢。
首次出现:理解章 A · 正式上传:到 VRChat 云。
Cloudflare R2
Cloudflare 的对象存储服务。社区里有时看到这个名字出现在 VRChat 相关讨论中,用作 CDN / 对象存储的一类典型选项理解;VRChat 没有公开声明具体后端。
首次出现:理解章 A。
Instance(实例)
一群人此刻一起跑某个世界的一次具体聚会。同一世界可以同时存在很多个实例,互相隔离。
首次出现:理解章 A · 实例(Instance)才是真正在跑的东西。
Master(实例主)
进入实例的第一个玩家。某些权威性的网络操作默认归他。Master 离开时会迁移给下一位。
首次出现:理解章 A。
Late Joiner
在实例已经跑了一段之后才加入的玩家。同步状态需要专门处理才能让他看到「之前发生过什么」。
首次出现:理解章 A · 一张可以反复回看的全景图。详细见第 29 章 · 后来的人怎么办。
VRC Scene Descriptor
告诉 SDK「这个 Unity 场景是 VRChat 世界」的描述组件,登记出生点、参考摄像机等。世界必装。
首次出现:第 5 章 · 第四步:给场景一张身份证。组件字段见附录 C。
Spawn(出生点)
玩家进世界时落点和朝向的标记。VRC Scene Descriptor 的 Spawns 数组里登记一个或多个空物体,按策略选其中之一。
首次出现:第 5 章 · 第三步:标记出生位置。
Unity 编辑器与场景
Section titled “Unity 编辑器与场景”Scene(场景)
后缀 .unity 的文件,存这个空间里的所有物体、灯光、引用关系。
首次出现:第 5 章 · 第一步:新建并保存场景、第 6 章。
GameObject(游戏物体)
Unity 中所有场景物体的容器。本身没有任何能力,能力来自挂在它身上的 Component。
首次出现:第 6 章 · GameObject 只是一个空壳。
Empty GameObject(空物体)
不挂渲染组件,画面里看不见。常用作组的父级容器、旋转轴心、纯逻辑挂载点。Spawn 就是空物体。
首次出现:第 6 章 · 空物体:看不见但很有用。
Hierarchy(层级面板)
当前场景里所有 GameObject 的目录清单。父子关系在这里调整。
首次出现:第 6 章 · 三块面板的分工。
Inspector(检视面板)
选中某物体后展示它身上所有组件和参数的面板。
首次出现:第 6 章。
Project 面板
项目的所有文件夹与资源。材质、模型、脚本、声音、Prefab 都在这里。
首次出现:第 4 章 · 第一次面对 Unity。
Scene 视图 / Game 视图
Scene 视图是搭世界的画布,Game 视图是模拟玩家视角。
首次出现:第 4 章。
Console(面板)
显示报错、警告、Log。多数初学问题先看这里。
首次出现:第 4 章。
Transform
每个 GameObject 自带、删不掉的组件。管 Position、Rotation、Scale 三件事。
首次出现:第 6 章 · Transform:每个物体的标配。
Position / Rotation / Scale
Transform 的三个字段:在哪、朝哪、多大。
首次出现:第 5 章、第 6 章。
父子层级
在 Hierarchy 里把一个 GameObject 拖到另一个下面,子物体的 Transform 变为相对父物体。父物体一移动,子物体跟着走。
首次出现:第 6 章 · 父子层级:让一组物体一起动。
Component(组件)
挂在 GameObject 上的能力单元。每个组件只管一件事,按需组合。
首次出现:第 6 章 · GameObject 只是一个空壳、第 7 章。
Add Component
Inspector 底部按钮,给当前物体加新组件。
首次出现:第 7 章 · Add Component:按需加能力。
Play Mode
Unity 顶部三角形按钮启动的运行时预览模式。在里面调的所有参数,退出后全部还原。
首次出现:第 7 章 · Play Mode 调参的陷阱。
Playmode tint
Edit → Preferences → Colors 里的设置,给 Play Mode 下的编辑器界面染色,避免误以为还在编辑模式而白调一通参数。
首次出现:第 7 章 · 踩坑预警 · 把 Play Mode 染上颜色。
引用槽(None (Object))
组件参数中可以把其他物体或资产拖进来的字段。如果组件「莫名其妙不工作」,先查引用槽是不是 None。
首次出现:第 7 章 · 引用槽:最容易卡的一关。
图形与物理基础
Section titled “图形与物理基础”GPU(Graphics Processing Unit,图形处理器)
显卡里负责画面渲染的芯片,擅长大量并行的浮点运算。Unity 把场景里的 mesh、material、shader 喂给 GPU,由它每帧画出一帧画面。Quest 的 GPU 大约只有 PC 中端的十分之一,是跨平台预算差异的主要原因。
首次出现:第 2 章 · VRChat 是 Unity 之上的一层「世界格式」。
显存(VRAM, Video RAM)
GPU 自己使用的高速内存,专门给画面渲染用。.vrcw 加载时,mesh、material、shader、texture 会从硬盘读出后装进显存。显存吃满时会卡顿、闪退;Quest 显存比 PC 紧张得多,所以贴图必须压。
首次出现:理解章 A · 别人加入:从 CDN 拉,再装进 Unity Runtime。
渲染管线(Rendering Pipeline)
GPU 把场景画成一帧画面的流水线,依次做几何变换、光栅化、片元着色等步骤。Unity 提供多套渲染管线(Built-in / URP / HDRP),VRChat 当前主用 Built-in。Shader 必须按管线编写,跨管线一般需要重写。
首次出现:第 2 章 · VRChat 是 Unity 之上的一层「世界格式」。
物理引擎(Physics Engine)
模拟物体下落、碰撞、反弹、摩擦等物理行为的子系统。Unity 用的是 PhysX。VRChat 不重做这一层,但 Udon 调用物理 API 受 Class Exposure Tree 限制;Pickup、Rigidbody 这些组件最终都依赖物理引擎运行。
首次出现:第 2 章 · VRChat 是 Unity 之上的一层「世界格式」。
Mesh(网格)
模型的几何数据,由顶点和三角形组成。形状由它定义。
首次出现:第 9 章 · 材质:物体的外衣。
Mesh Filter
存 Mesh 数据的组件,给 Mesh Renderer 提供形状。
首次出现:第 6 章 · GameObject 只是一个空壳。
Mesh Renderer
负责把 Mesh 画出来的组件。关掉它,物体隐形,但 Collider 还在。
首次出现:第 6 章 · 一个小实验:让地板消失。
Cube / Plane
Unity 内置基础形状。Cube 是封闭六面体,Plane 是单面薄片。地板首选 Cube 拍扁,原因是 Plane 单面渲染会从底面消失,且 Mesh Collider 没厚度容易被擦边漏检。
首次出现:第 5 章 · 第二步:解决踩地(创建地板)。
Box Collider / Sphere Collider / Mesh Collider
三种常用碰撞体。Box 是盒子(默认 Cube 自带),Sphere 是球,Mesh 按网格逐三角形碰撞(默认 Plane 自带)。能用 Box 不用 Mesh,便宜得多。
首次出现:第 5 章、第 6 章。
Backface Culling(背面剔除)
渲染优化:默认情况下从背面看一个三角形会直接消失。Plane 单面 + 背面剔除导致从底面看不见。
首次出现:第 5 章。
Rigidbody(刚体)
让物体获得重力、能被物理引擎模拟。VRChat 中谨慎用,物理交互成本高。
首次出现:第 7 章 · Add Component:按需加能力。
VRChat SDK 组件(首批)
Section titled “VRChat SDK 组件(首批)”VRC Scene Descriptor :见上方”构建与发布管线”。
VRC Pickup
让玩家能把物体拿起来。默认本地行为;要让别人也看见拿起,需要配 VRC Object Sync。
首次出现:第 7 章 · VRChat SDK 自带的那批组件。详细见第 15 章 · 让物体可被抓取的三件套。
VRC Object Sync
多人之间同步物体位置 / 旋转 / 速度。Pickup 类物体的同步标配。
首次出现:第 7 章。详细见第 15 章。
VRC Spatial Audio Source
3D 空间音效组件,离远了变小。比 Unity 原生 Audio Source 多一些 VRChat 端的限制(最大距离上限等)。
首次出现:第 7 章。详细见第 33 章 · 声音和氛围。
VRC Mirror Reflection
生成镜子。镜子是 VRChat 性能最重的几样东西之一,做休闲世界时谨慎用。
首次出现:第 7 章。详细见第 16 章 · 第二节:用 VRCMirrorReflection 做一面镜子。
VRC Station
让物体能被坐下(椅子、沙发、驾驶座)。会接管玩家移动控制。
首次出现:第 7 章。详细见第 16 章 · 第一节:用 VRCStation 做一把能坐的椅子。
Udon Behaviour
挂自定义 Udon 逻辑(最终来源是 UdonSharp 脚本)的组件。所有交互的入口。
首次出现:第 7 章。详细见第三部(第 12 章 · UdonSharp 长得像 C# 但它有脾气起)和第四部(第 13 章 · 可以按的东西起)。
Unity 内置组件(首批)
Section titled “Unity 内置组件(首批)”Light
通用光源组件。Type 字段决定它是什么光(Directional / Point / Spot / Area)。
首次出现:第 7 章、第 9 章 · Light:空间情绪的开关。
Directional Light(方向光)
模拟太阳/月亮,光线平行,位置无关,只看 Rotation。每个场景默认一盏。
首次出现:第 9 章 · Directional Light:全局日光。
Point Light(点光源)
从一个点向四周发光,超过 Range 不再照亮。常做暖色局部光源。
首次出现:第 8 章、第 9 章 · Point Light:局部暖光。
Spot Light(聚光灯)
朝一个方向打锥形光束,像手电筒或舞台灯。
首次出现:第 9 章 · Light:空间情绪的开关。
Area Light(面光源)
柔和的大面积光,通常需烘焙进 lightmap。本书前期不用。
首次出现:第 9 章。详细见第 36 章 · 光与影。
Audio Source
Unity 原生音频组件。VRChat 世界里通常优先用 VRC Spatial Audio Source 替代。
首次出现:第 7 章。
Animator
状态机驱动的动画组件,用于平滑运动(开关门、电梯、风扇)。
首次出现:第 7 章。详细见第 17 章 · 门、机关和状态。
资产复用:Prefab 一族
Section titled “资产复用:Prefab 一族”Prefab(预制体)
可以理解为一个 GameObject 的”模具”。配好一组组件和参数后存成磁盘上的 .prefab 文件,所有从它压出的 Instance 共享同一份配置。
首次出现:第 8 章 · 制作模具。
Prefab Instance(预制体实例)
场景里从 Prefab 拖出来的具体物体,名字在 Hierarchy 里显示成蓝色。
首次出现:第 8 章。
Override(覆盖)
某个 Prefab Instance 上某个字段相对模具被改过。Inspector 里那个字段旁边有一条蓝色小标记。
首次出现:第 8 章 · Override:允许个别实例不一样。
Apply / Revert
Override 的两种处理:Apply 把 Override 写回 Prefab 模具,Revert 把这个字段拉回模具值。
首次出现:第 8 章。
Prefab Variant(预制体变体)
基于一个已有 Prefab 派生出的”子模具”。母模具改了,所有 Variant 跟着变;Variant 自己改的部分是它独立的。Override 太多时升级成 Variant 比堆 Override 干净。
首次出现:第 8 章 · 踩坑预警 · Override 多了会乱。
Unpack Prefab
把一个 Instance 与模具断开。之后改模具不再影响它。引入第三方 Prefab 想拆开研究时常用,自家项目里慎用。
首次出现:第 8 章 · Unpack:把实例和模具断开。
渲染:材质与 Shader
Section titled “渲染:材质与 Shader”Material(材质)
模型的”外衣”。一份具体配置(颜色、贴图、金属度、光滑度),决定这块表面被画成什么样。
首次出现:第 9 章 · 材质:物体的外衣。
Shader(着色器)
一套渲染规则,告诉 GPU”这种表面怎么被画”。Material 是 Shader 的一份具体参数。
首次出现:第 9 章 · Material、Shader、Texture 三层关系。
Texture(贴图)
图片资源(木纹、砖缝、划痕、发光图案),被 Material 引用,最终铺到模型表面。
首次出现:第 9 章。
Albedo / Base Color / Base Map
材质的底色字段,不同 Shader 名字略有差异,作用接近。
首次出现:第 9 章 · 颜色是物体、光、角度三者的结果。
Metallic
金属感字段。0 是非金属(木头、布料、墙面),1 接近纯金属。
首次出现:第 9 章 · 材质面板先盯四个参数。
Smoothness
光滑度字段。低值像水泥,高值像抛光金属或塑料。
首次出现:第 9 章。
Emission
自发光字段。霓虹、屏幕、发光符号常用。注意:自发光只是看起来亮,不真的照亮周围物体,照亮要靠 Light 组件。
首次出现:第 9 章 · 给发光球做颜色。
PBR(Physically Based Rendering,基于物理的渲染)
一套基于物理参数(金属度、光滑度等)描述表面的渲染范式。Unity Standard Shader 走的就是 PBR。
首次出现:第 9 章。
Standard Shader
Unity 内置的 PBR 标准 Shader。本书前期默认用它。
首次出现:第 9 章 · 踩坑预警 · 材质突然变粉色。详细见第 37 章 · 表面和材质。
「材质突然变粉色」
Shader 丢了 / 不兼容 / 渲染管线对不上的视觉表现。处理:先把 Material 的 Shader 切回稳定可用的标准 Shader。
首次出现:第 9 章。详细排查见附录 F · 报错排查。
渲染:光照(基础)
Section titled “渲染:光照(基础)”Lightmap(烘焙光贴图)
事先把光照算好烤成贴图,运行时不再实时计算。代价是贴图占内存、不能动。
首次出现:第 9 章 · Light:空间情绪的开关。详细见第 36 章 · 光与影。
Light Probe
散布在场景里的探针,存间接光信息,让动态物体(玩家、Pickup)也能受静态烘焙光影响。
首次出现:第 9 章 · VRChat 里要节制实时灯光。详细见第 36 章 · 光与影。
Shadow Map
实时阴影的内部表示。Unity 每帧重算,灯多 + 投影开 = 帧率掉。
首次出现:第 9 章 · 阴影让空间立起来。
平台与发行(首批)
Section titled “平台与发行(首批)”PC / Windows
VRChat 主力平台,SteamVR / Oculus 头显或纯 Desktop 模式都能玩。
首次出现:第 2 章 · Unity 版本钉死,跨平台一份场景多份打包。
Meta Quest
独立 VR 头显,跑 Android。GPU 是 PC 中端的 1/10 量级,内容预算受严格限制。
首次出现:第 2 章。详细见第 39 章 · PC 和 Quest。
iOS / Android(VRChat 移动端)
VRChat 的移动端客户端,2025 年 10 月正式登陆 App Store 和 Google Play。触屏、无 VR,以 2D 平面模式进入世界。
首次出现:第 2 章。
Steam Early Access
VRChat 2017 年 2 月在 Steam 上线时使用的发布模式。
首次出现:第 2 章。
交互事件与玩家 API(第 4 部第 13–14 章)
Section titled “交互事件与玩家 API(第 4 部第 13–14 章)”Interact
玩家把光标对准某个挂着 UdonSharpBehaviour 的 GameObject 后按下交互键时被调用的事件。VRChat 里几乎所有「走到 X 前面按一下」的交互都走它。完全本地:只有按下的人会跑这段代码。
首次出现:第 13 章 · 按一下,灯亮了。
Interaction Text
Udon Behaviour 组件上的字段,决定光标对准这个物体时玩家头顶提示的那行字(默认 Use)。空字符串等于没提示,玩家不知道能按。
首次出现:第 13 章 · 第四步:配 Collider 和提示文字。
Proximity
Udon Behaviour 组件上的字段,决定玩家在多远距离内才能交互(默认 2 米)。超出这个距离提示文字也不显示。
首次出现:第 13 章。
override(C# 关键字)
子类替换基类虚方法时必须写的关键字。Unity 自带生命周期方法(Start / Update 等)不写它;VRChat 专属事件(Interact / OnPlayerJoined 等)必须写。漏写不报错但 VRChat 不认,是典型的「按了没反应」沉默错误。
首次出现:第 13 章 · 第二步:写一段五行脚本。
enabled(组件字段)
Behaviour 类组件(Light、MeshRenderer、AudioSource、UdonSharpBehaviour 等)共有的字段,控制这个组件是不是处于工作状态。light.enabled = false 让灯不发光,但物体本身、其他组件不受影响。
首次出现:第 13 章 · 第二步:写一段五行脚本。
Is Trigger(Collider 字段)
Box / Sphere / Capsule / Mesh Collider 上的勾选项。打勾后这个 Collider 不再挡人,反过来变成检测体:玩家穿过它的瞬间会触发 OnPlayerTriggerEnter / OnPlayerTriggerExit 事件。一句话记:普通 Collider 管「碰得到」,Trigger 管「知道有人来过」。
首次出现:第 14 章 · Trigger 跟普通 Collider 的区别。
OnPlayerTriggerEnter / OnPlayerTriggerExit
玩家进入 / 离开一个 Trigger Collider 时被 VRChat 调用的事件。形参 VRCPlayerApi player 是发生进出的那个玩家。所有客户端都会被通知一次(不只是进出区域的人本人),所以多人世界里通常先用 if (!player.isLocal) return; 过滤。
首次出现:第 14 章 · 第三步:写一段触发脚本。
OnPlayerTriggerStay
玩家停留在 Trigger 内时每帧调用一次。开销显著高于 Enter / Exit,能用进出事件解决就别用它。
首次出现:第 14 章 · OnPlayerTriggerStay 和 OnPlayerCollisionEnter。
OnPlayerCollisionEnter / OnPlayerCollisionExit / OnPlayerCollisionStay
玩家撞上 / 离开 / 持续接触一个普通(非 Trigger)Collider 时的事件。和 Trigger 系列对应,区别在 Collider 是不是 Is Trigger。
首次出现:第 14 章。
OnTriggerEnter / OnTriggerExit
Unity 标准的 Trigger 事件,处理普通物体(不是玩家)穿过 Trigger 的情况,比如「球进了得分框」。和 OnPlayerTrigger* 区别在前缀有没有 Player。
首次出现:第 14 章。
VRCPlayerApi
VRChat SDK 表示一个玩家的对象类型。OnPlayerJoined、OnPlayerTriggerEnter 等事件的形参就是它。常用属性 isLocal、displayName、playerId。命名空间在 VRC.SDKBase。
首次出现:第 14 章 · 第三步:写一段触发脚本。
isLocal
VRCPlayerApi 的属性,判断这个玩家是不是当前客户端的本地玩家。多人事件里用 if (!player.isLocal) return; 把「别人的事件」过滤掉是 VRChat 世界的高频写法。
首次出现:第 14 章 · 为什么要写 if (!player.isLocal) return;。
Networking.LocalPlayer
VRChat 静态 API,返回当前客户端那个 VRCPlayerApi。常用 Networking.LocalPlayer.TeleportTo(...) 把本地玩家瞬移到某个 Transform。
首次出现:第 14 章 · 不只能播音乐:进区域可以做任何事。详细见第 16 章 · 用 TeleportTo 做一个走过去就传送的门。
Spatial Blend(AudioSource 字段)
0 是 2D 音效(左右耳音量恒定,离多远都一样),1 是完全 3D(按距离衰减、按方向决定左右耳)。VRChat 世界里要让音乐「走近才听到」必须拉到 1。
首次出现:第 14 章 · 第二步:放一段背景音乐。
Play On Awake(AudioSource 字段)
勾选后场景一加载就自动播放音频;不勾要由脚本调 Play() 才响。Trigger 区域、按按钮播音乐的场景都得关掉它。
首次出现:第 14 章。
Loop(AudioSource 字段)
勾选后音频播完会从头再播。短的环境音、背景音乐通常都要勾上。
首次出现:第 14 章。
拿取、座椅、镜子、Animator(第 15–17 章)
Section titled “拿取、座椅、镜子、Animator(第 15–17 章)”OnPickup / OnDrop
玩家把 VRC Pickup 物体拿起 / 放下时被 VRChat 调用的事件,写在挂着同一个 UdonSharpBehaviour 的脚本上。完全本地:只有抓的人会跑这段代码。
首次出现:第 15 章 · 第四步:用三个事件让球更有个性。
OnPickupUseDown / OnPickupUseUp
拿着 Pickup 时按下 / 松开 Use(使用键,Settings → Controls)的事件。可以用来做「按住喷射、松手停」这类交互。
首次出现:第 15 章。
Pickupable(VRC Pickup 字段)
是否当前可被拿起。脚本里设 pickup.pickupable = false 可以临时禁止抓取,常用于”游戏中锁定道具”。
首次出现:第 15 章。
Auto Hold / Orientation(VRC Pickup 字段)
Auto Hold 决定是不是抓起后自动黏在手上(默认 Yes);Orientation 决定握持姿态(Any / Grip / Gun)。
首次出现:第 15 章 · 第二步:加 Rigidbody 和 VRC Pickup。
Disallow Theft
VRC Pickup 上的勾选项。打勾后别人不能从你手里抢走这个物体。多人世界里默认推荐勾上,避免误抢。
首次出现:第 15 章。
VRCStation
让玩家能”坐”上的 SDK 组件(Add Component 搜索框里显示为 VRC Station)。坐下后玩家移动控制被它接管,常用于椅子、驾驶座、过山车。简介见上方”VRChat SDK 组件(首批)“。
首次出现:第 16 章 · 第一节:用 VRCStation 做一把能坐的椅子。
Player Mobility(VRCStation 字段)
坐下后玩家的活动范围:Mobile(可移动,比如开船)、ImmobilizeForVehicle(锁住但允许 vehicle station chaining)、Immobilize(完全锁住,普通椅子用它)。
首次出现:第 16 章。
Station Enter Player Location / Station Exit Player Location
两个 Transform 引用槽,分别决定坐下时玩家被吸到哪、起身时被弹到哪。Enter 槽通常拖一个椅面上方的子空物体;Exit 槽拖椅子前方一点。
首次出现:第 16 章。
Seated(VRCStation 字段)
是否走”坐姿”模式。Seated 打勾后 VR 玩家自动以坐姿校准,第一人称高度变化。普通椅子勾上,过山车 / 驾驶座按需。
首次出现:第 16 章。
Disable Station Exit
打勾后玩家不能自己按按钮起身,必须脚本调用 station.ExitStation(player) 才能弹下来。做小游戏锁人时用。
首次出现:第 16 章。
OnStationEntered / OnStationExited
玩家坐上 / 离开 VRCStation 时被调用的事件。形参 VRCPlayerApi player 是发生进出的玩家,所有客户端都会收到这次事件。
首次出现:第 16 章。
VRCMirrorReflection
VRChat 的镜子组件(Add Component 搜索框里显示为 VRC Mirror Reflection)。开销极重(一帧画两次场景),是性能黑洞。建议默认禁用,按按钮才打开;并通过 m_ReflectLayers 把不必要的层从镜面反射里剔除。简介见上方”VRChat SDK 组件(首批)“。
首次出现:第 16 章 · 第二节:用 VRCMirrorReflection 做一面镜子。
m_ReflectLayers(VRCMirrorReflection 字段)
告诉镜子要画哪些 Layer。常见优化是只保留玩家相关层(如 Player / PlayerLocal),剔除家具、UI、特效等不需要在镜子里出现的层。
首次出现:第 16 章。
TeleportTo
VRCPlayerApi 上的方法:把这个玩家瞬移到指定 Vector3 位置和 Quaternion 朝向。完全本地:只有调用方所在客户端的玩家会被移动。
首次出现:第 16 章 · 第三节:用 TeleportTo 做一个走过去就传送的门。
Animator Controller
后缀 .controller 的资产文件。里面是一张状态图:每个节点是一个 Animator State,节点之间是 Transition。动画该播哪段、怎么切换都写在它里面。Animator 组件本身的简介见上方”Unity 内置组件(首批)“。
首次出现:第 17 章 · 第三步:用 Animator Controller 控制状态切换。
Animator State
状态图里的一个节点,对应一段具体动画(一个 AnimationClip)。门”关着”是一个 State,“开着”是另一个。
首次出现:第 17 章。
Animator Parameter
Animator Controller 上声明的参数(Bool / Int / Float / Trigger),脚本通过它驱动状态切换。比如声明一个 IsOpen 的 Bool,从脚本调 animator.SetBool("IsOpen", true) 让门切到”开”状态。
首次出现:第 17 章 · 第四步:写状态字段和按钮脚本。
Animator.SetBool / SetInt / SetFloat / SetTrigger
脚本写参数的四个方法。前三个对应同名类型;SetTrigger 触发一次性事件(被读后自动清回)。键名是字符串,必须和 Animator Controller 里的参数名一字不差。
首次出现:第 17 章。
Has Exit Time(Transition 字段)
两个状态间的过渡是否要等动画播完一个比例后才能切。门、按钮这类瞬时切换通常 关掉它,否则会”按一下要等几秒才动”。
首次出现:第 17 章。
nameof()
C# 内置运算符,返回标识符的字符串名(nameof(IsOpen) 等于 "IsOpen")。给 Animator 参数名、SendCustomNetworkEvent 方法名时推荐用它,改名后编译器能立刻报错而不是默默传错字符串。
首次出现:第 17 章 · 第四步:写状态字段和按钮脚本。
交互与多人同步(第 5–6 部)
Section titled “交互与多人同步(第 5–6 部)”状态机(State Machine)
用「当前处于哪个状态、满足什么条件跳到下一个状态」来描述系统的写法。门的开 / 关、回合的等待 / 游戏中 / 结算都适合用状态机。
首次出现:第 17 章 · 门、机关和状态。
序列化(Serialization)
把脚本字段打包成网络能发送的数据。VRChat 里 Owner 改完 [UdonSynced] 字段后,调 RequestSerialization() 请求打包发送。
首次出现:第 28 章 · 告诉别人发生了什么。
反序列化(Deserialization)
把收到的网络数据解包,还原成本机脚本里的字段值。VRChat 解包完成后会调用 OnDeserialization()。
首次出现:第 28 章。
插值(Interpolation)
让数值在两次同步之间平滑过渡,避免远端物体或颜色突然跳变。UdonSyncMode.Linear 就是线性插值。
首次出现:第 28 章。
快照(Snapshot)
某一时刻所有同步字段当前值打包成的一份初始状态。Late Joiner 加入实例时会收到当前同步字段的快照。
首次出现:第 29 章 · 后来的人怎么办。
多人同步:所有权、网络事件、Manager 模式(第 26–30 章)
Section titled “多人同步:所有权、网络事件、Manager 模式(第 26–30 章)”OnPlayerJoined / OnPlayerLeft
玩家加入 / 离开实例时被调用的事件,形参 VRCPlayerApi player 是当事人。所有客户端都会收到一次,常用来播提示音、刷新玩家名单。
首次出现:第 26 章 · VRChat 网络模型的最小心智模型。
OnPlayerRestored
Player Persistence API 的回调事件:本地玩家的持久化数据从 VRChat 服务端取回完成、可以读取时触发。读 PlayerData 字段、应用到世界状态(比如恢复”上次坐过哪把椅子”)应该在这个事件里做,不要在 OnPlayerJoined 或 Start 里抢跑。
首次出现:第 24 章 · Tool World、详细在第 27 章 Persistence 段落。
Networking(静态类)
VRChat SDK 全局工具类,命名空间 VRC.SDKBase。所有「玩家是不是 Owner」「拿当前玩家」「拿服务器时间」「转移所有权」类操作都从它出发:Networking.LocalPlayer、Networking.IsOwner(...)、Networking.SetOwner(...)、Networking.GetServerTimeInSeconds()。
首次出现:第 27 章 · Owner 是什么、不是什么。
Owner(所有权概念)
对每一个挂着 UdonBehaviour 的 GameObject,VRChat 服务器都登记了”现在哪个玩家说了算”,那个玩家就是 Owner。[UdonSynced] 字段以 Owner 的值为准;RequestSerialization 只有 Owner 调用才有效;某些事件只在 Owner 上跑。Owner 离线时所有权会自动迁移。
首次出现:第 27 章。
Networking.IsOwner / GetOwner / SetOwner
所有权三件套:IsOwner(this.gameObject) 判断本机玩家是不是这个对象的 Owner;GetOwner(this.gameObject) 拿到当前 Owner 的 VRCPlayerApi;SetOwner(player, this.gameObject) 把所有权转移给某个玩家。
首次出现:第 27 章 · 给灯按钮加 SetOwner。
OnOwnershipRequest
某客户端调用 SetOwner(...) 之前,VRChat 会先在当前 Owner 上调用这个事件问一句”接管 ok 吗?“。返回 false 即可拒绝接管。
首次出现:第 27 章 · 拒绝接管:OnOwnershipRequest。
OnOwnershipTransferred
所有权转移完成后,所有客户端都会被通知一次的事件。形参是新 Owner 的 VRCPlayerApi。常用来在新 Owner 上立即抓一次最新状态、或者全员刷新 UI。
首次出现:第 27 章 · 转完做什么:OnOwnershipTransferred。
[UdonSynced]
打在脚本字段上的特性,告诉 UdonSharp”这个字段要走网络同步”。Owner 改了它的值之后,需要调 RequestSerialization() 触发同步;其他客户端在收到包后通过 OnDeserialization() 看到新值。
首次出现:第 28 章 · 告诉别人发生了什么。
RequestSerialization()
UdonSharpBehaviour 上的方法,Owner 调用才有效。请求把所有 [UdonSynced] 字段打包发给其他客户端。一次调用通常对应一次状态变化(按钮被按、回合切换)。
首次出现:第 28 章。
OnDeserialization()
非 Owner 客户端收到同步包并解开后被调用的事件。在这里读 [UdonSynced] 字段当前值,然后刷新本地表现(灯亮、UI 更新)。
首次出现:第 28 章。
OnPostSerialization
Owner 调完 RequestSerialization 并完成打包后被调用的回调,形参 SerializationResult 里能查 success 和 byteCount。用来确认这次同步是否真的发出去了。
首次出现:第 28 章。
[UdonBehaviourSyncMode]
脚本类上的 attribute,决定这个 UdonSharpBehaviour 走哪种网络同步模式:Continuous(每帧自动同步小字段,像 Pickup)、Manual(你要手动调 RequestSerialization)、NoVariableSync(不同步任何字段,但仍能收发 SendCustomNetworkEvent)、None(彻底关闭网络)。VRChat 推荐 Manager 主类用 Manual、薄壳用 NoVariableSync。
首次出现:第 28 章、第 30 章 · 一个完整多人系统的形状。
SendCustomNetworkEvent
UdonSharpBehaviour 上的方法:把这个脚本上某个公开方法的调用广播给目标客户端。不带参数,只能调本脚本上的方法名(推荐 nameof(MethodName))。
首次出现:第 28 章。
NetworkEventTarget(枚举)
SendCustomNetworkEvent 的目标参数:All 发给所有人(包括自己)、Owner 只发给当前 Owner。需要”只让 Owner 改字段”时,先 SendCustomNetworkEvent(NetworkEventTarget.Owner, nameof(...)) 让 Owner 跑那段代码,再 RequestSerialization。
首次出现:第 28 章。
Networking.GetServerTimeInSeconds()
所有客户端共享的 VRChat 服务器时间(double,秒)。做倒计时、回合时长、动画同步起点时用它,因为各个客户端的 Time.time 互不一致。
首次出现:第 30 章 · 第二步:写 GameManager。
VRCPlayerApi.GetPlayerById
通过 playerId(int)反查 VRCPlayerApi 的方法。同步玩家间状态(“现在轮到哪号玩家”)时通常存 id 而不是引用。
首次出现:第 30 章。
playerId / displayName
VRCPlayerApi 的两个常用属性。playerId 是 int,进入实例时分配,可同步;displayName 是字符串昵称,调试和展示用。
首次出现:第 30 章。
Manager 模式
VRChat 多人脚本推荐架构:用一个挂在场景里、SyncMode = Manual 的 GameManager 主脚本管所有 [UdonSynced] 状态;按钮、显示物体等”薄壳”挂 NoVariableSync 脚本,只把交互转发给 Manager。这样同步源唯一,调试简单。
首次出现:第 30 章 · 一个完整多人系统的形状。
VR 舒适与音频(第 7 部)
Section titled “VR 舒适与音频(第 7 部)”晕动症(Motion Sickness)
视觉看到的运动和身体平衡感对不上时产生的恶心、头晕、冒汗等不适。VR 世界里强制移动镜头最容易触发。
首次出现:第 32 章 · 空间、比例和舒适。
前庭系统(Vestibular System)
耳内感知头部加速度和旋转的平衡系统。VR 里视觉在动、前庭却没感到对应运动时,人会很快晕。
首次出现:第 32 章。
VRC Spatializer / 空间化(Spatialization)
VRChat 的空间音频算法,按声源相对玩家的 3D 位置计算左右耳音量、方向和衰减,让声音听起来来自某个方向。
首次出现:第 33 章 · 声音和氛围。
dB(Decibel,分贝)
音量的对数刻度,不是普通线性百分比。音频里常用 -12 dB、+10 dB 这类值描述响度变化。
首次出现:第 33 章。
增益(Gain)
在原始音量之上额外加或减多少 dB。VRChat 世界 Audio Source 默认有 +10 dB 增益,所以素材本身太响时要降。
首次出现:第 33 章。
Audio Listener
Unity 接收音频的”耳朵”组件。Unity 默认场景里 Main Camera 自带一个;VRChat 世界里不要自己再挂——VRChat 客户端会在玩家头部放置 Listener,世界里多挂一个会冲突或被忽略。
首次出现:第 33 章。
玩家落地、世界 UI、跨世界传送门(第 31 / 34 / 35 章)
Section titled “玩家落地、世界 UI、跨世界传送门(第 31 / 34 / 35 章)”Spawns 数组(VRC Scene Descriptor 字段)
登记一个或多个空物体作为出生点,玩家进入实例时按 Spawn Order 选其中之一。要让两个人不出生在同一格上,需要至少两个分散的 Spawn。
首次出现:第 31 章 · 出生点不是坐标,是一台相机。
Spawn Order(First / Random / Sequential / Demo)
VRC Scene Descriptor 上决定从 Spawns 数组里挑哪个的策略。First 一直用第一个;Random 随机;Sequential 按列表顺序轮;Demo 把 Spawn 当作 VR 房间尺度的中心点来对齐。
首次出现:第 31 章 · 一个出生不够的时候:让玩家不要堆叠。
Spawn Orientation(AlignPlayerWithSpawnPoint / AlignRoomWithSpawnPoint)
出生点的朝向语义。AlignPlayerWithSpawnPoint 让玩家本人面向 Spawn 物体的 forward;AlignRoomWithSpawnPoint 让 VR 玩家的房间坐标系跟 Spawn 对齐,常用于客厅型 VR 体验。
首次出现:第 31 章 · 出生点的四条具体规矩。
Object Behaviour at Respawn / Player Object Behaviour at Respawn
VRC Scene Descriptor 上两个枚举字段,分别决定玩家按 R 重生时世界里的物体(Pickup 等)和”玩家自己拥有的物体”是否回到初始位置。家庭类世界一般保 default Respawn。
首次出现:第 31 章。
Canvas(Unity UI)
Unity UI 系统的根容器。所有 UI 元素都要挂在某个 Canvas 下面才能被画出来。
首次出现:第 34 章 · 第一节:World Space Canvas 的搭法。
Render Mode(Canvas 字段)
决定 UI 怎么画:Screen Space - Overlay(贴屏幕,VRChat 世界用不到)、Screen Space - Camera(贴某摄像机近平面)、World Space(作为 3D 物体放进场景)。VRChat 世界 UI 用 World Space。
首次出现:第 34 章。
World Space Canvas
Render Mode = World Space 的 Canvas。它就是一块挂在世界里的 3D 平面,玩家可以走到它前面看,可以围着它转。VRChat 世界里所有立牌、屏幕、得分板都是它。
首次出现:第 34 章。
VRC_UIShape
VRChat SDK 的 World Space Canvas 必装组件,告诉 VRChat「这个 Canvas 上的按钮、Slider 应该响应玩家激光指针」。漏装的 Canvas 上按钮按不动。
首次出现:第 34 章 · 第一节:World Space Canvas 的搭法。
TextMeshPro / TMP
Unity 的高质量文本组件,比老版 Text 清晰得多。VRChat 世界里的所有文字都应该用它。
首次出现:第 34 章 · 第二节:TextMeshPro 和中文字体。
SDF(Signed Distance Field,有向距离场)
TextMeshPro 用的字体渲染技术。每个字符存一张距离图而不是位图,所以放大缩小都不糊、还能直接做描边、外发光等效果。
首次出现:第 34 章。
TMP Font Asset / Font Asset Creator
TextMeshPro 用的字体资产(.asset)和生成它的窗口(Window → TextMeshPro → Font Asset Creator)。中文世界里要先把 .ttf 通过 Font Asset Creator 烤一份只含必要汉字的 TMP Font Asset,否则中文会显示为方框。
首次出现:第 34 章 · 第二节:TextMeshPro 和中文字体。
MaterialPropertyBlock
Unity 的材质参数覆盖工具。可以在不复制材质的前提下、单独让某一个 Renderer 显示成不同颜色。VRChat 里给一组按钮做”按下变红”反馈又不想为每个按钮做单独材质时用它。
首次出现:第 34 章 · 第五节:视觉反馈。
AudioSource.PlayOneShot
在某个 AudioSource 上”插播”一段 AudioClip,不打断当前正在播的内容。按钮”啪”一声、命中”叮”一声常用它,因为可以让多次按动重叠播放。
首次出现:第 34 章 · 第五节:视觉反馈。
VRC Portal Marker
VRChat SDK 的传送门组件。挂在一个空物体上、设上目标世界(World ID 或 Home / Hub),运行时 VRChat 会在这里自动生成一个站着进就走的传送门。
首次出现:第 35 章 · 第一节:用 World ID 做一个传送门。
Custom Portal Name
VRC Portal Marker 的字段,传送门正面浮出来的世界名字。空着会显示目标世界自己的真实名称。
首次出现:第 35 章。
World 字段(None / Home / Hub)
VRC Portal Marker 的目标选择枚举。None 表示用下面那个 Room ID(即 wrld_xxx);Home 把玩家送回他自己设置的 Home 世界;Hub 送到 VRChat 当前的官方 Hub。
首次出现:第 35 章 · 第二节:直连内置位置(Home / Hub)。
Hub 世界
VRChat 设置的官方公共大厅世界。新玩家、断网回归玩家会被推到这里,是 VRChat 的”游戏主菜单”。
首次出现:第 35 章 · VRChat Hub 世界是什么。
VRCWorld_PortalMarker Prefab
SDK 自带的传送门模板(Packages/com.vrchat.worlds/Runtime/...)。直接拖进场景就是一个完整可工作的传送门,比手搓一个空物体加组件省事。
首次出现:第 35 章 · 第四节:Portal Marker 是 SDK Prefab,可以直接用。
渲染:光照(进阶)
Section titled “渲染:光照(进阶)”Reflection Probe
在某个位置捕捉四周环境的一张 Cube Map,让附近金属、玻璃等高反射材质反射房间本身,而不是默认天空。
首次出现:第 18 章 · Chill World,先让人想留下。详细见 第 36 章 · 光。
全局光照(Global Illumination / GI)
把直接光和间接光一起算进去的总光照系统。烘焙光照主要就是把 GI 预先算好存起来。
首次出现:第 36 章 · 光。
直接光 / 间接光(Direct / Indirect Light)
直接光是从光源直射到表面的光;间接光是光打到别的表面后反弹过来的光。间接光决定房间有没有「被环境包住」的感觉。
首次出现:第 36 章。
UV
把 3D 模型表面摊平成 2D 贴图坐标的展开方式。贴图、Lightmap、法线贴图都靠 UV 知道该贴到模型哪里。
首次出现:第 36 章。
Lightmap UV
专门给烘焙光贴图使用的 UV。模型 Lightmap UV 没展开好,会出现亮线、黑线、漏光等烘焙问题。
首次出现:第 36 章。
Shadowmask
Mixed Lighting 的一种模式:静态物体的阴影烘焙进贴图,动态物体仍能接收实时阴影。PC 世界常用的画质 / 性能平衡点。
首次出现:第 36 章。
Subtractive
Mixed Lighting 的一种省性能模式:大部分光照都烘焙,动态物体只保留粗略实时影子。Quest 版本常用。
首次出现:第 36 章。
渲染:材质与贴图(进阶)
Section titled “渲染:材质与贴图(进阶)”Normal Map(法线贴图)
记录表面每一点朝向的贴图,让平面在光照下看起来有凹凸;模型几何本身并没有真的变形。
首次出现:第 37 章 · 表面和材质。
Occlusion / AO(Ambient Occlusion,环境光遮蔽)
让模型缝隙、凹陷和接触处自动变暗的贴图或效果。没有 AO 的材质容易显得平。
首次出现:第 37 章。
Detail Map
叠在主贴图上的高频细节贴图,常用来让墙、地板在贴脸观看时不糊。
首次出现:第 37 章。
sRGB
按人眼感知校正过的颜色存储空间,适合 Albedo / Base Color 这类「颜色图」。
首次出现:第 37 章。
Linear / 线性空间
按物理量线性存储的颜色空间,适合 Metallic、Smoothness、Normal、AO 这类「不是颜色」的贴图。
首次出现:第 37 章。
ORM
把 Occlusion、Roughness、Metallic 三张灰度图分别塞进 RGB 三个通道的一张打包贴图。Unity Standard Shader 不直接支持,需要拆通道或换支持它的 Shader。
首次出现:第 37 章。
Mip Maps
同一张贴图的多级缩小副本。物体离远时自动使用小图,减少闪烁和采样开销,代价是多占一点内存。
首次出现:第 37 章。
渲染:性能(第 38 章)
Section titled “渲染:性能(第 38 章)”FPS(Frames Per Second)
每秒渲染帧数。VR 里 FPS 太低会让玩家明显不适;PC VR 通常希望 90+,Quest 至少 72+。
首次出现:第 38 章 · 性能,跑得动才是好。
Stats 窗口
Unity Game 视图右上角的快速性能读数窗口,能看到 FPS、Batches、Tris、SetPass calls 等粗略指标。
首次出现:第 38 章。
Profiler
Unity 的逐帧性能分析器,用来查看 CPU、GPU、内存、脚本、物理等系统每帧花了多少时间。
首次出现:第 38 章。
Draw Call
CPU 命令 GPU 画一批物体的一次绘制请求。Draw Call 越多,CPU 准备渲染数据的开销越大。
首次出现:第 38 章。
Batches
Stats 里显示的绘制批次数,通常可以理解成当前帧实际发出的 Draw Call 数。材质和批处理会影响它。
首次出现:第 38 章。
SetPass call
切换 Shader / 材质渲染状态的次数。SetPass call 高通常意味着材质种类太多或 Shader 切换太频繁。
首次出现:第 38 章。
Static Batching / Dynamic Batching
Unity 把多个物体合成更少 Draw Call 的两类批处理。Static Batching 适合不会动的物体,Dynamic Batching 适合少量小动态物体。
首次出现:第 38 章。
GPU Instancing
同一份 Mesh + 同一份 Material 出现很多次时,用更少 Draw Call 批量绘制。树、石头、栏杆这类重复物体最适合。
首次出现:第 38 章。
Occlusion Culling
预计算「玩家站在某个区域时哪些物体被墙挡住」,运行时挡住的物体不画。大房间、多房间世界收益很高。
首次出现:第 38 章。
Overdraw / Fillrate
Overdraw 是同一个像素被多个透明物体反复画;Fillrate 是 GPU 每秒能填多少像素。透明烟雾、玻璃叠多了会把 Fillrate 吃满。
首次出现:第 38 章。
GC(Garbage Collection,垃圾回收)
运行时清理临时对象的机制。脚本每帧制造太多临时对象时,GC 会突然卡一下。
首次出现:第 38 章。
Quest 与跨平台(第 39 章)
Section titled “Quest 与跨平台(第 39 章)”APK(Android Package)
Android 应用安装包格式。VRChat 的 Quest 版世界构建,本质上按 Android 平台规则打包。
首次出现:第 39 章 · PC 和 Quest。
Post Processing(后处理)
一帧画面渲染完之后再叠的屏幕效果,如 Bloom、Color Grading、Vignette。VRChat 官方 Android 文档写明 Post Processing 在 Android 上会被禁用,Quest / Android 版本按 0 处理。
首次出现:第 39 章。
Cloth
Unity 的布料模拟组件,让布按物理规则飘动或下垂。移动 GPU 和 CPU 预算承受不起,Quest 世界里必须避免。
首次出现:第 39 章。
ASTC
Android / Quest 常用的现代纹理压缩格式。Unity 在 Android 标签下常用 ASTC 6x6 作为贴图压缩起点。
首次出现:第 39 章。
调试与测试(第 8 部)
Section titled “调试与测试(第 8 部)”NullReferenceException / NRE(空引用异常)
脚本试图使用一个值为 null 的引用时抛出的异常。VRChat / UdonSharp 世界里常见原因是 Inspector 字段没拖引用,或 GetComponent<T>() 没找到组件。
首次出现:第 40 章 · 坏了怎么办,调试的思路。
调用栈(Call Stack)
错误发生时的一串调用记录,显示代码从哪个方法一路调用到出错位置。Console 里的 (at Assets/xxx.cs:18) 就是定位入口。
首次出现:第 40 章。
Debug.Log
Unity 的日志输出方法,用来把脚本执行到哪、变量当前是什么写进 Console 或客户端日志。发布前要清掉高频日志,避免额外开销。
首次出现:第 40 章。
halted
UdonBehaviour 未捕获异常后被 Udon 虚拟机停掉的状态。出现 this UdonBehaviour will be halted 后,这个对象上的事件通常不会继续触发,直到玩家重新进入世界。
首次出现:第 40 章。
EXTERN
Udon 字节码里调用外部 API 的指令名。错误日志里看到 EXTERN 时,通常要结合上下文找到是哪一行 C# 调用了对应 API。
首次出现:第 40 章。
SDK Validation
VRChat SDK 在构建或上传前做的自动检查,会提示缺少组件、平台不兼容 Shader、纹理规格超限等问题。Quest / Android 平台的检查通常比 PC 更严格。
首次出现:第 41 章 · 测试你的世界。
版本管理与许可(第 8 部)
Section titled “版本管理与许可(第 8 部)”.gitignore
Git 的忽略清单,告诉 Git 哪些文件和目录不要进入版本控制。Unity 项目里常用它排除 Library/、Temp/、Builds/ 等自动生成目录。
首次出现:第 42 章 · 版本管理和备份。
Git LFS(Large File Storage)
Git 的大文件扩展。仓库里只保留指针,实际的大模型、PSD、HDR、视频等文件放到 LFS 存储里,避免普通 Git 历史迅速膨胀。
首次出现:第 42 章。
Smart Merge / UnityYAMLMerge
Unity 自带的智能合并工具,能按 GameObject / Component 等对象结构合并 .unity、.prefab 这类 YAML 文件。它比普通文本行合并更适合 Unity 场景冲突。
首次出现:第 42 章。
Force Text(资产序列化模式)
Unity 项目设置 Edit → Project Settings → Editor → Asset Serialization → Mode 的一个选项。改成 Force Text 后,.unity / .prefab / .asset 等文件以 YAML 文本写入,能 diff、能合并。VRChat 模板默认是 Force Text,但合作开发时拉别人项目要确认一遍。
首次出现:第 42 章 · Asset Serialization Mode = Force Text。
Visible Meta Files(meta 文件可见模式)
Unity 项目设置 Edit → Project Settings → Editor → Version Control → Mode 的默认选项。每个资源旁边可见同名 .meta 文件,存 GUID + 导入设置;.meta 必须跟资源一起进版本控制,漏一个就引用断。
首次出现:第 42 章 · Version Control Mode = Visible Meta Files。
EULA(End User License Agreement,最终用户许可协议)
规定用户买到或下载到一份素材后能做什么、不能做什么。Unity Asset Store 素材统一受 Asset Store EULA 约束。
首次出现:第 43 章 · 素材、插件和版权。
Creative Commons / CC(知识共享)
一组常见内容许可证家族,用 BY、NC、ND、SA 等条件组合说明署名、商用、修改和相同方式共享要求。Sketchfab、Polyhaven、Freesound 等素材站经常使用。
首次出现:第 43 章。
DMCA
美国版权投诉与下架流程。版权方投诉后,平台可以按 DMCA 流程下架世界、头像或其他用户上传内容。
首次出现:第 43 章。
IP(Intellectual Property,知识产权)
版权、商标、角色形象、品牌标识等权利的统称。VRChat 世界里使用动漫角色、游戏音乐、品牌 logo 等内容时,通常都涉及 IP 授权问题。
首次出现:第 43 章。
发布、商业化与运营(第 9 部)
Section titled “发布、商业化与运营(第 9 部)”Community Labs
VRChat 新公开世界的预审池。世界先给主动开启 Labs 的玩家看到,经过一段时间和数据观察后再自动晋升为 Public。
首次出现:第 44 章 · 发布你的世界。
Opt-in
主动开启某个功能或入口。Community Labs 的 opt-in 用户指在 VRChat 设置里主动勾选 Show Community Labs 的玩家。
首次出现:第九部总览。
元数据(Metadata)
描述内容本身的数据。VRChat 世界的元数据包括名称、描述、缩略图、标签、容量、可见性等,不等同于 Unity 场景内容。
首次出现:第 44 章。
SEO(Search Engine Optimization,搜索优化)
让内容更容易被搜索和推荐系统识别的写法或配置。VRChat 标签能帮助分类和搜索,但滥用标签会被处罚。
首次出现:第 44 章。
TOS(Terms of Service,服务条款)
平台对用户行为、上传内容和账号责任的规则。世界发布后,内容不仅要符合素材许可证,也要符合 VRChat TOS 和社区准则。
首次出现:第 44 章。
Creator Economy
VRChat 官方创作者经济系统。玩家用 VRChat Credits 购买世界内商品或订阅,创作者通过 Tilia 提现。
首次出现:第 45 章 · 赞助、商品和创作者经济。
VRChat Credits
VRChat 平台内的商品交易代币。玩家购买 Credits,再用它购买 Listing 或 Subscription;创作者达到门槛后按规则提现。
首次出现:第 45 章。
Tilia
VRChat 用于 Creator Economy 的第三方支付服务商,负责身份验证、资金流转和提现流程。
首次出现:第 45 章。
Authorized Seller(授权卖家)
通过 VRChat 审核、允许在 Creator Economy 里创建和销售商品的创作者账号状态。申请时会审核账号、世界质量、社群活跃度和支付资料。
首次出现:第 45 章。
Products / Listings / Subscriptions / Stores
Creator Economy 的四件套:Products 是买家最终拥有的内容,Listings 是一次性商品,Subscriptions 是周期性订阅,Stores 是购买入口。
首次出现:第 45 章。
Dark Patterns(暗黑模式)
诱导用户做出不利选择的界面或流程设计,如隐藏取消按钮、虚假倒计时、强制订阅等。VRChat Creator Economy 明确禁止这类做法。
首次出现:第 45 章。
Recommended Capacity / Capacity (Hard Cap)
VRC Scene Descriptor 上的两档实例容量字段。Recommended Capacity 是软上限,达到后实例在公开浏览中曝光下降;Capacity 是硬上限(Hard Cap),达到后新玩家不能再加入(少数 Group / 创建者例外)。Event 世界常把容量调到 60+,实际可用上限受 SDK 与平台性能影响。
首次出现:第 23 章 · Event World、应用在第 44 章发布元数据。
Networking.OpenURL
VRChat 提供的”打开外部网址”API,签名 Networking.OpenURL(VRCUrl url)。不能强制打开,VRChat 客户端会先弹出确认框让玩家同意。常用于 Commercial World 跳转外部商店、Tool World 跳到说明文档。
首次出现:第 25 章 · Commercial World。
backlog
待处理清单。维护世界时常用它收集反馈和想法,再按必修、应修、看情况等优先级排队。
首次出现:第 46 章 · 维护一个世界。
Feature Creep(功能膨胀)
产品或世界在持续迭代中不断加功能,最终偏离核心定位、维护成本变高的状态。VRChat 世界维护时,常见于过度接受常驻玩家的加功能建议。
首次出现:第 46 章。
IntelliSense
IDE 的自动补全和类型提示功能。检查 AI 给出的 UdonSharp API 名是否存在时,它是比记忆更可靠的第一道验证。
首次出现:第 47 章 · 继续学习。
Mod
非官方客户端改件。本书只在解释「本地篡改不能作为可信来源」时提到它;VRChat 平台规则通常不允许修改客户端。
首次出现:第 45 章。
关于这份术语表
Section titled “关于这份术语表”以下三件事现在还没完成:
- 章节锚点(
#xxx):上面所有引用章节中某节的链接,都基于 Starlight 自动从中文 h2 标题转出的 slug。如果将来有章节标题改了,这里链接需要同步更新。本文件里所有锚点都是按写本文件时的章节标题手工生成的。 - 后续章节术语:部分章节的术语仍未系统补齐,等对应正文写完或校订完再补。
- 版本注:受 SDK 版本影响的词条统一加
适用 SDK3.x / Unity 2022.3.22f1。SDK 升级时,以 VRChat Current Unity Version 当前页面为准。