Quick answer: PhysX puts low-velocity Rigidbodies to sleep. Call rb.WakeUp() before applying forces to a body you know should be active, or set sleepThreshold = 0 to prevent sleep on specific bodies. Lower global threshold in Project Settings > Physics.
Here is how to fix Unity Rigidbody sleeping too early. You have a rigidbody resting on a platform. Another object lightly nudges it — nothing happens. You apply a small AddForce in code — still nothing. Increase the force tenfold and it finally responds. The rigidbody is asleep, and PhysX is ignoring small forces to save CPU. That is a performance feature that has annoyed game developers for fifteen years, and Unity’s exposure of it is not obvious.
The Symptom
A Rigidbody that has been stationary for a moment stops responding to:
- Small
AddForcecalls (below the impulse threshold) - Collisions with low-velocity objects
- OnTriggerEnter events from other sleeping bodies
- Gravity changes
Larger forces do wake it. Rigidbody.IsSleeping() returns true. Physics debug visualization shows the body in a “sleeping” state (greyed out).
What Causes This
PhysX sleep is a performance feature. Simulating thousands of resting rigidbodies every FixedUpdate wastes CPU. PhysX monitors velocity and angular velocity; when both stay below Sleep Threshold for a few frames, the body enters a sleep state and is skipped in subsequent simulations. A force large enough to cross the threshold wakes it.
Default Sleep Threshold. 0.005 is the default. This is actually conservative — bodies need very low velocity to sleep. Even so, stationary stacks and resting objects cross it quickly.
AutoSyncTransforms interactions. Setting a Rigidbody’s transform.position directly does not wake it unless Physics.autoSyncTransforms is on. If you teleport a sleeping body, it may stay in place in the physics simulation even though its GameObject moved.
Kinematic/Non-kinematic toggle. Switching isKinematic to true and back to false puts the body in a default state that may or may not wake, depending on Unity version. Calling WakeUp after the toggle ensures consistent behavior.
Continuous Collision Detection mode. Some CCD modes interact strangely with sleep — a body can sleep while CCD reports it should be checking for tunneling. Rarely the cause but worth knowing.
The Fix
Step 1: Wake before applying force. If you know the body should respond, wake it explicitly before applying force.
using UnityEngine;
public class Pusher : MonoBehaviour
{
[SerializeField] private Rigidbody target;
public void Push(Vector3 force)
{
if (target.IsSleeping())
target.WakeUp();
target.AddForce(force, ForceMode.Impulse);
}
}
WakeUp clears the sleep state immediately. Subsequent physics steps simulate the body normally and the force takes effect.
Step 2: Lower global sleep threshold. Project Settings > Physics > Sleep Threshold. Default 0.005. Lower values make sleep less aggressive. 0.002 is usually safe and eliminates many “why is this body not responding” bugs.
Do not lower to 0 globally — that disables sleep entirely and costs significant CPU on scenes with many rigidbodies. Only set 0 per-body where needed.
Step 3: Disable sleep on critical bodies. For player characters, vehicles, or objects that must respond instantly, disable sleep:
void Awake()
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.sleepThreshold = 0f; // never sleep
}
Always-awake bodies cost a tiny bit of CPU per frame but guarantee responsiveness. Reserve for bodies that actually need it.
Step 4: Force position changes with MovePosition. If you reposition a Rigidbody, use Rigidbody.MovePosition rather than setting transform.position. MovePosition is a physics-aware move that wakes the body and respects interpolation. Direct transform assignment bypasses physics and can leave the body confused.
rb.MovePosition(newPosition); // respects physics
rb.MoveRotation(newRotation); // respects physics
// vs this, which may not wake:
// transform.position = newPosition;
Trigger Detection With Sleeping Bodies
Triggers detect sleeping rigidbodies on entry (the trigger’s OnTriggerEnter fires), but the sleeping rigidbody’s own OnTriggerEnter may not. If you need the rigidbody side to respond, put the collider on the non-sleeping side — usually the detection trigger is on a moving entity that is not sleeping.
For rigidbody-to-rigidbody triggers where both might sleep, wake them on interaction or keep at least one side awake via sleepThreshold = 0.
Debugging
Add a HUD or gizmo showing sleep state of key bodies:
void OnDrawGizmos()
{
var rb = GetComponent<Rigidbody>();
if (rb == null) return;
Gizmos.color = rb.IsSleeping() ? Color.gray : Color.green;
Gizmos.DrawWireSphere(transform.position, 0.5f);
}
Visually confirm which bodies are awake vs sleeping during play. Unexpected gray spheres tell you which bodies are not simulating.
2D Note
Rigidbody2D has its own sleep system via Sleeping Mode per body: Never Sleep (always awake), Start Awake (default), Start Asleep (asleep until touched). Set per-body in Inspector. No global sleep threshold in 2D — PhysX 2D uses a per-body heuristic.
“Sleep exists to save your CPU. When it saves too much, call WakeUp. When it keeps waking things you want asleep, it is the right default — fix the caller.”
Related Issues
For jittery movement of awake rigidbodies, see Unity Physics Jittery Movement. For rigidbody falling through floors, Rigidbody Falling Through Floor covers related tunneling issues.
WakeUp before force. SleepThreshold=0 for always-on. Know your thresholds.