A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
145 lines
4.3 KiB
C#
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";
|
|
}
|
|
}
|
|
}
|
|
}
|