unity-vrc-world-sdk-3 logo

unity-vrc-world-sdk-3

unity vrc world sdk 3

SKILL.md

Full skill instructions

VRChat World SDK 3 Guide

Table of Contents

SectionContentReference
Scene SetupVRC_SceneDescriptor, SpawnThis file
ComponentsPickup, Station, Mirrorreferences/components.md
Layers & CollisionLayers, Collision Matrixreferences/layers.md
PerformanceOptimization guidereferences/performance.md
LightingLighting settingsreferences/lighting.md
Audio & VideoAudio, Video playersreferences/audio-video.md
Build ValidationRed/yellow/white SDK alertsreferences/build-validation.md
World UploadUpload workflowreferences/upload.md
TroubleshootingProblem solvingreferences/troubleshooting.md
CheatsheetQuick referenceCHEATSHEET.md

Common Mistakes (NEVER List)

These cause silent world failures, performance disasters, or Quest incompatibility:

#NEVER do thisWhy it hurtsUse instead
1Enable Mirror by default (active on world join)Renders the entire scene twice — immediate FPS halving, catastrophic on QuestDefault Mirror OFF; add UdonSharp toggle or player-triggered activation
2Use realtime directional lights with real-time shadowsQuest has no hardware shadow acceleration; shadow casters commonly cost on the order of 10-30 FPS in practice (varies by scene)Baked lightmaps + light probes; set lights to Baked or Mixed mode
3Set Respawn Height at or above the world floorPlayer respawns → falls → respawns again → infinite loop; players cannot recoverSet to an unreachable depth (e.g., floor at Y=0 → Respawn at Y=-100)
4Skip "Setup Layers for VRChat" on a new projectLayer collision matrix is wrong by default — players walk through walls, Pickups clip floorsRun VRChat SDK > Builder > "Setup Layers for VRChat" before placing any colliders
5Enable Post-Processing without Quest build profilePost-Processing is silently disabled at runtime on Quest but VRAM is still allocatedUse separate Android build profile with post-processing disabled
6Place more than 2 active video players simultaneouslyEach player adds significant decoding overhead; running >2 simultaneously is a common cause of frame drops and audio issues in practiceDisable extra players at scene start; activate only the currently playing one
7Use Unity Constraints or Cloth on QuestBoth are disabled silently at runtime on Quest — animations freeze, cloth hangs in placeUse VRC Constraints (SDK 3.10.0+, world-supported) or Animator-driven transforms, and remove cloth from Quest meshes
8Upload without completing a lightmap bakeRealtime GI calculates at runtime — commonly on the order of 3-5× draw call overhead in practice, unacceptable on QuestAlways bake lights before upload; Progressive GPU lightmapper is fastest
9Place player walkable surfaces on Default layer (0)Collision matrix is wrong by default — avatar physics collision is unreliable; players may clip through geometryUse Environment (layer 11) for all walkable geometry, walls, and floors
10Use very high lightmap resolution for large areas without profilingTexture memory can spike significantly at high resolutions; a common cause of OOM crashes on mobile headsetsStart at 10-20 texels/unit (PC) / 5-10 (Quest) as a practical guideline; profile VRAM and adjust — official guidance says "keep lightmap resolution low" for Quest
11Add VRC_UIShape to a Screen Space or Overlay CanvasVRC_UIShape requires World Space Canvas; other modes throw a runtime Unity error in VRChat — the UI renders visually but is not interactive, with no visible error to the world builderSet Canvas > Render Mode to World Space before adding VRC_UIShape

Reference Loading Guide

Load only what the task requires.

TaskMANDATORY READOptionalDo NOT LoadLoad Rationale
Setting up a new scene from scratchcomponents.md, layers.mdupload.mdaudio-video.md, troubleshooting.mdCollision matrix non-obvious; component deps needed upfront
Making objects grabbable (VRC_Pickup)components.mdlayers.mdaudio-video.md, lighting.mdPickup/Rigidbody requirements not in standard Unity docs
Configuring Dynamics for Worlds (PhysBones, Contacts, Box Contacts, Global Avatar PhysBone Colliders, world VRCPhysBoneCollider access)components.mdlayers.md, troubleshooting.md; use unity-vrc-udon-sharp for Udon codeaudio-video.md, lighting.mdDynamics component availability and Udon access are SDK-version sensitive
Setting up seating (VRC_Station)components.mdlayers.mdaudio-video.md, performance.mdStation collider + exit requirements are VRChat-specific
Optimizing FPS for Questperformance.md, lighting.mdtroubleshooting.mdaudio-video.md, upload.mdQuest limits differ from PC; bake requirements non-obvious
Adding audio or video player / voice zones (SetVoiceGain, Steam Audio)audio-video.md, components.mdtroubleshooting.mdlighting.md, performance.mdAVPro vs Unity Video selection is VRChat-specific
Baking lights / lightmap setuplighting.md, performance.mdaudio-video.md, layers.mdLightmap resolution and probe placement affect Quest VRAM
SDK Build Panel validation alerts, red/yellow/white warnings, or Auto Fix questionsbuild-validation.mdupload.md, troubleshooting.mdaudio-video.md, lighting.mdAlert severity, build consequence, and Auto Fix side effects must come from SDK-backed catalog
World upload and publishupload.mdbuild-validation.md, troubleshooting.mdaudio-video.md, lighting.mdUpload steps and validation order are fragile; easy to miss
Debugging collision or layer issueslayers.md, troubleshooting.mdcomponents.mdaudio-video.md, lighting.mdVRChat collision matrix differs from Unity default
Mirror setup and configurationcomponents.mdperformance.mdaudio-video.md, upload.mdMirror layer mask requirements are VRChat-specific

Before Starting a New World — Design Decisions

These decisions shape every downstream choice. Make them first, before placing any component.

DecisionOptionsImplication
Quest required?Yes / NoYes → Quest First philosophy applies from day 0, not as a retrofit
Expected player count?1–8 / 9–40 / 40+Affects spawn count, mirror policy, max video players
Primary interaction?Grab (Pickup) / Sit (Station) / Watch (Video) / ExploreDetermines which SDK components are mandatory
Lighting approach?Baked / Mixed / RealtimeRealtime is only viable on PC-only worlds; all lights must be baked before upload
Networked objects?None / Physics (Pickup+ObjectSync) / State (UdonSynced)Determines sync architecture before Udon scripting begins

Design Philosophy: Quest First

Build for Quest and get PC for free. Build for PC and Quest becomes a separate project.

Quest (Meta Quest 2/3/Pro) defines the performance budget:

  • CPU/GPU: ~2× slower than PC VR; tile-based GPU with no hardware shadow maps
  • VRAM: ~4 GB shared with OS (vs 6–12 GB on PC); no HDR framebuffer
  • Thermal throttling: Sustained 100% GPU load causes clock reduction within minutes

If a world runs at 72 FPS on Quest with a single test client, it will typically run at 90+ FPS on PC — though results vary by shader complexity, CPU-bound workloads, and hardware differences. The converse rarely holds. Verify against the official VRChat optimization documentation before publishing.

NEVER optimize exclusively for PC with "Quest support added later" — by that point, lighting, materials, and mesh density are all locked to PC quality, and the Quest port requires rebuilding everything.

Quest First Cascade — when Quest is required, every downstream decision inherits constraints:

Quest required? → Yes
  ├── Shaders: Mobile-only (Standard Lite, Toon Lit)
  ├── Lighting: Fully baked (no realtime shadows)
  ├── Geometry: 50K-100K triangles (target range)
  ├── Materials: < 25 unique materials
  ├── Audio: Mono, compressed, limited concurrent sources
  └── Physics: Simplified colliders, minimal Rigidbodies

SDK Versions

Supported versions: SDK 3.7.1 - 3.10.4

