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 );