Guide
Diagnosing Godot RigidBody2D/3D That Won’t Move After Applying Force
Learn why a Godot RigidBody2D/3D ignores forces and how to diagnose mode, sleep, collision shape, scale, and custom integrators to restore movement.
Published by Tasadduq Burney
02 Jul 2025, 10:52 UTC
3 min120.9K views0

Recognizable Condition
You apply a force or impulse to a RigidBody2D or RigidBody3D node (e.g., apply_impulse(Vector2.ZERO, Vector2(100,0))) but the body remains stationary in the game window.
Cause/Diagnostic Table
| Possible Cause | What to Look For |
|---|---|
| Body mode set to Static or Kinematic | Forces are ignored; the body behaves like a fixed object. |
| Body is sleeping | Godot deactivates idle rigid bodies; forces have no effect until the body is woken. |
| Missing or disabled collision shape | Without a shape the physics engine cannot compute interactions, making impulses ineffective. |
| Custom physics integrator or Character mode | Alternative integration overrides default force handling. |
| Zero or near‑zero scale on the node | Extreme scale leads to infinite or NaN inertia, causing the engine to treat the body as immovable. |
Ordered Checks
- Verify the body's mode. In the inspector or via code, ensure
modeisRigid(value 0). If it is Static (1) or Kinematic (2), change it to Rigid. Note: Changing mode at runtime can affect existing joints; test in a copy of the scene first. - Check sleep state. Add a debug print in
_physics_process:print($RigidBody.mode, $RigidBody.is_sleeping()). If the second value istrue, the body is sleeping. Apply a small impulse or setwake_up()to see if it moves. - Confirm collision shape presence. Enable visible collision shapes (Project Settings → Physics → Common → Debug Shapes) or look at the node tree for a
CollisionShape2D/CollisionShape3Dchild. Ensure itsdisabledproperty isfalseand that the shape resource is not null. - Inspect scale. Look at the node’s
scaleproperty. If any axis is close to zero (e.g.,0.0001) or negative large values, reset toVector2.ONEorVector3.ONEand test again. - Look for custom integrators. Check if a script overrides
_integrate_forcesor if the body’scustom_integratorproperty is set. Temporarily disable the script or setcustom_integratortofalseto see if default force handling resumes.
Fixes Tied to Findings
- If mode was wrong: set
RigidBody.mode = RigidBody.MODE_RIGID. - If sleeping: call
RigidBody.wake_up()before applying force, or disable sleep for debugging viaRigidBody.set_sleeping(false)(remember to re‑enable later). - If missing shape: add a
CollisionShape2D/CollisionShape3Dchild, assign a shape resource (e.g.,RectangleShape2D), and ensuredisabledis false. - If scale issue: reset scale to
Vector2.ONEorVector3.ONE; avoid zero or extremely small values. - If custom integrator: remove or comment out
_integrate_forcesoverride, or setcustom_integratortofalsein inspector.
Escalation Criteria
If after completing the five checks the body still does not move:
- Verify that no other script is constantly resetting the body’s position or velocity (e.g., in
_processyou setposition = Vector2.ZERO). - Test the same impulse in a fresh, minimal scene containing only the RigidBody, a collision shape, and a static floor. If it works there, the issue lies in the original scene’s node hierarchy or settings.
- Consider enabling verbose physics debug output (Project Settings → Physics → Common → Verbose) to look for warnings about invalid inertia or NaN values.
- If the problem persists, report it as a potential engine bug, providing the Godot version, a minimal reproduction project, and the exact steps taken.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.