SDKNew FeaturesStatus
3.7.1StringBuilder, Regex, System.Random
3.7.4Persistence API (PlayerData/PlayerObject)
3.7.6Multi-platform Build & Publish (simultaneous PC + Android builds)
3.8.0PhysBone dependency sorting, Force Kinematic On Remote, Drone API
3.8.1[NetworkCallable] events with parameters, Others/Self targets, VRCCameraSettings
3.9.0Camera Dolly API, Auto Hold simplification, VRCCameraSettings additions (CullingMask, GetCurrentCamera)
3.10.0Dynamics for Worlds (PhysBones, Contacts, VRC Constraints)
3.10.1Bug fixes and stability improvements
3.10.2EventTiming extensions, PhysBones fixes, shader time globals
3.10.3VRCPlayerApi.isVRCPlus, VRCRaycast (avatar), Mirror render-order fix
3.10.4VRCTween, Box-shaped Contacts, Global Avatar PhysBone Colliders, world VRCPhysBoneCollider Udon access, Data Container capacity APIs✅ Latest stable

Important: SDK versions below 3.9.0 are deprecated as of December 2, 2025. New world uploads are no longer possible with these versions.


Scene Setup

VRC_SceneDescriptor (Required)

Exactly one is required in every VRChat world.

[VRCWorld Prefab]
├── VRC_SceneDescriptor (Required)
├── VRC_PipelineManager (Auto-added)
├── VRCWorldSettings (Optional - movement speed settings)
└── AvatarScalingSettings (Optional - avatar scale limits)
All Properties
PropertyTypeDescriptionDefault
SpawnsTransform[]Array of spawn pointsDescriptor position
Spawn OrderenumFirst/Sequential/Random/Demo (First: always the first spawn; Demo: spawn point is the center of room scale)Sequential
Spawn OrientationenumDefault/Align Player With Spawn Point/Align Room With Spawn PointDefault
Respawn HeightfloatRespawn height (Y axis)-100
Object Behaviour At RespawnenumRespawn/DestroyRespawn
Reference CameraCameraPlayer camera settings referenceNone
Forbid User PortalsboolDisable user portalsfalse
Voice Falloff RangefloatVoice attenuation range-
Interact PassthroughLayerMaskInteract passthrough layersNothing
Maximum CapacityintMax player count (hard limit)-
Recommended CapacityintRecommended player count (UI)-
Reference Camera Usage
// Usage:
// 1. Adjust Near/Far clipping (recommended for VR: 0.01 ~ 1000)
// 2. Apply Post Processing effects
// 3. Set background color

// ⚠️ MUST disable the Camera component after configuring — an active Reference Camera
//    renders a second viewport. VRChat reads only the camera settings, not its output.
// Assign the configured (disabled) Camera to VRC_SceneDescriptor > Reference Camera.

Spawn Points Setup

// Spawn points are empty GameObjects assigned to VRC_SceneDescriptor > Spawns array.
// Players enter facing the Z+ direction of the spawn Transform.

// VRChat-specific requirements:
// - At least 2-3 spawn points (for simultaneous joins — single spawn causes overlap)
// - Place slightly above the floor (~0.1m) to avoid floor collision on spawn
// - Keep clear of obstacles (VR player guardian area is larger than their avatar)
// - Account for VR guardian boundaries — desktop player sizes differ from VR

Required Setup Checklist

□ Exactly one VRCWorld Prefab exists in the scene
□ At least one Transform set in Spawns
□ Respawn Height set to an appropriate value (well below the floor)
□ Reference Camera configured for clipping distances (for VR)
□ Layer/Collision Matrix correctly configured
□ "Setup Layers for VRChat" has been executed

Components

MANDATORY READ references/components.md (~800 lines) before configuring any VRC component below. Load in full — dependency requirements and Udon event hooks are distributed throughout. Do NOT Load: references/audio-video.md (unless the task involves audio/video components), references/lighting.md.

ComponentRequired ElementsPurposeSDK
VRC_SceneDescriptor-World settings (required)-
VRC_PickupCollider + RigidbodyGrabbable objects-
VRC_StationColliderSittable locations-
VRC_ObjectSyncRigidbodyAuto-sync Transform/physics-
VRC_MirrorReflection-Mirror (⚠️ high cost)-
VRC_PortalMarker-Portal to other worlds-
VRC_SpatialAudioSourceAudioSource3D audio-
VRC_UIShapeCanvas (World Space)Unity UI interaction-
VRC_AvatarPedestal-Avatar display/switch-
VRC_CameraDolly-Camera dolly3.9+
VRCCameraSettingsNone (static API)Read camera info from Udon3.8.1+

