Создание гонок. Глава 2 (5)

0 3

Всем привет! Сегодня мы создадим спидометр со стрелкой! Я хочу попросить вас скачать, данные файлы:

Теперь, импортируйте эти файлы в наш проект, и перейдите на сцену Word. А также настройте эти картинки, как в прошлом уроке, где мы создавали меню.

UI

Создайте в Canvas два Image, один с названием Speedometr, а другой с названием Arrow. Теперь в Speedometr перетащите нашу картинку с спидометром. А в Arrow перетащите нашу стрелку. (Объект — Source Image — картинка). Также создайте пустой объект в Canvas, и назовите его ArrowFix. В ArrowFix перенесите дочерний объект Arrow, вот так должно получиться:

Теперь надо изменить скрипт CarController:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CarController : MonoBehaviour
{
    [SerializeField] private Transform _transformFL;
    [SerializeField] private Transform _transformFR;
    [SerializeField] private Transform _transformBL;
    [SerializeField] private Transform _transformBR;
 
    [SerializeField] private WheelCollider _colliderFL;
    [SerializeField] private WheelCollider _colliderFR;
    [SerializeField] private WheelCollider _colliderBL;
    [SerializeField] private WheelCollider _colliderBR;
 
    [SerializeField] private float _force;
    [SerializeField] private float _maxAngle;
    [SerializeField] private float speed;
    [SerializeField] private GameObject racePanel;
    [SerializeField] private GameObject arrowSpeedometr;

    private Rigidbody _rigidbody;
    // Start is called before the first frame update

    private void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
        racePanel.SetActive(false);
    }

    private void Update()
    {
        speed = Mathf.RoundToInt(_rigidbody.velocity.magnitude * 3.45f);
        arrowSpeedometr.transform.rotation = Quaternion.Euler(0, 0, -speed + 16);
    }
 
    private void FixedUpdate()
    {
        _colliderFL.motorTorque = Input.GetAxis("Vertical") * _force;
        _colliderFR.motorTorque = Input.GetAxis("Vertical") * _force;
 
        if (Input.GetKey(KeyCode.Space))
        {
            _colliderFL.brakeTorque = 5000f;
            _colliderFR.brakeTorque = 5000f;
            _colliderBL.brakeTorque = 5000f;
            _colliderBR.brakeTorque = 5000f;
        }
        else
        {
            _colliderFL.brakeTorque = 0f;
            _colliderFR.brakeTorque = 0f;
            _colliderBL.brakeTorque = 0f;
            _colliderBR.brakeTorque = 0f;
        }
 
        _colliderFL.steerAngle = _maxAngle * Input.GetAxis("Horizontal");
        _colliderFR.steerAngle = _maxAngle * Input.GetAxis("Horizontal");
 
        RotateWheel(_colliderFL, _transformFL);
        RotateWheel(_colliderFR, _transformFR);
        RotateWheel(_colliderBL, _transformBL);
        RotateWheel(_colliderBR, _transformBR);

        _rigidbody.centerOfMass = new Vector3(0f, -0.3f, 0f); // Adjust the Y value as needed
    }
 
    private void RotateWheel(WheelCollider collider, Transform transform)
    {
        Vector3 position;
        Quaternion rotation;
 
        collider.GetWorldPose(out position, out rotation);
 
        transform.rotation = rotation;
        transform.position = position;
    }

    private void OnTriggerEnter(Collider collider)
    {
        if(collider.tag == "Race_Trigger")
        {
            racePanel.SetActive(true);
            Cursor.lockState = CursorLockMode.None;
        }
    }
}

Теперь укажите ссылку на наш объект ArrowFix, и можем запускать! Также если вам не нравиться, что стрелка спидометра идет очень быстро, вы можете изменить speed = Mathf.RoundToInt (_rigidbody.velocity.magnitude * 3.45f); с числа 3.45 на меньшее, тогда у вас стрелка спидометра будет идти по медленнее. Также не забудьте удалить цифровой спидометр, чтобы он не мешал. А еще, измените скрипт CarControllerRace на:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CarControllerRace : MonoBehaviour
{
    [SerializeField] private Transform _transformFL;
    [SerializeField] private Transform _transformFR;
    [SerializeField] private Transform _transformBL;
    [SerializeField] private Transform _transformBR;
 
    [SerializeField] private WheelCollider _colliderFL;
    [SerializeField] private WheelCollider _colliderFR;
    [SerializeField] private WheelCollider _colliderBL;
    [SerializeField] private WheelCollider _colliderBR;
 
    [SerializeField] private float _force;
    [SerializeField] private float _maxAngle;
    [SerializeField] private float speed;
    [SerializeField] private GameObject arrowSpeedometr;

    private Rigidbody _rigidbody;
    // Start is called before the first frame update

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

    private void Update()
    {
        speed = Mathf.RoundToInt(_rigidbody.velocity.magnitude * 3.45f);
        arrowSpeedometr.transform.rotation = Quaternion.Euler(0, 0, -speed + 16);

        if(Input.GetKeyDown(KeyCode.G))
        {

        }

        if(Input.GetKeyDown(KeyCode.H))
        {
            
        }
    }
 
    private void FixedUpdate()
    {
        _colliderFL.motorTorque = Input.GetAxis("Vertical") * _force;
        _colliderFR.motorTorque = Input.GetAxis("Vertical") * _force;
 
        if (Input.GetKey(KeyCode.Space))
        {
            _colliderFL.brakeTorque = 3000f;
            _colliderFR.brakeTorque = 3000f;
            _colliderBL.brakeTorque = 3000f;
            _colliderBR.brakeTorque = 3000f;
        }
        else
        {
            _colliderFL.brakeTorque = 0f;
            _colliderFR.brakeTorque = 0f;
            _colliderBL.brakeTorque = 0f;
            _colliderBR.brakeTorque = 0f;
        }
 
        _colliderFL.steerAngle = _maxAngle * Input.GetAxis("Horizontal");
        _colliderFR.steerAngle = _maxAngle * Input.GetAxis("Horizontal");
 
        RotateWheel(_colliderFL, _transformFL);
        RotateWheel(_colliderFR, _transformFR);
        RotateWheel(_colliderBL, _transformBL);
        RotateWheel(_colliderBR, _transformBR);

        _rigidbody.centerOfMass = new Vector3(0f, -0.3f, 0f); // Adjust the Y value as needed
    }
 
    private void RotateWheel(WheelCollider collider, Transform transform)
    {
        Vector3 position;
        Quaternion rotation;
 
        collider.GetWorldPose(out position, out rotation);
 
        transform.rotation = rotation;
        transform.position = position;
    }
}

И в сцене Word скопируйте Speedometr и ArrowFix с Arrow, и перенесите их в каждую сцену где будет проходить гонки — DifficultRace, EasyRace, NormallyRace. И не забудьте указать ссылку на ArrowFix!

Конец

Вот и все, наш урок подошел к концу. За этот урок, мы с вами улучшили наш спидометр на красивый. На это все, всем до скорой встречи!

Оставьте ответ

Ваш электронный адрес не будет опубликован.