Всем привет! Сегодня мы создадим спидометр со стрелкой! Я хочу попросить вас скачать, данные файлы:
Теперь, импортируйте эти файлы в наш проект, и перейдите на сцену 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!
Конец
Вот и все, наш урок подошел к концу. За этот урок, мы с вами улучшили наш спидометр на красивый. На это все, всем до скорой встречи!