VRC_ObjectSync vs UdonSynced

ScenarioVRC_ObjectSyncUdonSynced variables
Throwable objects / physics✅ Recommended
State only / complex logic✅ Recommended

SDK 3.8.0+: Force Kinematic On Remote — Makes Rigidbody kinematic on non-owner clients, preventing unexpected physics behavior.


Layers & Collision

VRChat Reserved Layers

Layer #NamePurpose
0DefaultGeneral objects
9PlayerRemote players
10PlayerLocalLocal player
11EnvironmentEnvironment (walls, floors)
13PickupGrabbable objects
14PickupNoEnvironmentPickups that don't collide with environment
17WalkthroughWalk-through objects
18MirrorReflectionMirror reflection only
22-31User LayersAvailable for custom use

Layer Setup Steps

1. VRChat SDK > Show Control Panel
2. Builder tab
3. Click "Setup Layers for VRChat"
4. Collision Matrix is automatically configured

MANDATORY READ references/layers.md when setting up collision or debugging physics. The default Unity collision matrix differs from the VRChat-correct one — always verify. Do NOT Load: references/audio-video.md, references/upload.md.


Performance

Target FPS

PlatformFPS TargetMeasurement Point
PC VR45+ FPSSpawn point, 1 player
PC Desktop60+ FPSSpawn point, 1 player
Quest72 FPSSpawn point, 1 player

Critical Limits

ItemRecommendedReason
Mirrors1, default OFFRenders the entire scene 2x
Video players1-2 recommendedDecoding overhead; no documented hard limit
Realtime lights0-1Dynamic shadows are expensive
LightmapsRequiredPerformance foundation

Quest/Android Restrictions

ComponentPCQuest
Dynamic Bones❌ Disabled
Cloth❌ Disabled
Post-Processing❌ Disabled
Unity Constraints❌ Disabled
Realtime lights⚠️ Avoid

Performance Optimization Workflow

Bottleneck TypeKey IndicatorsReference
CPU-boundHigh script time, physics overheadperformance.md §Optimization-Workflow
GPU-boundDraw calls, overdraw, shader complexityperformance.md §Optimization-Workflow
MemoryVRAM usage, texture size, mesh countperformance.md §Optimization-Workflow

MANDATORY READ: Load performance.md before optimizing — measure first, then target the largest bottleneck — and references/lighting.md for Quest optimization. Do NOT Load: references/audio-video.md, references/upload.md.


Lighting

Baked Lighting (Required)

✅ Recommended settings:
├── Lightmapper: Progressive GPU
├── Lightmap Resolution: 10-20 texels/unit (PC) / 5-10 (Quest)
├── Light Mode: Baked or Mixed
└── Light Probes: Place along player paths

❌ Avoid:
├── Realtime lights (dynamic shadows)
├── High-resolution lightmaps (memory consumption)
└── Excessive Reflection Probes

MANDATORY READ references/lighting.md when configuring lightmaps or light probe placement. Do NOT Load: references/audio-video.md, references/upload.md, references/layers.md.


Audio & Video

VRC_SpatialAudioSource

Plan each world AudioSource with a VRC_SpatialAudioSource: a bare AudioSource triggers a VRChat SDK Build Panel warning. Add the companion deliberately, avoid Auto Fix as a blind default, and do not overwrite existing VRC_SpatialAudioSource values or tuned AudioSource curves unless requested.

PropertyDescriptionBaseline / safe-preserve note
GainVolume boost (0-24 dB)10 dB is common/default; use 0 dB for warning-only additions to preserve loudness
NearAttenuation start0m unless the sound needs an intentional near field
FarAttenuation endMatch existing maxDistance or the intended audible range; avoid blind default/Auto Fix ranges
Volumetric RadiusSource spread0m for point sources; set intentionally for wide sources
Enable Spatialization3D positioningfalse for intentional 2D/global audio; true for authored 3D audio

