// ============================================== // GameHUD.cs - Spiel-UI Anzeige // ============================================== // Zeigt Score, Leben, Distanz und andere // Spielinformationen an. using UnityEngine; using TMPro; using UnityEngine.UI; namespace BreakpilotDrive { public class GameHUD : MonoBehaviour { [Header("Score")] [SerializeField] private TextMeshProUGUI scoreText; [SerializeField] private TextMeshProUGUI highScoreText; [Header("Leben")] [SerializeField] private TextMeshProUGUI livesText; [SerializeField] private Image[] heartImages; [Header("Distanz")] [SerializeField] private TextMeshProUGUI distanceText; [Header("Quiz-Statistik")] [SerializeField] private TextMeshProUGUI quizStatsText; [Header("Animationen")] [SerializeField] private Animator scoreAnimator; private int displayedScore = 0; private int targetScore = 0; void Start() { // Events abonnieren if (GameManager.Instance != null) { GameManager.Instance.OnScoreChanged += UpdateScore; GameManager.Instance.OnLivesChanged += UpdateLives; GameManager.Instance.OnDistanceChanged += UpdateDistance; } // Initial-Werte setzen UpdateScore(0); UpdateLives(3); UpdateDistance(0); } void OnDestroy() { // Events abbestellen if (GameManager.Instance != null) { GameManager.Instance.OnScoreChanged -= UpdateScore; GameManager.Instance.OnLivesChanged -= UpdateLives; GameManager.Instance.OnDistanceChanged -= UpdateDistance; } } void Update() { // Score-Animation (zaehlt hoch) if (displayedScore != targetScore) { displayedScore = (int)Mathf.MoveTowards(displayedScore, targetScore, Time.deltaTime * 1000); if (scoreText != null) { scoreText.text = displayedScore.ToString("N0"); } } // Quiz-Statistik aktualisieren UpdateQuizStats(); } // ============================================== // Score // ============================================== private void UpdateScore(int newScore) { targetScore = newScore; // Animation ausloesen bei Punkte-Gewinn if (newScore > displayedScore && scoreAnimator != null) { scoreAnimator.SetTrigger("ScoreUp"); } } // ============================================== // Leben // ============================================== private void UpdateLives(int lives) { if (livesText != null) { livesText.text = $"x{lives}"; } // Herz-Icons aktualisieren if (heartImages != null) { for (int i = 0; i < heartImages.Length; i++) { heartImages[i].enabled = i < lives; } } } // ============================================== // Distanz // ============================================== private void UpdateDistance(float distance) { if (distanceText != null) { distanceText.text = $"{distance:F0}m"; } } // ============================================== // Quiz-Statistik // ============================================== private void UpdateQuizStats() { if (quizStatsText == null || QuizManager.Instance == null) return; int answered = QuizManager.Instance.GetQuestionsAnswered(); int correct = QuizManager.Instance.GetQuestionsCorrect(); if (answered > 0) { float accuracy = QuizManager.Instance.GetAccuracy() * 100; quizStatsText.text = $"Quiz: {correct}/{answered} ({accuracy:F0}%)"; } else { quizStatsText.text = "Quiz: 0/0"; } } } }