Unity Physics Not Working - Rigidbody and Collider Fix (Solved)

Problem: Objects with a Rigidbody don't move, don't fall with gravity, fall through the floor, or collisions don't register. You may see objects passing through each other, no physics response, or inconsistent behavior in Play mode.

Root Cause: Unity physics can "not work" for several reasons: Rigidbody is set to Kinematic, colliders are on the wrong layers, the object is static when it should be dynamic, Fixed Timestep is wrong, or there is no Collider on the other object. Most cases are configuration issues rather than engine bugs.

This guide walks you through the most common fixes so you can get Rigidbody and Collider behavior working again.

Quick Fix Checklist

Before diving into steps, verify:

  1. The moving object has a Rigidbody (or Rigidbody2D for 2D).
  2. The Rigidbody is not set to Is Kinematic unless you move it by script.
  3. Both objects involved in a collision have a Collider (Box, Sphere, Capsule, or Mesh).
  4. At least one object has a Rigidbody for a collision to be reported (the other can be static with only a Collider).
  5. Physics layers are set so the two layers can collide (Edit > Project Settings > Physics / Physics 2D > Layer Collision Matrix).

If any of these are wrong, fix them first and retest.

Solution 1: Rigidbody Not Moving or Not Falling

Symptom: Object has a Rigidbody but doesn't fall or respond to gravity.

Step 1: Check Rigidbody body type

  • Select the GameObject with the Rigidbody.
  • In the Inspector, ensure Body Type is Dynamic (not Kinematic or Static).
  • If Is Kinematic is checked, uncheck it so physics can move the object.

Step 2: Check constraints

  • In the Rigidbody component, expand Constraints.
  • If Freeze Position Y is checked (or X/Z for 2D), the object won't move on that axis. Unfreeze the axes you want to move.

Step 3: Check gravity scale (2D)

  • For Rigidbody2D, ensure Gravity Scale is not 0 unless you are applying custom gravity in code.

Verification: Enter Play mode; the object should fall or respond to forces. If you add a force in code, ensure you use Rigidbody.AddForce() and that the Rigidbody is not Kinematic.

Pro tip: If you move a Rigidbody in code every frame with Transform.position, physics may not run as expected. Prefer Rigidbody.MovePosition() or applying forces/velocity so the physics engine stays in control.

Solution 2: Objects Falling Through the Floor

Symptom: Objects pass through the floor or other colliders.

Step 1: Ensure the floor has a Collider

  • The floor (or any object that should stop others) must have a Collider component (Box Collider, Mesh Collider, etc.). A floor with only a visual mesh and no Collider is not solid to physics.

Step 2: Check collider size and position

  • Select the floor and look at the Collider in the Scene view. The green wireframe must cover the visible mesh. If the collider is too small, offset, or on the wrong GameObject, objects will pass through. Resize or add a collider that matches the floor.

Step 3: Check layer collision matrix

  • Go to Edit > Project Settings > Physics (or Physics 2D).
  • Open Layer Collision Matrix and ensure the layer of your moving object and the layer of the floor can collide (checkbox enabled). If they don't collide, they will pass through each other.

Step 4: Avoid extreme speed

  • Very fast-moving objects can pass through thin colliders in a single frame (tunneling). Use Rigidbody > Collision Detection set to Continuous (or Continuous Dynamic) for fast objects, or thicken the collider.

Verification: Run the scene; the object should land and rest on the floor without falling through.

Solution 3: Collisions Not Detecting (OnCollisionEnter Not Firing)

Symptom: You have OnCollisionEnter (or 2D equivalent) but it never runs.

Step 1: Confirm both sides have colliders

  • Both GameObjects must have a Collider. At least one must have a Rigidbody (dynamic or kinematic). If one side is missing a collider or both are triggers, OnCollisionEnter won't run.

Step 2: Check "Is Trigger"

  • If Is Trigger is checked on a collider, it will use OnTriggerEnter instead of OnCollisionEnter. Uncheck Is Trigger if you want physical collision and OnCollisionEnter.

Step 3: Script on the right object

  • The script that implements OnCollisionEnter must be on a GameObject that has a Rigidbody or a Collider. Usually you put it on the object that has the Rigidbody (the moving object).

Step 4: Layer collision matrix

  • As above, the two layers must be able to collide in the Layer Collision Matrix. If they don't collide, no collision event is sent.

Verification: Add a simple Debug.Log("Collision!"); inside OnCollisionEnter and run the scene. You should see the log when the objects touch.

Solution 4: Physics Inconsistent or Jittery

Symptom: Physics works sometimes, or objects jitter and behave oddly.

Step 1: Use Fixed Timestep for physics

  • Physics runs in Fixed Update. Move Rigidbodies and apply forces in FixedUpdate(), not in Update(). If you use Update() with variable delta time, physics can be inconsistent.

Step 2: Check Fixed Timestep

  • Go to Edit > Project Settings > Time.
  • Fixed Timestep is usually 0.02 (50 fixed updates per second). If it is too large, physics can be choppy or objects can tunnel. Don't set it too low or you'll hurt performance.

Step 3: Avoid moving static colliders at runtime

  • Moving a Collider that has no Rigidbody (or is static) at runtime can cause unstable collisions. For moving platforms, use a Kinematic Rigidbody and move it in FixedUpdate() with Rigidbody.MovePosition().

Verification: Run the scene multiple times; behavior should be consistent. No random falling through or big jitters.

Solution 5: 2D vs 3D Physics Mix-Up

Symptom: You added a Rigidbody and Collider but nothing happens.

  • In 2D games you must use Rigidbody2D and Collider2D (BoxCollider2D, CircleCollider2D, etc.). 3D Rigidbody and 3D Colliders don't interact with 2D physics.
  • In 3D games use Rigidbody and 3D Colliders. Don't mix 2D and 3D physics on the same object.

Verification: Confirm every physics object uses either all 2D or all 3D components, and that the correct physics system (Physics 2D vs Physics) is used in Project Settings.

Prevention Tips

  • Use layers for different types of objects (player, enemy, projectile, ground) and set the Layer Collision Matrix once so only the right things collide.
  • Prefer Continuous Collision Detection for fast-moving objects to avoid tunneling.
  • Keep colliders simple when possible (boxes, capsules) for better performance; use Mesh Colliders only where needed.
  • Document your physics setup in a short comment or doc so other developers (or future you) don't accidentally break it.

Related Problems and Links

Bookmark this fix for quick reference when Rigidbody or Collider issues come up again. If this article helped you, share it with other Unity developers who hit the same wall.