3

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.

flatterino
  • 187
  • 1
  • 1
  • 5
  • 3
    "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 00:01

1 Answers1

3

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)
    {
        rg.AddRelativeForce(Vector3.up * force ,ForceMode.Force);
    }

}
Fabio S.
  • 465
  • 2
  • 9