using System.Collections.Generic; using UnityEngine; using TMPro; using System.Linq; public class RaceManager : MonoBehaviour { [SerializeField] private GameObject leaderboardUI; [SerializeField] private Transform leaderboardContent; [SerializeField] private GameObject leaderboardEntryPrefab; [SerializeField] private GameObject waitingText; [SerializeField] private int totalCars = 4; private List<(VehicleController car, string name)> finishOrder = new(); private HashSet finishedCars = new(); private List activeTrackers = new(); private bool leaderboardShown = false; public int TotalCars => totalCars; public void RegisterTracker(VehicleTracker tracker) { if (!activeTrackers.Contains(tracker)) activeTrackers.Add(tracker); } public void RegisterFinish(VehicleController car) { if (finishedCars.Contains(car)) return; string displayName = car.isAIControlled ? car.GetComponentInChildren().text : GameConstants.PlayerName; finishOrder.Add((car, displayName)); finishedCars.Add(car); if (!leaderboardShown && !car.isAIControlled) { leaderboardShown = true; ShowLeaderboard(); // Show first time (player triggered) waitingText?.SetActive(true); } else if (leaderboardShown) { UpdateLeaderboard(); // Add AI progressively } if (finishedCars.Count >= totalCars) { waitingText?.SetActive(false); } } public bool HasFinished(VehicleController car) { return finishedCars.Contains(car); } public int GetCurrentPosition(VehicleTracker tracker) { VehicleController car = tracker.GetComponent(); if (HasFinished(car)) { return finishOrder.FindIndex(f => f.car == car) + 1; } var sorted = activeTrackers .Where(t => !HasFinished(t.GetComponent())) .OrderByDescending(t => t.GetDistance()) .ToList(); return finishOrder.Count + sorted.IndexOf(tracker) + 1; } private void ShowLeaderboard() { leaderboardUI.SetActive(true); UpdateLeaderboard(); } private void UpdateLeaderboard() { foreach (Transform child in leaderboardContent) { Destroy(child.gameObject); } string playerName = GameConstants.PlayerName; for (int i = 0; i < finishOrder.Count; i++) { GameObject entry = Instantiate(leaderboardEntryPrefab, leaderboardContent); TextMeshProUGUI text = entry.GetComponentInChildren(); if (text != null) { string name = finishOrder[i].name; if (name == playerName) { text.text = $"{i + 1}. {name}"; text.color = Color.yellow; } else { text.text = $"{i + 1}. {name}"; text.color = Color.white; } } } } }