Помощь в повороте автомобиля для мини-игрового проекта - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть мини-проект, где у меня есть машина, которая ездит на цилиндре и вращается вокруг цилиндра. Когда я нажимаю левую кнопку мыши, машина вращается влево и уходит влево, а когда я нажимаю правую кнопку мыши, она вращается вправо и направо. Что я хочу, так это, когда я отпускаю кнопки мыши, я хочу, чтобы автомобиль вращался назад, чтобы повернуть цилиндр вперед, и продолжал двигаться вперед вдоль цилиндра. У меня есть скрипт, который работает, но он не вращает машину назад и вперед. направление.

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

 }

1 Ответ

0 голосов
/ 05 апреля 2020

Это потому, что вы устанавливаете переменную «вращение» на 0.

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

В результате получается 0, а ваш объект не вращается.

Я бы порекомендовал вам сделать что-то вроде этого в вашем методе обновления:

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

}

Теперь он поворачивается к 0, когда вы ничего не нажимаете. Также не используйте Time.deltaTime в FixedUpdate.

Редактировать:

Так что я заметил, что с помощью этого метода он не совсем никогда не возвращается к 0. Он подходит очень близко, но не достаточно близко. Добавляя это к FixedUpdate, вращение у округляется до 0.

if (Mathf.Abs(targetRot.y) < 0.00001f)
{
    targetRot = Quaternion.Euler(new Vector3(targetRot.x, 0, targetRot.z));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...