# Vehicle setup - driving slopes

Hi there,

I got this wee script that does most of the vehicle driving job rather well. However, when I am trying to drive a steep (not too steep really) slope, the engine shuts down (as intended). But when I power it on again, I just can’t climb up - my vehicle rolls down on wheels.

``````float acc;
if ((Input.GetAxis("Vertical") > 0.1f) || (Input.GetAxis("Vertical") < -0.1f))
{
acc = Input.GetAxis("Vertical");
}
else
{
var localVelocity = transform.InverseTransformDirection(rigidbody.velocity);
if (localVelocity.z > 0.05)
{
acc = -3f;
}
else if (localVelocity.z < -0.05)
{
acc = 3f;
}
else
{
acc = 0;
}

}
``````

I tried something rather crude, a key binding to increase the acceleration - but its not exactly what I am looking for - once used, it will just shoot the vehicle forward - and a subsequent jump over the edge of the slope. What I am really looking for is a steady speed, slowly rolling the slope. I am using the wasd keys - and when I hit the critical point I want to use the shift like a really basic gearbox. Maybe I should look into motor torque instead (I did so with about the same results) or forward friction - if tat’s even a variable accessible in script?

This seems to work well but I can’t figure out how to drive backwards now. Stuck. But so far it’s doing precisely what I needed. As soon as the angle of attack increases I use a secondary key to change gears (fake gearbox) and as soon the slope ends, I get back to the initial speed and the vehicle won’t just jump over the edge.

``````			rigidbody.drag = rigidbody.velocity.magnitude / 1000;

float angle = 0.0f;

Vector3 axis = Vector3.zero;

rigidbody.rotation.ToAngleAxis(out angle, out axis);

float _x_angle = Mathf.Abs(angle*axis.x);

_x_angle = Mathf.Clamp( _x_angle, 0f, 10f);

acc = Mathf.Lerp(accSlope, accAngle, _x_angle/10f );
``````