using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using TMPro; public class GameUIManager : MonoBehaviour { [Header("NOS UI")] public Image boostBarFill; public Button boostButton; [Header("Pause UI")] public Button pauseButton; public GameObject pauseMenuPanel; public Button resumeButton; public Button restartButton; public Button giveUpButton; [Header("Speed UI")] public TextMeshProUGUI speedText; [Header("Position UI")] public TextMeshProUGUI positionText; private VehicleController playerCar; private VehicleTracker playerTracker; private RaceManager raceManager; private bool isPaused = false; public static GameUIManager Instance; private void Awake() { Instance = this; } private void Start() { raceManager = FindObjectOfType(); if (pauseMenuPanel != null) pauseMenuPanel.SetActive(false); // Button listeners if (pauseButton != null) pauseButton.onClick.AddListener(TogglePause); if (resumeButton != null) resumeButton.onClick.AddListener(ResumeGame); if (restartButton != null) restartButton.onClick.AddListener(SceneRestart); if (giveUpButton != null) giveUpButton.onClick.AddListener(MainMenuSceneLoader); // Wait for car spawn Invoke(nameof(FindPlayerReferences), 0.2f); } private void Update() { UpdateSpeedDisplay(); UpdatePositionDisplay(); } private void FindPlayerReferences() { var controllers = FindObjectsOfType(); foreach (var controller in controllers) { if (!controller.isAIControlled) { playerCar = controller; playerTracker = controller.GetComponent(); break; } } } private void UpdateSpeedDisplay() { if (playerCar == null || speedText == null) return; float speed = Mathf.Abs(playerCar.CurrentSpeed); speedText.text = $"{Mathf.RoundToInt(speed)} km/h"; } private void UpdatePositionDisplay() { if (playerTracker == null || raceManager == null || positionText == null) return; int pos = raceManager.GetCurrentPosition(playerTracker); int total = raceManager.TotalCars; positionText.text = $"{pos}/{total}"; } public void TogglePause() { isPaused = !isPaused; Time.timeScale = isPaused ? 0f : 1f; if (pauseMenuPanel != null) pauseMenuPanel.SetActive(isPaused); } public void ResumeGame() { isPaused = false; Time.timeScale = 1f; if (pauseMenuPanel != null) pauseMenuPanel.SetActive(false); } public void SceneRestart() { Time.timeScale = 1f; SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } public void MainMenuSceneLoader() { Time.timeScale = 1f; SceneManager.LoadScene("Menu"); } }