You lined up props in your room. A cup on the table, a ball on the floor, an ornament on the shelf. All of them throwable.
It looks good and somehow runs heavy. Nobody is touching anything, nothing is moving, and the frame rate won't climb.
Calculation keeps running on things that have finished rolling. This article covers two ways to stop it.
What You'll Learn
- The mechanism that puts stopped objects to sleep
- What keeps them awake, and how to eliminate it
- Cutting collision pairs with layers
- Why to avoid Mesh Colliders
Start from having read collision basics and measuring performance.
Stopped objects are still being calculated
Anything with a Rigidbody gets "where does it move next" calculated every step. After it falls to the floor and stops, that calculation continues if left alone.
Sleep is the mechanism for that.

When motion stays very small for a while, Unity puts the object to sleep. While asleep, almost no calculation happens. Anything hitting it or applying force wakes it automatically.
Done right, every prop that's just sitting there sleeps. Twenty of them cost almost nothing while nothing moves.
The problem is the ones mixed in that don't sleep. The causes narrow down to three.
| Cause | What's happening |
|---|---|
| Sitting on a slight slope | Sliding imperceptibly, continuously |
| Colliders slightly overlapping | Pushed apart repeatedly, jittering |
| A script touching it every frame | Being moved, so it never meets the sleep condition |
We'll build a way to tell later. First, develop the instinct to ask whether a placed object is asleep. Just knowing to check changes physics load dramatically.
Cut what they collide with
The other approach is cutting the pairings.
Physics checks "which of these hits which" across all combinations. As the count rises, the combinations grow sharply.

Layers are the tool here. You tag objects and decide "this tag and that tag don't collide."
Do decorative cups need to collide with each other? Does a sign on the wall need to collide with a ball on the floor? Most decorations only need to collide with the floor.
Configure it in "Edit → Project Settings → Physics" under Layer Collision Matrix. A grid of checkboxes decides which combinations get checked.
One caution: don't change settings for layers VRChat uses.
| Layer | Safe to touch? |
|---|---|
Player, PlayerLocal, Pickup, Walkthrough, MirrorReflection, and friends | Don't touch |
| Free slots from index 22 onward | Use freely |
Combinations among layers you created can be cut and reconnected safely.
Hands-On: Lighten a room full of props
In a room with props lined up, confirm they're asleep and cut the pairings with layers.
1. Line up props and measure
Place about twenty Spheres in a scene with a floor. Add a Rigidbody to each and offset them slightly from around (0, 1.2, 0).
Press Play and wait for them all to settle. Then open the Profiler and note the thickness of the Physics-related band. You don't need to read the numbers precisely — remembering the thickness is enough.
2. See whether they're asleep
You can't tell by looking. Build a tool to check.

Place a World Space Canvas and TextMeshPro named SleepText, and create SleepWatcher in Assets/Scripts.
using UdonSharp;
using UnityEngine;
using TMPro;
// For checking. Remove it once you're done
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class SleepWatcher : UdonSharpBehaviour
{
[SerializeField] private Rigidbody[] targets;
[SerializeField] private TextMeshProUGUI display;
private void Update()
{
int awake = 0;
for (int i = 0; i < targets.Length; i++)
{
if (targets[i] != null && !targets[i].IsSleeping()) awake++;
}
if (display != null)
{
display.text = "Awake: " + awake + " / " + targets.Length;
}
}
}
Drag all twenty Rigidbodies into Targets at once. Multi-select in the Hierarchy and drop them into the field.
Press Play and wait a while.
| Display | Meaning |
|---|---|
Awake: 0 / 20 | All asleep. Ideal |
Awake: 3 / 20 | Three can't sleep. Find the cause |
That's the most important number in this article. If the count won't drop while everything looks settled, something is jittering.
This script uses
Update(). That's fine for a measuring tool, and remove it once you're done checking. It costs performance itself.
3. Fix what won't sleep
If the count doesn't reach zero, work down this list.
- Check the floor is level → See that all Rotations are
0. Even a slight tilt keeps things sliding - Resolve overlaps → Check in the Scene view whether objects intersect each other or the floor. Lift and reseat them slightly
- Remove scripts touching them → Look for logic writing position or velocity every frame
After fixing, Play again and confirm Awake: 0 / 20.
4. Cut the pairings with layers
From "Layer" at the top right of the Inspector, choose "Add Layer..." and type WorldProps into a free row from index 22 onward.
Select all twenty props and set Layer to WorldProps. If asked whether to change children too, say yes.
Open "Edit → Project Settings → Physics" and set the Layer Collision Matrix like this.
| Combination | Checked |
|---|---|
WorldProps × Default (the floor) | On |
WorldProps × WorldProps | Off |
The props no longer collide with each other. They still land on the floor and pass through one another.
5. Measure again
Play again and look at the Profiler band.
| Field | Before | After |
|---|---|---|
| Awake Rigidbodies | ||
| Thickness of the Physics band |
Whether props passing through each other is acceptable depends on the world. For decorations it's fine. For things you stack and play with, this setting isn't usable.
Lightness and feel trade off. Which you take is decided by what the object is there for.
Common Pitfalls
- The asleep count won't rise → Check floor tilt and overlaps between objects. Those two cover most cases
- Once touched it stays awake → It's still moving imperceptibly. Look at friction settings, or reposition it
- Changing layers made things ungrabbable → You changed a Pickup-related layer. Leave grabbable objects as they were
- Players started passing through things → You changed settings on a layer VRChat uses. Put them back
- Props fall through the floor → They're falling too fast. Lower the drop height, or thicken the floor's collider
- The checking display is heavy → Remove
SleepWatcher. Its job is done
Bonus: Good to Know Up Front
- Mesh Colliders are heavy: They build collision matching the visible complex shape, so calculation grows. Attaching one to a moving object requires Convex, which caps the triangle count. Consider whether boxes, spheres, and capsules can substitute first
- Don't put Rigidbodies on decorations: Static things need only a Collider. A Rigidbody added "in case I move it someday" often just stays there
- Rethink the design past triple digits: A few dozen is covered by sleep alone. Beyond that, reconsidering whether all of them need to move is faster
- Don't touch Fixed Timestep: Changing the physics step interval changes overall behavior. Leaving it alone is safest
- Leave Continuous Collision Detection at the default: It prevents fast-moving objects tunneling through, and adds calculation. Don't change it unless you have the problem
Summary
Lightening physics is two subtractions.
- Let stopped objects sleep. Count with
IsSleeping()to confirm - What keeps them awake is tilt, overlap, or per-frame manipulation
- Cut collision pairings with layers. Don't touch VRChat's layers
- Avoid Mesh Colliders. Don't put Rigidbodies on decorations
The question to ask before placing something is: "Does this need to move?" If no, it doesn't need a Rigidbody.
To lighten the mechanisms, go to making Udon lighter. For the visual side, go to making rendering lighter.