Quick answer: The most common cause is that isKinematic is enabled on the Rigidbody, which makes it ignore all physics forces.
Here is how to fix Unity addforce not working rigidbody. You write rb.AddForce(Vector3.up * 500f), hit Play, and your object sits there motionless. No error, no warning, no movement. The Rigidbody component is on the GameObject, gravity is pulling it down, but your force has absolutely no effect. This is one of the most frustrating Unity physics issues because everything looks correct on the surface. The problem is almost always a configuration mismatch between what AddForce expects and what the Rigidbody is set up to do.
The Symptom
You have a GameObject with a Rigidbody (or Rigidbody2D) component. You call AddForce() in a script, expecting the object to move, launch upward, or accelerate in a direction. But nothing happens. The object either remains stationary, or it moves under gravity but completely ignores your force calls.
You might verify this by logging the velocity after applying force and seeing that it remains (0, 0, 0), or by increasing the force magnitude to absurd values like 100,000 and still seeing no movement. In some cases, the object moves erratically — sometimes responding to force, sometimes not — which points to a timing issue rather than a configuration one.
The problem occurs with all AddForce variants: AddForce(), AddRelativeForce(), AddForceAtPosition(), and AddTorque(). If one does not work, none of them will, because the root cause is the same.
What Causes This
There are six common causes, and they often combine:
1. isKinematic is enabled. This is the most frequent cause. When isKinematic is true, the Rigidbody is controlled entirely by scripts and animation — it ignores all forces, gravity, and collisions from the physics engine. This property is useful for platforms or objects you want to move manually, but it completely blocks AddForce. There are no warnings when you call AddForce on a kinematic body; it just silently does nothing.
2. Calling AddForce in Update instead of FixedUpdate. Unity's physics simulation runs at a fixed timestep (default: 0.02 seconds, or 50 Hz). Update() runs once per frame at a variable rate. If you call AddForce in Update, the force may be applied multiple times between physics steps when the frame rate is high, or skipped entirely when the frame rate drops below the physics rate. The result is inconsistent movement or forces that seem to have no effect because they are applied outside the physics step window.
3. Wrong ForceMode. ForceMode.Force (the default) applies a continuous force that takes mass into account and is scaled by Time.fixedDeltaTime internally. If your Rigidbody has a mass of 100 and you apply a force of 10, the resulting acceleration is only 0.1 m/s². For a one-time action like a jump, you likely want ForceMode.Impulse or ForceMode.VelocityChange, which apply the full force immediately.
4. Drag is too high. The Rigidbody's Drag property applies a dampening force proportional to velocity. A drag value of 10 or higher can counteract moderate forces almost instantly, making it look like AddForce does nothing. The object accelerates for a fraction of a second and then the drag brings it back to rest before you can see any movement.
5. Mass is too high relative to force magnitude. With ForceMode.Force and ForceMode.Impulse, mass directly reduces the resulting acceleration (F = ma, so a = F/m). A Rigidbody with mass = 1000 and a force of 10 barely moves. This is physically correct but surprises developers who use arbitrary mass values.
6. Constraints are locking movement axes. Rigidbody constraints can freeze position on X, Y, or Z axes. If you freeze the Y position and then call AddForce(Vector3.up * 500f), the constraint prevents all Y movement. The force is applied internally but the constraint immediately zeroes out velocity on that axis.
The Fix
Step 1: Disable isKinematic and check constraints. Select your Rigidbody in the Inspector. Uncheck Is Kinematic. Then expand the Constraints section and verify that the axes you want to move along are not frozen.
using UnityEngine;
public class RigidbodyDiagnostic : MonoBehaviour
{
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
if (rb == null)
{
Debug.LogError("No Rigidbody component found!");
return;
}
// Check all the common blockers
Debug.Log($"isKinematic: {rb.isKinematic}");
Debug.Log($"Mass: {rb.mass}");
Debug.Log($"Drag: {rb.linearDamping}");
Debug.Log($"Constraints: {rb.constraints}");
Debug.Log($"Use Gravity: {rb.useGravity}");
if (rb.isKinematic)
{
Debug.LogWarning("isKinematic is TRUE - AddForce will have no effect!");
// Disable kinematic to allow physics forces
rb.isKinematic = false;
}
// Check for constraints blocking intended movement
if ((rb.constraints & RigidbodyConstraints.FreezePositionY) != 0)
{
Debug.LogWarning("Y position is frozen - vertical forces will be ignored!");
}
}
}
If you need the object to be kinematic sometimes (e.g., during cutscenes) and dynamic at other times, toggle isKinematic at the right moments rather than leaving it permanently on.
Step 2: Move force application to FixedUpdate and use the correct ForceMode. Physics forces must be applied in FixedUpdate() to synchronize with the physics simulation. Read input in Update() but apply forces in FixedUpdate().
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float moveForce = 10f;
[SerializeField] private float jumpImpulse = 7f;
private Rigidbody rb;
private Vector3 moveDirection;
private bool jumpRequested;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
// Read input in Update (runs every frame)
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
moveDirection = new Vector3(h, 0f, v).normalized;
if (Input.GetButtonDown("Jump"))
{
jumpRequested = true;
}
}
void FixedUpdate()
{
// Apply continuous movement force (ForceMode.Force)
// This is mass-dependent and scales with fixedDeltaTime
rb.AddForce(moveDirection * moveForce, ForceMode.Force);
// Apply one-time jump impulse (ForceMode.Impulse)
// This applies the full force instantly, accounting for mass
if (jumpRequested)
{
rb.AddForce(Vector3.up * jumpImpulse, ForceMode.Impulse);
jumpRequested = false;
}
}
}
Here is how the four ForceModes differ in practice. For a Rigidbody with mass = 2 and a force vector of (0, 10, 0):
- ForceMode.Force: Acceleration = 10 / 2 = 5 m/s² per fixed step. Slow, continuous push.
- ForceMode.Acceleration: Acceleration = 10 m/s² per fixed step (mass ignored). Consistent acceleration regardless of mass.
- ForceMode.Impulse: Instant velocity change = 10 / 2 = 5 m/s. One-time kick, mass-dependent.
- ForceMode.VelocityChange: Instant velocity change = 10 m/s (mass ignored). Consistent jump height regardless of mass.
Step 3: Balance mass, drag, and force magnitude. If forces are being applied but movement is imperceptible, the problem is usually the ratio between force magnitude and the object's mass and drag.
using UnityEngine;
public class PhysicsBalancer : MonoBehaviour
{
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// Recommended starting values for a player character
rb.mass = 1f; // Keep mass at 1 for predictable force behavior
rb.linearDamping = 0f; // Zero drag unless you specifically need dampening
rb.angularDamping = 0.05f;
rb.useGravity = true;
rb.isKinematic = false;
rb.interpolation = RigidbodyInterpolation.Interpolate;
}
void FixedUpdate()
{
// With mass=1 and drag=0, these force values give clear results:
// ForceMode.Force with magnitude 10 = 10 m/s^2 acceleration
// ForceMode.Impulse with magnitude 5 = instant 5 m/s velocity
// Debug: Log velocity to verify forces are working
Debug.Log($"Velocity: {rb.linearVelocity}, Speed: {rb.linearVelocity.magnitude:F2}");
}
}
A good rule of thumb: start with mass = 1, drag = 0, and a force of 10 using ForceMode.Force. You should see clear acceleration. If that works, gradually adjust mass and drag to achieve the feel you want. If even that does not produce movement, the issue is isKinematic, constraints, or your code is not being called at all (check with a Debug.Log inside FixedUpdate).
"If AddForce does nothing and you have already checked isKinematic, put a Debug.Log right before the AddForce call. If it does not print, your code path is not executing — the problem is not physics at all."
Related Issues
If you are using the New Input System and forces are not applying because input is not being read, see New Input System Not Detecting Input for action map and PlayerInput configuration. If your async code for loading physics scenes causes the main thread to freeze, check Async Await Freezing the Main Thread for proper task handling patterns in Unity.
isKinematic = true silently eats all your forces. Check it first.