VRChat 中的 Unity 图层
图层在 Unity 中用于组织游戏对象、确定游戏对象之间的碰撞和射线检测、选择性地渲染场景的某些部分等。
你可以在 VRChat 世界中自由使用大多数图层。 部分图层由 Unity 和 VRChat 共享使用。
当你使用 VRChat 的世界 SDK 创建 Unity 项目时,你的项目将自动配置为使用 VRChat 的内置图层。如果你更改碰撞矩阵、重命名或删除内置图层,当你将世界上传到 VRChat 时,这些更改将被覆盖。
图层 22-31 是未使用的"用户"Unity 图层。你可以自由编辑它们,对这些图层的更改在构建和上传世界时不会被丢弃。
Unity 内置图层
下表列出了 Unity 的内置图 层,它们在 VRChat 中的用途,以及用户是否可以在其上放置贴纸。
| 图层编号 | 图层名称 | 描述 | 可以贴贴纸 |
|---|---|---|---|
| 0 | Default | Unity 游戏对象的默认图层。由 VRChat 的 Avatar Pedestals 使用。 | ✔ |
| 1 | TransparentFX | 用于 Unity 的 Flare 资源。 | ❌ |
| 2 | IgnoreRaycast | 如果未提供图层遮罩,Unity 的物理射线检测会忽略此图层。VRChat 的物理射线检测不会忽略此图层。 | ❌ |
| 3 | Item | 由用户放置到你世界中的 VRChat 物品使用。当你上传世界时,此图层上的任何游戏对象将被移动到图层 0(Default)。 | ❌ |
| 4 | Water | 由 Unity 的标准资源使用。由 VRChat 的传送门使用。由 VRChat 的镜子使用。常用于 Unity 的后期处理。 | ✔ |
| 5 | UI | ⚠ 你可能不想使用此图层。Unity UI 默认使用此图层。除非玩家打开 VRChat 菜单,否则 VRChat 的 UI 指针会忽略此图层。除非在相机中启用了'UI',否则 VRChat 的相机会忽略此图层。 | ❌ |
| 6 | reserved6 | ⚠ 避免使用此图层。由 VRChat 保留。当你上传世界时,保留图层上的任何游戏对象将被移动到图层 0(Default)。 | ❌ |
| 7 | reserved7 | ⚠ 避免使用此图层。由 VRChat 保留。当你上传世界时,保留图层上的任何游戏对象将被移动到图层 0(Default)。 | ❌ |
| 8 | Interactive | Unity 和 VRChat 未使用。 使用此图层用于你不希望用户放置贴纸的碰撞器。 | ❌ |
| 9 | Player | 用于 VRChat 的玩家,除了本地玩家。 | ❌ |
| 10 | PlayerLocal | VRChat 用于渲染本地玩家。人形虚拟形象在不渲染头骨的情况下渲染。 | ❌ |
| 11 | Environment | Unity 和 VRChat 未使用。 | ✔ |
| 12 | UiMenu | ⚠ 你可能不想使用此图层。除非玩家打开 VRChat 菜单,否则 VRChat 的 UI 指针会忽略此图层。 | ❌ |
| 13 | Pickup | 添加拾取组件时,VRChat 的拾取物默认使用此图层。不与玩家碰撞。 | ❌ |
| 14 | PickupNoEnvironment | 此图层上的碰撞器仅与'Pickup'碰撞。 | ❌ |
| 15 | StereoLeft | Unity 和 VRChat 未使用。 | ❌ |
| 16 | StereoRight | Unity 和 VRChat 未使用。 | ❌ |
| 17 | Walkthrough | 此图层上的碰撞器不与玩家碰撞。 | ✔ |
| 18 | MirrorReflection | VRChat 用于在镜子中渲染本地玩家。 此图层上的渲染器仅在镜子中显示。 此图层上的渲染器不会在 VRChat 的主相机中渲染。 此图层上的碰撞器不会阻挡 VRChat 的射线检测。 | ❌ |
| 19 | InternalUI | ⚠ 避免使用此图层。由 VRChat 用于内部 UI 元素,如菜单、铭牌和调试面板。 | ❌ |
| 20 | HardwareObjects | ⚠ 避免使用此图层。由 VRChat 用于渲染物理硬件的虚拟表示,例如控制器和追踪器。 | ❌ |
| 21 | reserved4 | ⚠ 避免使用此图层。由 VRChat 保留。当你上传世界时,保留图层上的任何游戏对象将被移动到图层 0(Default)。 | ❌ |
| 22-30 | Unity 和 VRChat 未使用。在上传的世界中,VRChat 不会覆盖这些图层的名称和碰撞矩阵。 | (✔)1 | |
| 31 | ⚠ 避免使用此图层。由 Unity 的编辑器预览窗口机制使用。 | (✔)1 |
贴纸
贴纸允许 VRChat+ 用户在世界中的 Collider 组件上放置图片。
贴纸不能放置在所有图层上。如果你不希望用户在 Collider 组件上放置贴纸,可以更改其图层。我们建议使用图层 8("Interactive"),因为 VRChat 和 Unity 未使用它。
如果你不希望在任何地方允许贴纸,请在 VRChat 网站上编辑你的世界并禁用贴纸。
物理与图层
使用物理操作时,最好限制你测试的图层,以避免在保留图层上的物品。同时建议对物理调用传回的任何对象使用 Utilities.IsValid,以确保你没有意外获取"受保护"的对象,这些对象将是 null,可能导致你的 UdonBehaviour 关闭。
这些物理方法最好与 IsValid 配合使用:
- Physics.Raycast
- Physics.RaycastAll
- Physics.RaycastNonAlloc
- Physics.SphereCast
- Physics.SphereCastAll
- Physics.SphereCastNonAlloc
- Physics.OverlapSphere
- Physics.OverlapBox
- Physics.OverlapCapsule
- Physics.OverlapSphereNonAlloc
- Physics.OverlapBoxNonAlloc
- Physics.OverlapCapsuleNonAlloc
- Rigidbody.SweepTest
- Rigidbody.SweepTestAll
- Physics.CapsuleCast
- Physics.CapsuleCastAll
- Physics.CapsuleCastNonAlloc
- Physics.BoxCast
- Physics.BoxCastAll
- Physics.BoxCastNonAlloc
- Collider.Raycast
- Physics.CheckSphere
- Physics.CheckBox
- Physics.CheckCapsule
VRChat 图层的交互阻挡和穿透
交互(从远处抓取物品、用激光切换 UI 元素)会被大多数 VRChat 图层阻挡。以下图层对交互透明,允许你穿透交互:
- UiMenu
- UI
- PlayerLocal
- MirrorReflection
用户图层的交互穿透
默认情况下,用户图层的交互是阻挡的。使用"Interact Passthrough"遮罩来定义对交互透明的图层(允许交互穿透)。请注意,碰撞检测射线的起点在桌面/移动玩家(在玩家胶囊体内)与 VR 玩家(在用 户追踪的手部)之间是不同的。这意味着 VR 玩家的手可以穿透碰撞器,即使玩家碰撞器被阻挡。因此,这些碰撞器不会阻挡 VR 玩家的交互,因为手已经穿透了。