Bobi Sinadinovski
Bobi Sinadinovski

Reputation: 9

Car rotation help for a mini game project

I have a mini project where i have a car that drives on a cylinder and is rotating around the cylinder. When i press left mouse click the car rotates to the left and goes to the left and when i press right mouse click it rotates right and it goes right. What i want is when i release the mouse click buttons i want the car to rotate back to face the forward direction of the cylinder and continue going forward along the cylinder i have a script that is working but it is not rotating the car back to forward direction.

    //THIS SCRIPT IS ATTACHED TO THE CAR

 void Update(){

 //CHECKS IF MOUSE BUTTON ARE CLICKED

 if (Input.GetMouseButton (0)) {
 rotation = -1;
 } else if (Input.GetMouseButton (1)) {
 rotation = 1;
 } else {
 rotation = 0;
 }

 }

 void FixedUpdate(){

 //moves the car forward

 //rgb is the rigidbody of the car

 rgb.MovePosition(rgb.position - transform.right * moveSpeed * Time.fixedDeltaTime);



 // THE LINES BELOW ROTATE THE CAR TO THE LEFT OR RIGHT

 Vector3 yRot = Vector3.up * rotation * rotation_speed * Time.deltaTime;
 Quaternion deltaRot = Quaternion.Euler(yRot);
 Quaternion targetRot = rgb.rotation * deltaRot;

 rgb.MoveRotation(Quaternion.Slerp(rgb.rotation, targetRot, 50f * Time.fixedDeltaTime));

 }

Upvotes: 0

Views: 71

Answers (1)

user12652967
user12652967

Reputation:

This is because you are setting the variable "rotation" to 0.

Vector3 yRot = Vector3.up * rotation * rotation_speed * Time.deltaTime;

Which results to 0 and your object doesn't rotate.

I would recommend you to do something like this in your update method:

if (Input.GetMouseButton (0))
{
    rotation = -1;
}
else if (Input.GetMouseButton (1))
{
    rotation = 1;
}
else
{
    //Now when the rotation is positive, 
    //the object starts to rotate towards negative, but stops at 0
    //Same is true when the rotation is negative
    if (rgb.rotation.y > 0) 
    {
        rotation = -1;
    }
    else if (rgb.rotation.y < 0)
    {
        rotation = 1;
    }
    else 
    {
        //This needs to be added here to stop the object from rotating 
        //when the y rotation is already 0
        rotation = 0;
    }

}

Now it rotates towards 0 when you don't press anything. Also don't use Time.deltaTime in FixedUpdate.

Edit:

So I noticed that with this method it doesn't quite never return to 0. It gets very close but not close enough. By adding this to FixedUpdate the y rotation gets rounded to 0.

if (Mathf.Abs(targetRot.y) < 0.00001f)
{
    targetRot = Quaternion.Euler(new Vector3(targetRot.x, 0, targetRot.z));
}

Upvotes: 0

Related Questions