Unity AddForce Not Working? Why Your Rigidbody Won’t Move

Illustration: a crate with a force arrow pushing it but frozen with a lock icon

You call rb.AddForce(Vector3.up * 10) and nothing happens. Or the object barely twitches. Or it works in one scene and not another. Unity AddForce not working is one of the most common physics questions, and the cause is almost always one of a handful of things: the wrong ForceMode, a force too small for the mass, a kinematic body, constraints, or something resetting velocity every frame. This guide walks through each cause with the fix.

Quick Checklist

  1. Is the code actually running? Add a Debug.Log next to AddForce.
  2. Is it a one-off push? Use ForceMode.Impulse.
  3. Is Is Kinematic off and are the relevant Constraints unchecked?
  4. Does another script set linearVelocity every frame?
  5. Is the force big enough for the mass?
  6. Do you have a Rigidbody (3D) with a 3D AddForce, or a Rigidbody2D with the 2D one?

If the log doesn’t print, the problem isn’t physics. See the script not running guide.

ForceMode: the Most Common Cause

AddForce defaults to ForceMode.Force, which is meant to be applied continuously every physics step. Its effect in one step is force × fixedDeltaTime ÷ mass. With the default fixed timestep of 0.02 seconds, AddForce(Vector3.up * 10) once on a 1 kg body changes velocity by just 0.2 m/s. Gravity cancels that almost immediately, so it looks like nothing happened.

ForceMode Uses mass? Uses time? Use for
Force Yes Yes Continuous push (engine thrust, wind), every FixedUpdate
Acceleration No Yes Continuous push that ignores mass
Impulse Yes No One-off hit: jump, explosion, knockback
VelocityChange No No One-off velocity change that ignores mass

For a jump:

rb.AddForce(Vector3.up * jumpStrength, ForceMode.Impulse);

With Impulse, a strength of 5 on a 1 kg body adds 5 m/s, which is a visible hop. Use VelocityChange if you want the same jump height regardless of mass. The CharacterController vs Rigidbody guide covers when to use physics forces at all.

Force Too Small for the Mass

With Force and Impulse, the effect is divided by mass. A car with mass 1500 needs 1500 times the force of a 1 kg ball for the same result. If you increased the mass for “realism”, scale your forces up or use the mass-independent modes. Check the Rigidbody’s Mass field before assuming the code is broken.

Kinematic Bodies and Constraints

  • Is Kinematic: kinematic bodies ignore forces entirely. They’re moved by MovePosition or the transform. Turn it off if you want physics to move the object.
  • Constraints: Freeze Position Y stops vertical forces. Freeze Rotation stops torque. Check the Rigidbody’s Constraints foldout.
  • Wrong Rigidbody: GetComponent<Rigidbody>() on the wrong object (a child, or a parent without one) returns a different body or null. Log rb.name.

Velocity Overwritten Every Frame

This is the sneaky one. A movement script does:

void FixedUpdate()
{
    rb.linearVelocity = new Vector3(input.x * speed, 0f, input.y * speed);
}

The Y velocity is forced to 0 every step, so any jump or knockback force is erased instantly. Keep the axes you aren’t controlling:

void FixedUpdate()
{
    Vector3 v = rb.linearVelocity;
    v.x = input.x * speed;
    v.z = input.y * speed;
    rb.linearVelocity = v; // Y (gravity, jumps) untouched
}

For knockback, also pause the horizontal override briefly, or the movement script cancels the push sideways. The knockback guide shows a clean way to do that. Note that in Unity 6, the property is linearVelocity; the old velocity name is obsolete.

AddForce in Update vs FixedUpdate

  • Continuous forces (Force, Acceleration) belong in FixedUpdate. In Update they’re applied a frame-rate-dependent number of times, so thrust changes with FPS.
  • One-off impulses can be triggered from Update (where input is read), because they’re applied once regardless. Many people still set a flag in Update and apply in FixedUpdate for consistency.

Reading wasPressedThisFrame inside FixedUpdate can miss presses, because FixedUpdate doesn’t run every frame. Read input in Update. The Rigidbody jitter guide explains why.

Damping, Friction and Sleeping

  • Linear Damping (formerly Drag) high values kill movement quickly. A value of 10 makes forces feel like moving through syrup.
  • Friction: a heavy object pushed sideways along the ground loses momentum to friction. Use a Physics Material with lower friction, or more force.
  • Sleeping: AddForce wakes a sleeping body automatically, so this is rarely the cause, but setting the transform directly doesn’t. If a body ignores collisions after being teleported, call rb.WakeUp().

Rigidbody2D Differences

2D physics uses Rigidbody2D.AddForce(Vector2, ForceMode2D), which only has Force and Impulse. Body Type Kinematic or Static ignores forces; it must be Dynamic. Gravity Scale and Linear Damping play the same roles as in 3D. Calling the 3D AddForce on a 2D object won’t compile against Rigidbody2D, but a missing 3D Rigidbody on a 2D object returns null silently.

📚 Understand game physics

A little physics knowledge goes a long way with forces and ForceModes. Our list of programming and game design books includes approachable picks.

Troubleshooting

Jump does nothing

The default ForceMode.Force is too weak for a single call. Use ForceMode.Impulse.

Jump works but is cut off instantly

Another script sets linearVelocity with Y = 0 each frame. Preserve the Y component.

Object flies off at huge speed

ForceMode.Impulse is being applied every frame. Apply impulses once per event.

Force works on one object but not another

Different mass, damping or constraints. Compare the two Rigidbody components.

NullReferenceException on rb

The Rigidbody is on a different object or missing. Use RequireComponent and get it in Awake.

FAQ

Should I use AddForce or set linearVelocity?

Setting velocity gives precise character control. AddForce is better for physical effects like explosions and thrust. Many games combine both.

Why does my object slide forever?

No damping or friction. Increase Linear Damping or use a physics material with friction.

What’s AddRelativeForce?

AddForce in the object’s local space, so “forward” follows its rotation.

Why does AddForce on a child do nothing?

The child has no Rigidbody of its own; forces must go to the Rigidbody, usually on the parent.

Does Time.timeScale affect forces?

Yes. At timeScale 0, physics doesn’t step, so nothing moves.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *