So I've recently discovered how to apply drag exactly the way Unity seems to be doing it. Sorry if this has been shown on the forums before but I've been trying to tackle this for a long time with no good solution. The first one I came across here http://www.leadwerks.com/werkspace/topic/4385-physics-how-does-unity-calculate-drag/ did not have the right solution. Code (csharp): dragForceMagnitude = velocity.magnitude ^ 2 * drag; dragForceVector = dragForceMagnitude * -velocity.normalized The result is that the object never stops. I've been doing some fiddling around with some of my old drag code which looked like Code (csharp): velocity -= velocity.normalized * drag * Time.deltaTime; if(x > 0) if(velocity.x < 0) velocity.x = 0; else if(x < 0) if(velocity.x > 0) velocity.x = 0; if(y > 0) if(velocity.y < 0) velocity.y = 0; else if(y < 0) if(velocity.y > 0) velocity.y = 0; if(z > 0) if(velocity.z < 0) velocity.z = 0; else if(z < 0) if(velocity.z > 0) velocity.z = 0; It works but when I compared it on an AnimationCurve to a rigidbody with the same mass, drag and velocity, mine would slow down at a constant/linear rate. The rigidbody would slow down at a curved rate. After all of my fiddling around, I came up with the solution! Code (csharp): velocity -= Vector3.ClampMagnitude(velocity, 1) * drag * Time.deltaTime; A full script example looks like THE ANSWER ~ Not anymore; Check Below Code (csharp): public class PhysicsObject : MonoBehaviour { public Vector3 velocity; public Vector3 force; public float mass = 1; public float drag; void FixedUpdate() { Vector3 acceleration = force / mass; velocity += acceleration * Time.deltaTime; //Apply acceleration velocity -= Vector3.ClampMagnitude(velocity, 1) * drag * Time.deltaTime; //Apply drag transform.Translate(velocity * Time.deltaTime, Space.World); //or //transform.Translate(velocity * Time.deltaTime + (.5f * acceleration * Time.deltaTime * Time.deltaTime), Space.World); force = Vector3.zero; } } Edit: Not sure why it doesn't work anymore but now I've found that you have to do Code (csharp): void FixedUpdate() { velocity -= velocity * drag * Time.delaTime; } Using ClampMagnitude doesn't seem to do the job anymore, not sure why it worked then but not now. Doing it this way does in fact work though. You can "move" the object with transform.Translate(velocity * Time.deltaTime) in either Update or FixedUpdate and it will move correctly.