When preserving an existing AudioSource, keep volume, spatialBlend, rolloffMode, maxDistance, and custom curves; use Gain 0 dB; enable Use AudioSource Volume Curve for tuned 3D rolloff; match Far to the existing maxDistance or intended audible range; and keep Near at 0m unless an existing minDistance/Near value was intentionally authored.

Video Player Selection

FeatureAVProUnity Video
Live streaming
Editor preview
YouTube/Twitch
Quest support

MANDATORY READ references/audio-video.md for VRC_SpatialAudioSource or video player configuration. Optional: references/components.md when wiring audio/video components. Do NOT Load: references/lighting.md, references/performance.md.


World Upload

Upload Steps

1. Check Validation
   └── VRChat SDK > Build Panel > Validations

2. Build & Test (local testing)
   └── "Build & Test New Build"
   └── Supports multi-client testing

3. Upload
   └── "Build and Upload"
   └── Set Content Warnings
   └── Set Capacity

4. Publish settings
   └── Configure public/private on the VRChat website

Pre-Upload Checklist

□ VRC_SceneDescriptor × 1
□ Spawns configured
□ Respawn Height appropriate
□ Layer/Collision Matrix verified
□ Light baking complete
□ Mirror default OFF
□ 45+ FPS in VR
□ No Validation errors
□ Content Warnings set
□ Capacity set

MANDATORY READ references/upload.md before running Build & Upload. Verify all pre-upload checklist items first. MANDATORY READ references/build-validation.md when the user asks about SDK Build Panel validation, red/yellow/white warnings, Auto Fix, or a copied validation message. Do NOT Load: references/audio-video.md, references/lighting.md.


Troubleshooting

Quick Router

Identify the symptom category and jump to the reference section:

Symptom CategoryCommon CauseReference
Player walks through walls / floorLayer setup not run; geometry not on Environment (11)troubleshooting.md §Layer & Collision
Can't grab / Pickup not workingMissing Collider, Rigidbody, or VRC_Pickup componenttroubleshooting.md §Component
Object not syncing / snaps backMissing VRC_ObjectSync or ownership not transferredtroubleshooting.md §Networking
Can't sit / clips through StationMissing Collider; Station Enter Player Location needs adjustmenttroubleshooting.md §Component
Mirror not reflectingLayers mask missing Player/PlayerLocal/MirrorReflectiontroubleshooting.md §Component
Build / Upload failsMissing SceneDescriptor, script errors, layer warningstroubleshooting.md §Build
Performance issuesMirror ON, realtime lights, uncooked lightmapsperformance.md
Works in Editor but fails in VRChatEditor Play ≠ SDK runtime; use Build & Testtroubleshooting.md §Editor
UI visible but not clickableVRC_UIShape on Screen Space / Overlay Canvas (see NEVER #11)troubleshooting.md §Editor

MANDATORY READ references/troubleshooting.md when diagnosing any issue. Do NOT Load for non-troubleshooting tasks.


Related Skills

For C# scripting, network sync, and UdonSharp event implementation, use the unity-vrc-udon-sharp skill.


Templates (assets/templates/)

Starter templates for common SDK component patterns. Each template compiles without modification; adjust Inspector fields and extend the event stubs for your world.

TemplatePurpose
VRC_Pickup_Rigidbody.csVRC_Pickup with Rigidbody — OnPickup/OnDrop/OnPickupUseDown/OnPickupUseUp events, ownership transfer, audio feedback
VRC_Station_Basic.csVRC_Station controller — OnStationEntered/OnStationExited events, PlayerMobility, force-eject API

References

FileContentApprox. Lines
references/components.mdAll component details, component whitelist, Dynamics for Worlds, editor-only exclusion (EditorOnly tag / IEditorOnly)800+
references/layers.mdLayers & collision230+
references/performance.mdPerformance optimization700+
references/lighting.mdLighting settings400+
references/audio-video.mdAudio & video600+
references/build-validation.mdSDK 3.10.4 Build Panel red/yellow/white validation alert catalog, safe fixes, Auto Fix side effects180+
references/upload.mdUpload procedure300+
references/troubleshooting.mdTroubleshooting guide500+
CHEATSHEET.mdQuick reference200+