# Varneon's VRChat World Development Handbook

Due to overflowing amount of information about VRChat world development in my head I tend to forget things easily. This book is a place where I will put most of that information in so it's available more easily for everyone, including myself.

# Highlighting Objects from Udon

If you are looking for a way to draw the user's attention to certain objects in your world, you can use the VRChat's native highlighting feature to set the highlighted state of any object or renderer.

[![](https://vrclibrary.com/wiki/uploads/images/gallery/2023-01/scaled-1680-/image-1672963034381.png)](https://vrclibrary.com/wiki/uploads/images/gallery/2023-01/image-1672963034381.png)

<p class="callout warning">**NOTE**: Hovering state changes on VRChat's interaction highlights will override the current state of the highlight set from Udon and vice versa.</p>

```csharp
// Highlights a GameObject using any renderer on the object if one exists
VRC.SDKBase.InputManager.EnableObjectHighlight(GameObject obj, bool enabled);

// Highlights a Renderer
VRC.SDKBase.InputManager.EnableObjectHighlight(Renderer r, bool enabled);

```

# Layers

What are the different layers used for in VRChat? What special properties of some specific layers should you know?

Below I've listed the currently used (+ reserved) layers and their use cases based on experimentation using my layer inspection tools.

<p class="callout warning">My layer research is currently ongoing and information on this page may still be incomplete!</p>

<p class="callout warning">Any object set to **19-21:** **reserved2-4** will be forced to **0: Default** on build (You can still manually force the layer during runtime)</p>

<table id="bkmrk-no-name-description-" style="border-collapse:collapse;width:100%;height:1365.72px;"><colgroup><col style="width:6.05686%;"></col><col style="width:20.2719%;"></col><col style="width:30.1618%;"></col><col style="width:43.3858%;"></col></colgroup><tbody><tr style="height:29.7969px;"><td style="height:29.7969px;">**No**</td><td style="height:29.7969px;">**Name**</td><td style="height:29.7969px;">**Visual elements**</td><td style="height:29.7969px;">**Notes**</td></tr><tr style="height:65.8438px;"><td style="height:65.8438px;">0</td><td style="height:65.8438px;">Default</td><td style="height:65.8438px;">

- Avatar pedestals
- Emojis

</td><td style="height:65.8438px;"><p class="callout info">Default layer</p>

</td></tr><tr style="height:59.3906px;"><td style="height:59.3906px;">1</td><td style="height:59.3906px;">TransparentFX</td><td style="height:59.3906px;">  
</td><td style="height:59.3906px;"><p class="callout info">Used for Unity's Flare Assets</p>

</td></tr><tr style="height:104.172px;"><td style="height:104.172px;">2</td><td style="height:104.172px;">IgnoreRaycast</td><td style="height:104.172px;">  
</td><td style="height:104.172px;"><p class="callout info">Ignored by Unity's Physics Raycasts if no layer mask is provided. Not ignored by VRChat's Physics Raycasts</p>

</td></tr><tr><td>3</td><td>reserved3</td><td>  
</td><td>  
</td></tr><tr style="height:70.0312px;"><td style="height:70.0312px;">4</td><td style="height:70.0312px;">Water</td><td style="height:70.0312px;">

- Portals
- Mirrors

</td><td style="height:70.0312px;">  
</td></tr><tr style="height:152.719px;"><td style="height:152.719px;">5</td><td style="height:152.719px;">UI</td><td style="height:152.719px;">

- Remote camera lens
- Player scanning highlight
- Personal mirror visuals

</td><td style="height:152.719px;"><p class="callout warning">Interactive objects on this layer can't be interacted with unless the menu is open</p>

<p class="callout info">Colliders of remote players exist on this layer</p>

</td></tr><tr><td>6</td><td>reserved6</td><td>  
</td><td>  
</td></tr><tr><td>7</td><td>reserved7</td><td>  
</td><td>  
</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">8</td><td style="height:29.7969px;">Interactive</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;"><p class="callout success">Unused by Unity and VRChat</p>

</td></tr><tr style="height:86.8125px;"><td style="height:86.8125px;">9</td><td style="height:86.8125px;">Player</td><td style="height:86.8125px;">

- Remote players
- Remote player chatbox

</td><td style="height:86.8125px;">  
</td></tr><tr style="height:81.7812px;"><td style="height:81.7812px;">10</td><td style="height:81.7812px;">PlayerLocal</td><td style="height:81.7812px;">

- Local player without head

</td><td style="height:81.7812px;"><p class="callout info">VRCMirrorReflection refuses to render this layer  
</p>

</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">11</td><td style="height:29.7969px;">Environment</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;"><p class="callout success">Unused by Unity and VRChat</p>

</td></tr><tr style="height:86.8281px;"><td style="height:86.8281px;">12</td><td style="height:86.8281px;">UiMenu</td><td style="height:86.8281px;">

- Nameplates
- Remote camera nameplate

</td><td style="height:86.8281px;">  
</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">13</td><td style="height:29.7969px;">Pickup</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;"><p class="callout info">Default pickup layer</p>

</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">14</td><td style="height:29.7969px;">PickupNoEnvironment</td><td style="height:29.7969px;">

- Personal mirror collider *(regardless of whether grabbable or not)*

</td><td style="height:29.7969px;"><p class="callout info">Colliders on this layer only collide with the 'Pickup' layer</p>

</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">15</td><td style="height:29.7969px;">StereoLeft</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;"><p class="callout success">Unused by Unity and VRChat</p>

</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">16</td><td style="height:29.7969px;">StereoRight</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;"><p class="callout success">Unused by Unity and VRChat</p>

</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">17</td><td style="height:29.7969px;">Walkthrough</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;"><p class="callout info">Colliders on this layer won't collide with players</p>

</td></tr><tr style="height:195.344px;"><td style="height:195.344px;">18</td><td style="height:195.344px;">MirrorReflection</td><td style="height:195.344px;">

- Complete local player *(shown in mirrors and cameras)*

</td><td style="height:195.344px;"><p class="callout warning">Only layer that isn't rendered by the main camera (local player's sees the headless copy of themselves on layer 10)</p>

<p class="callout info">Colliders on this layer don't block VRChat raycasts</p>

</td></tr><tr style="height:164.828px;"><td style="height:164.828px;">19</td><td style="height:164.828px;">InternalUI

*(Previously "reserved2")*

</td><td style="height:164.828px;">

- HUD
- Main menu
- Camera UI
- Camera lens
- Cursor
- Tooltips
- Expression menu

</td><td style="height:164.828px;"><p class="callout info">Will render over everything</p>

</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">20</td><td style="height:29.7969px;">HardwareObjects

*(Previously "reserved3")*

</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;">  
</td></tr><tr style="height:29.7969px;"><td style="height:29.7969px;">21</td><td style="height:29.7969px;">reserved4</td><td style="height:29.7969px;">  
</td><td style="height:29.7969px;">  
</td></tr></tbody></table>

---

### Changelog

#### \[2024-09-04\]

- Added note about recently discovered personal mirror visuals on **UI *(5)***
- Added note about recently discovered personal mirror collider on **PickupNoEnvironment *(14)***