@Bruh_Bruh

Как реализовать управление машиной по UI кнопкам?

Не могу сделать управление через UI. Проблема именно с осями, как мне кажется. Пробовал определять verticalAxis и transform.localPosition.z, и Vector3.forward.z, и много чего еще, но это не работает. При нажатии кнопки движения вперед машина едет назад, но если ее развернуть, то она будет ехать задом вперед, сама вилять в разные стороны. То, что задокументировано - управление для пк.
spoiler
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour
{
    private Rigidbody rb;

    [SerializeField] private Transform frontRightWheelTransform;
    [SerializeField] private Transform frontLeftWheelTransform;
    [SerializeField] private Transform rearRightWheelTransform;
    [SerializeField] private Transform rearLeftWheelTransform;

    [SerializeField] private WheelCollider frontRightWheelCollider;
    [SerializeField] private WheelCollider frontLeftWheelCollider;
    [SerializeField] private WheelCollider rearRightWheelCollider;
    [SerializeField] private WheelCollider rearLeftWheelCollider;

    [SerializeField] private AudioSource engineAudioSourse;

    [SerializeField] private int motorTorque;
    [SerializeField] private int steerAngle;
    private float currentMotorTorque;
    private float currentSteerAngle;

    private float horizontalAxis;
    private float verticalAxis;

    private bool ButtonForwardIsPressed;
    private bool ButtonBackwardIsPressed;
    private bool ButtonRightIsPressed;
    private bool ButtonLeftIsPressed;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }


    private void Update()
    {
        GetAxises();
        HandleMotor();
        HandleSteerAngle();
        EngineHandler();
    }

    private void GetAxises()
    {
        //horizontalAxis = Input.GetAxis("Horizontal");
        //verticalAxis = Input.GetAxis("Vertical");
        verticalAxis = rb.transform.position.z;
        horizontalAxis = rb.transform.position.x;
    }

    private void HandleMotor()
    {
        //currentMotorTorque = motorTorque * verticalAxis;
        //frontRightWheelCollider.motorTorque = currentMotorTorque;
        //frontLeftWheelCollider.motorTorque = currentMotorTorque;
        //rearRightWheelCollider.motorTorque = currentMotorTorque;
        //rearLeftWheelCollider.motorTorque = currentMotorTorque;

        if (ButtonForwardIsPressed == true)
        {
            currentMotorTorque = motorTorque * verticalAxis * -1;
            frontRightWheelCollider.motorTorque = currentMotorTorque;
            frontLeftWheelCollider.motorTorque = currentMotorTorque;
            rearRightWheelCollider.motorTorque = currentMotorTorque;
            rearLeftWheelCollider.motorTorque = currentMotorTorque;
        }
        else
        {
            return;
        }

        if (ButtonBackwardIsPressed == true)
        {
            currentMotorTorque = motorTorque * verticalAxis;
            frontRightWheelCollider.motorTorque = currentMotorTorque;
            frontLeftWheelCollider.motorTorque = currentMotorTorque;
            rearRightWheelCollider.motorTorque = currentMotorTorque;
            rearLeftWheelCollider.motorTorque = currentMotorTorque;
        }
        else
        {
            return;
        }
    }

    private void HandleSteerAngle()
    {
        //currentSteerAngle = steerAngle * horizontalAxis;
        //frontRightWheelCollider.steerAngle = currentSteerAngle;
        //frontLeftWheelCollider.steerAngle = currentSteerAngle;

        if (ButtonRightIsPressed == true)
        {
            currentSteerAngle = steerAngle * rb.transform.right.x;
            frontRightWheelCollider.steerAngle = currentSteerAngle;
            frontLeftWheelCollider.steerAngle = currentSteerAngle;
        }
        else
        {
            return;
        }

        if (ButtonLeftIsPressed == true)
        {
            currentSteerAngle = steerAngle * rb.transform.right.x * -1;
            frontRightWheelCollider.steerAngle = currentSteerAngle;
            frontLeftWheelCollider.steerAngle = currentSteerAngle;
        }
        else
        {
            return;
        }
    }

    private void EngineHandler()
    {
        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S))
        {
            if (!engineAudioSourse.isPlaying)
            {
                engineAudioSourse.Play();
            }
        }
        else
        {
            engineAudioSourse.Stop();
        }
    }

    #region UIButtons
    public void OnForwardButtonDown()
    {
        ButtonForwardIsPressed = true;
    }

    public void OnBackwardButtonDown()
    {
        ButtonBackwardIsPressed = true;
    }

    public void OnRightButtonDown()
    {
        ButtonRightIsPressed = true;
    }

    public void OnLeftButtonDown()
    {
        ButtonLeftIsPressed = true;
    }

    public void OnForwardButtonUp()
    {
        ButtonForwardIsPressed = false;
    }

    public void OnBackwardButtonUp()
    {
        ButtonBackwardIsPressed = false;
    }

    public void OnRightButtonUp()
    {
        ButtonRightIsPressed = false;
    }

    public void OnLeftButtonUp()
    {
        ButtonLeftIsPressed = false;
    }
    #endregion

}

  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
DanceM
@DanceM Куратор тега Unity
Кто хочет -ищет способ, кто не хочет -ищет причину
Не знаю, как именно у вас авто построено, кто кому родитель, где коллайдеры и т.п., но думаю причина именно в этом, а не в скрипте. Ведь скрипт только говорит колесам когда крутится и когда поворачивать. А дальше уже физика работает, и работает так, как настроен "физический" объект.

Найдите готовую машину, пример, и изучите от и до структуру. Так будет проще всего понять, что к чему.

По скрипту замечания:

задокументировано - управление для пк
Используйте #ifdef для такого, чтобы работали ОБА варианта в зависимости от платформы, без ручного пекреключения.

Как-то управление криво организовано, вызывается событие, что создаёт условие для проверки по условиям.
Если ГАЗ-НАЖАТ > то ГАЗ-ДА > если ГАЗ-ДА > то СКОРОСТЬ+
можно ведь
Если ГАЗ-НАЖАТ > то СКОРОСТЬ+

else
        {
            return;
        }

Это вы сами похоже не монимаете, зачем вставили, ведь если нажмете кнопку "поворот вправо" и "поворот влево" одновременно, будет только вправо и поворачивать.

rb.transform.position.z и transform.position.z; одно и тоже, в данном случае. И это не "ось", не "axis", а лишь координата объекта по одной из осей. Получается, что чем дальше авто проедет вперед, тем быстрее будет ехать вперед. Чем сильнее сместиться вправо, тем сильнее будет поворачивать вправо. Странно это всё.

Действия с физикой надо проводить в FixedUpdate(), не в Update().

Если один и тот же код пишется дважды или более в разных местах, выводите его в отдельный метод.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы