Files
Benjamin Boenisch 5a31f52310 Initial commit: breakpilot-lehrer - Lehrer KI Platform
Services: Admin-Lehrer, Backend-Lehrer, Studio v2, Website,
Klausur-Service, School-Service, Voice-Service, Geo-Service,
BreakPilot Drive, Agent-Core

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:47:26 +01:00

145 lines
4.3 KiB
C#

// ==============================================
// 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";
}
}
}
}