5. 你的第一个世界
这一章的目标很明确:把一个能站进去的世界搭出来。
场景会很空:一块地板、一个出生点、默认蓝天和一盏太阳灯。但在 VRChat 客户端里看到它、用键盘走在上面之后,Unity 里那些几何方块就成了一个真的可以走进去的空间。
一个最基础的世界要回答三件事
Section titled “一个最基础的世界要回答三件事”VRChat 把玩家放进世界之前,必须先得到这三件事的答案:
- 玩家可以站在哪?需要一块带物理碰撞的地面,不然进来就掉。
- 玩家进来时落在哪个位置、面朝哪边?需要一个明确的出生点。
- 这个 Unity 场景到底是不是 VRChat 世界?需要一个叫
VRC Scene Descriptor的描述组件。
接下来的四步分别解决这三件事。
第一步:新建并保存场景
Section titled “第一步:新建并保存场景”打开上一章建好的 MyFirstWorld 项目。
菜单栏 File → New Scene,弹出的面板里选 Basic。然后按 Ctrl+S,把场景命名为 MyFirstWorld,保存到 Assets/Scenes/ 目录下。如果这个目录不存在,右键新建一个。
第二步:解决踩地(创建地板)
Section titled “第二步:解决踩地(创建地板)”左侧 Hierarchy 面板的空白处右键,3D Object → Cube。把新物体改名为 Floor。
选中 Floor,右侧 Inspector 最上方找到 Transform,把参数改成:
- Position:
0, 0, 0 - Rotation:
0, 0, 0 - Scale:
10, 0.2, 10
原本的小方块变成一块 10 米见方、20 厘米厚的扁平地板。
为什么用 Cube 不用 Plane?两层原因:
- 渲染层面:Unity 内置 Plane 是一张由两个三角形组成的薄片,法线朝上;标准着色器默认开启背面剔除(backface culling),从底面看时整张地板会直接消失。Cube 是封闭的六面体,从任何角度都不穿帮。
- 碰撞层面:Plane 默认挂的是
Mesh Collider(薄片网格碰撞),它本身没有厚度,玩家从边缘横向走过来、或者高速跳跃时,物理引擎容易出现「擦边漏检」,人直接掉穿地板。Cube 默认挂的是Box Collider(盒子碰撞体),有完整体积,踩上去稳得多。
简而言之:Plane 是给「装饰用平面」准备的,比如墙上一张海报;做能踩的地板,永远首选 Cube 拍扁。
第三步:标记出生位置
Section titled “第三步:标记出生位置”需要告诉 VRChat:玩家进场景时,应该出现在哪儿、面朝哪边。
Hierarchy 空白处右键,Create Empty,新物体改名 Spawn。
Inspector 里把 Spawn 的 Position 设为 0, 0.2, 0,Rotation 保持默认 0, 0, 0。
地板厚度 0.2 米、中心在原点,上表面在 Y = 0.1。Y = 0 会让出生点落在地板内部;Y 比 0.1 略高一点(例如 0.2)即可贴地站立。
第四步:给场景一张身份证
Section titled “第四步:给场景一张身份证”Hierarchy 空白处右键,Create Empty,命名 WorldDescriptor。
选中它,Inspector 最下面点 Add Component,搜索 VRC Scene Descriptor,从结果里点上它。
加好后,在它的属性里找到 Spawns 字段,这是一个用来登记出生点的数组。把 Hierarchy 里的 Spawn 物体直接拖进 Spawns 下方的 Element 0 空槽。这样 VRChat 就知道该把玩家送到哪个位置了。
第五步:Build & Test
Section titled “第五步:Build & Test”顶部菜单栏 VRChat SDK → Show Control Panel,打开 SDK 控制面板。如果还没登录,先登一下账号。
Builder 标签页下面,找到 Build & Test 按钮,点。
Unity 会在后台打包并构建本地测试数据,一两分钟。打包完成后会自动唤起本机的 VRChat 客户端。
画面加载好后,眼前是一个很空的世界:脚下灰白地板,四周默认蓝天,一盏太阳灯照着。
按 W A S D 走两步,晃一下鼠标看看天。
这就是这一章要做出来的第一个世界。
简陋,但它是从零搭起来的空间。回 Unity 改参数,再 Build & Test,新改动立刻就能进去看。「改 → 构建 → 进去看」这个循环,是 VRChat 世界开发的日常节奏。
整个骨架其实只有四件东西
Section titled “整个骨架其实只有四件东西”刚才一路下来,骨架其实很简单:
- 一个场景文件
MyFirstWorld.unity,存所有空间数据。 - 一块带物理碰撞的地板
Floor,解决玩家在哪站。 - 一个空物体
Spawn,标记玩家进来的位置和朝向。 - 一个挂了
VRC Scene Descriptor的WorldDescriptor,告诉 SDK 这是 VRChat 世界。
后面世界做得再大、交互再复杂,最底下的骨架永远是这四样。
自己改两个值看看
Section titled “自己改两个值看看”回 Unity 改几样参数,重新 Build & Test 一次,把 Unity 和 VRChat 之间这条链条的直觉建立起来:
- 把
Floor的 Scale 改成20, 0.2, 20,进去看看是不是变宽了。 - 把
Spawn的 Rotation Y 改成180,进去看看出生方向是不是反了。 - 复制(
Ctrl+D)几个 Cube,缩小后错落摆在地板周围当凳子,进去试试能不能跳上去。
「改一个参数 → 进去看效果」这个回路,比读十遍文档管用。下一章往里看一层:Unity 凭什么能让一块 Cube 当地板用。