Something always stops working mid-build. You can't grab it, it's pitch black, it's pink, it won't sync.
What eats time when you're stuck isn't the fixing. It's the time spent not knowing where to look.
This article is an index from symptom to cause. The fixes are handed off to their own articles. Use this as the entry point.
What You'll Learn
- Ten common symptoms and their candidate causes
- Three questions for narrowing things down
- Which article to read once you've narrowed it
Hands-On: Narrow it down with three questions
Before consulting the index, answer three questions. They cut the search space by more than half.

| Question | Yes means | No means |
|---|---|---|
| 1. Does it happen on your own screen? | A configuration or code problem | A synchronization problem |
| 2. Does it happen in Unity's Play mode? | A scene or code problem | A build or device problem |
| 3. Did it used to work? | Whatever you changed most recently | It's been wrong from the start |
Let's actually do it, with the symptom "pressing doesn't open the door."
Question 1: does it fail to open on your own screen?
If it only fails on your friend's screen, the door itself works. Look at the synchronization side.
If it fails on your screen too, synchronization is irrelevant. Reading the synchronization code here would be a waste of time.
Question 2: does it fail in Play mode?
Try pressing it in Unity's Play mode. Failing there means a scene or code problem.
Opens in Play mode but not inside VRChat. In that case, suspect the build settings or a platform limitation.
Question 3: did it open before?
If it opened yesterday, whatever you changed since is the cause. Retrace your steps in reverse.
If it has never opened, an assignment or setting has probably been missing from the start.
Check your answers
If the three answers are "fails on my screen, fails in Play mode, never worked," it's not synchronization — it's a missing setting.
Narrowed that far, working through pressing does nothing from the top usually hits.
Answering the questions decides which section to read. That's how to use this article.
Symptoms while building

You can't grab an object
- No Collider, or one that's too small. Even with VRC Pickup, there's nothing for a hand to hit
- No VRC Pickup, or Pickupable is off. A Rigidbody alone isn't grabbable
- Is Trigger is on. It's set to pass through
→ building holdable objects with Pickup
The room is pitch black, or dark even after baking
- The light itself isn't working. No Directional Light, Intensity at
0, or a black color - It isn't a bake target. Floors and walls aren't set to Contribute GI, or you've never baked
- Not enough ambient light. A dark Skybox, or a low Intensity Multiplier
→ baking lights / sky and fog set the mood
A material turns pink
- The shader isn't installed. The package for the shader in use isn't imported
- A different rendering setup. You're using a URP or HDRP shader
- It's unavailable on that device. You're opening a PC shader in the Android build
→ materials and textures / supporting Quest and phones
You fall through the floor
- The floor has no Collider. Common when you delete the Plane and build your own
- Is Trigger is on. It's set not to collide
- The spawn point is buried in the floor. Move it slightly up
→ collision basics / recovering from falls
It's heavy and stutters
- You haven't measured what's heavy. Rendering, processing, size, and synchronization have different fixes
- Transparency covers the screen. Particles or large transparent panels
- Physics isn't going to sleep. Props you placed keep jittering
→ measuring performance / reducing physics load
Symptoms when nothing works
Pressing a button does nothing
- No Collider. Happens when you attach a script to an empty object
- No Udon Behaviour assigned. Program Source is empty
- It's stopping at an
ifyou wrote. The condition isn't met
→ fixing it when nothing works
It works on your screen but not on theirs
- You haven't taken ownership. Writing a synced variable doesn't send it. And there's no error
- The sync mode is
None, or you aren't callingRequestSerialization() - You're driving it with local logic only. You're just touching the Animator directly
→ understanding ownership / networking basics
Only late joiners have a different state
- You aren't applying state in
Start(). The logic that renders the received value is missing - You're conveying it with network events alone. Events don't reach people who arrive later
- You're sending only the change, not the value. The current state has to live in a variable
→ network events / a synchronized door
Different people get different results
- Each person is rolling their own random number. Have one person roll and distribute the result
- You're relying on each machine's physics. Rolling behavior differs by device
- You're measuring time on each computer. Use server time
You can't hear the sound
- Play On Awake is off, or the playback logic never gets called
- Spatial Blend is 3D and you're too far away
- VRC Spatial Audio Source's reach is set too short
Symptoms around publishing
You can't upload
- There are red errors in the Console. Without a successful compile, you can't upload
- Something required is missing. No
VRCWorld, or no spawn point configured - The size exceeds the limit. Shrink your textures
→ uploading a world / measuring performance
You can't enter the uploaded world, or loading never finishes
- The size is too large. Loading is taking a long time
- An old build is still there. Upload again
- There's no build for that device. Without a Quest build, you can't enter from Quest
It looks different on Quest, or you can't enter
- You haven't uploaded the Android build. It needs uploading for Android under the same Blueprint ID
- Realtime lights remain. Without baking, it goes pitch black
- You're using unsupported shaders. They turn pink or get replaced
You updated it and nothing changed
- People already inside don't get the update. Re-entering gives them the new version
- The Blueprint ID changed. It uploaded as a different world
- You forgot to build. Saving alone doesn't publish anything
→ growing a world after release
Bonus: Good to Know Up Front
- Work top to bottom: Each symptom's causes are ordered by frequency. The first one or two usually hit
- Try one at a time: Fixing three places at once leaves you unsure which helped. Change one, confirm, move on
- Errors are welcome: Failing silently is more trouble. Anything in the Console is a lead
- When it isn't listed, check the entrance: Put one log line at the top of the routine and see whether it gets there. Not reaching means configuration; reaching means the code
- Note anything you hit twice: The things you personally trip over are consistent. Writing down three of them makes the next fix faster
Summary
When you're stuck, narrow the search space first.
- Does it happen on your own screen? No means synchronization
- Does it happen in Play mode? No means the build or the device
- Did it used to work? Yes means whatever you changed most recently
- Once narrowed, work through this article's matching section from the top
The first question is: "Is this a synchronization problem or not?" Splitting that alone halves how much code you read.
To learn the chasing technique itself, go to fixing it when nothing works. To find what's heavy, go to measuring performance.