Car Accelerate Over Time. (JavaScript and RigidBody)

Hello. This is my first post so please be gentle.
I am working with Unity’s Car Tutorialand trying to make the car accelerate by itself. I disabled the throttle and break functions in Car.js so the player can only steer left or right. My problem is creating a function that will make the car accelerate until it reaches the maxSpeed. Currently, the car will slowly move forward and at the same speed. I am also unsure if I need to call the function in Update() or FixedUpdate(). Any help will be greatly appreciated.

var curSpeed : float = 0.0; // holds current speed value
var acc : float = 10.0; // rate car accelerates at
var maxSpeed : float = 160.0; // max speed the car can go

function FixedUpdate()
{	
	// The rigidbody velocity is always given in world space, but in order to work in local space of the car model we need to transform it first.
	var relativeVelocity : Vector3 = transform.InverseTransformDirection(rigidbody.velocity);
	
	CalculateState();	
	
	UpdateFriction(relativeVelocity);
	
	UpdateDrag(relativeVelocity);
        
        ApplyAcceleration(relativeVelocity);
	
	ApplySteering(canSteer, relativeVelocity);
}

function ApplyAcceleration(relativeVelocity)
{
    curSpeed += acc;
    curSpeed = Mathf.Clamp(curSpeed,-maxSpeed,maxSpeed); // Clamps curSpeed
    rigidbody.AddForce(transform.forward * curSpeed * Time.deltaTime);
}

2 Answers

2

Thanks for your help. That link explained the Update/FixedUpdate much better then my teacher. Also, that if statement seems obvious now.

But my car still doesn’t accelerate the way I want it too. My function uses three; variables; speed, topSpeed, and accRate.

I want the car to start at a speed of 0 and begin to accelerate at accRate until it reaches topSpeed. Right now my function looks like this:

function ApplyAcceleration(relativeVelocity)
{
    if (speed < maxSpeed) 
    {
        speed += accRate;
        speed = Mathf.Clamp(speed,maxSpeed,Time.timeDelta); // Clamps current Speed
       
    }
    rigidbody.AddForce(transform.forward * speed);
   
}

The car is still moving very slow and I don’t see any acceleration.

Use ForceMode.Acceleration

Update your FixedUpdate function with this line…

if(curSpeed < maxSpeed)
    ApplyAcceleration(relativeVelocity);

So the accelleration will be applied until the maxspeed has been reached.

Read this previous answer for an understanding of when to use Update and FixedUpdate.