/
arti4
/
Diplom
Обзор
Документация
Войти
/
arti4
/
Diplom
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Scripts/Other/Speedometer.cs
204 строки
6 KB
arti4
Загрузка всех скриптов
17 май 2026, 09:08
Верифицирован
17 май 2026, 09:08
cc2e1cd
Код
Авторство
О чём код?
using PV; using UnityEngine; using UnityEngine.UI; public class Speedometer : MonoBehaviour { [Header("References")] [SerializeField] private VehicleController vehicleController; [SerializeField] private Image speedometerNeedle; [SerializeField] private Text speedText; [SerializeField] private Text directionText; [SerializeField] private Color forwardColor = Color.white; [SerializeField] private Color reverseColor = Color.red; [Header("Settings")] [SerializeField] private float maxSpeed = 200f; [SerializeField] private float minAngle = -135f; [SerializeField] private float maxAngle = 135f; [Tooltip("������� ���������: true = ��/�, false = �/�")] [SerializeField] private bool useKPH = true; [Header("Reverse Settings")] [SerializeField] private float maxReverseSpeed = 50f; [Header("Auto Find Settings")] [SerializeField] private string playerTag = "Player"; [SerializeField] private bool autoFindPlayer = true; [SerializeField] private float searchInterval = 0.5f; private float lastSearchTime = 0f; private bool isVehicleFound = false; void Start() { TryFindVehicleController(); } void Update() { if (!isVehicleFound && autoFindPlayer) { if (Time.time - lastSearchTime >= searchInterval) { TryFindVehicleController(); lastSearchTime = Time.time; } return; } if (vehicleController == null || speedometerNeedle == null) { isVehicleFound = false; return; } float speed = vehicleController.speed; bool isMovingForward = speed >= 0; float absoluteSpeed = Mathf.Abs(speed); float displaySpeed = useKPH ? absoluteSpeed * 3.6f : absoluteSpeed; if (speedText != null) { speedText.text = Mathf.RoundToInt(displaySpeed).ToString(); speedText.color = isMovingForward ? forwardColor : reverseColor; } if (directionText != null) { if (Mathf.Abs(speed) < 0.1f) { directionText.text = ""; } else if (isMovingForward) { directionText.text = "D"; directionText.color = forwardColor; } else { directionText.text = "R"; directionText.color = reverseColor; } } UpdateNeedle(displaySpeed, isMovingForward); UpdateNeedleColor(isMovingForward); } private void TryFindVehicleController() { if (vehicleController != null) { isVehicleFound = true; return; } GameObject playerObject = GameObject.FindGameObjectWithTag(playerTag); if (playerObject != null) { vehicleController = playerObject.GetComponent<VehicleController>(); if (vehicleController != null) { isVehicleFound = true; return; } else { vehicleController = playerObject.GetComponentInChildren<VehicleController>(); if (vehicleController != null) { isVehicleFound = true; return; } } } VehicleController controller = FindFirstObjectByType<VehicleController>(); if (controller != null) { vehicleController = controller; isVehicleFound = true; return; } isVehicleFound = false; if (Time.time < 5f) { } } private void UpdateNeedle(float currentSpeed, bool isForward) { float clampedSpeed; float effectiveMaxSpeed; if (isForward) { effectiveMaxSpeed = maxSpeed; clampedSpeed = Mathf.Clamp(currentSpeed, 0, effectiveMaxSpeed); } else { effectiveMaxSpeed = maxReverseSpeed; clampedSpeed = Mathf.Clamp(currentSpeed, 0, effectiveMaxSpeed); } float speedPercentage = clampedSpeed / effectiveMaxSpeed; float targetAngle = Mathf.Lerp(minAngle, maxAngle, speedPercentage); speedometerNeedle.rectTransform.localRotation = Quaternion.Euler(0, 0, -targetAngle); } private void UpdateNeedleColor(bool isForward) { Image needleImage = speedometerNeedle.GetComponent<Image>(); if (needleImage != null) { needleImage.color = isForward ? forwardColor : reverseColor; } } public float GetCurrentSpeed() { if (vehicleController == null) return 0; return useKPH ? Mathf.Abs(vehicleController.speed) * 3.6f : Mathf.Abs(vehicleController.speed); } public bool IsMovingForward() { if (vehicleController == null) return true; return vehicleController.speed >= 0; } public void SetVehicleController(VehicleController newController) { vehicleController = newController; isVehicleFound = (newController != null); if (vehicleController != null) { } } public void SetPlayerTag(string newTag) { playerTag = newTag; } public void ForceFindPlayer() { TryFindVehicleController(); } }