# Proper way to set a RigidBody's maximum velocity

I am trying to gradually accelerate a GameObject with a RigidBody attached until it reaches a maximum velocity, at which point it becomes unable to gain any more velocity.

• I know I can simply reset the object velocity to an arbitrary maximum velocity every frame if it overshoots, but I've repeteadly heard that manually setting an object's velocity is a very bad practice in the context of Unity's physics system.
• I am also aware that in a physical sense, objects don't have a "maximum velocity" and that such a thing will always be artificial.

I can think of several ways to achieve this, but given these limitations, I would like to know if there's a standard, optimum way to do this.

• "I've repeatedly heard that manually setting an object's velocity is a very bad practice" There's a lot of questionable Unity advice out there. ;) Setting the velocity isn't universally bad, you just need to be a bit careful about how you do it, to make sure it's not overriding some other behaviour you want, like a velocity effect from another script, or a collision response. If you only ever reduce the velocity while keeping its direction, it should be safe for most contexts. – DMGregory Jan 22 '18 at 0:01

What you want to do is not to set the max velocity, but void applying any additional force once you get to a certain speed. Something like the example below. Watch the if statement

public float force;
public float sqrMaxVelocity;

private Rigidbody rg;

void Start()
{
rg = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
if (Input.GetKey(KeyCode.UpArrow) && rg.velocity.sqrMagnitude < sqrMaxVelocity)
{

• Good, but I would instead check rg.velocity.sqrMagnitude < sqrMaxVelocity to avoid an unnecessary sqrt calculation – Ed Marty Jan 22 '18 at 16:30
• Check out this answer's AccelerateTo method for an example of how to accelerate up to a target speed without going all-or-nothing. You can gradually taper off your acceleration as you approach the limit so that you reach, but don't overshoot, your target. This can give a smoother resulting motion. – DMGregory Jan 22 '18 at 18:09