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>
This commit is contained in:
144
breakpilot-drive/UnityScripts/UI/GameHUD.cs
Normal file
144
breakpilot-drive/UnityScripts/UI/GameHUD.cs
Normal file
@@ -0,0 +1,144 @@
|
||||
// ==============================================
|
||||
// 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";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user