# Breakpilot Drive - Unity Lernspiel Ein Endless Runner Lernspiel fuer Kinder der Klassen 2-6 mit Quiz-Integration. ## Uebersicht - **Video-Version**: Visuelles 3D-Spiel mit 3-Spur-Steuerung - **Audio-Version**: Barrierefreier Hoerspiel-Modus mit raeumlichem Audio - **Quiz-Integration**: Hybrid-Modus mit schnellen visuellen Fragen UND Denkpausen ## Schnellstart (Docker) ```bash # Game-Container starten (mit Backend) docker-compose --profile game up -d # Nur das Backend starten (fuer API-Tests) docker-compose up backend -d # Game oeffnen open http://localhost:3001 ``` ## Unity Projekt erstellen ### Voraussetzungen - Unity 2022.3 LTS oder neuer - WebGL Build Support Modul installiert ### Neues Projekt erstellen ```bash # Unity Hub oeffnen und neues 3D Projekt erstellen # Projektname: BreakpilotDrive # Speicherort: /path/to/breakpilot-pwa/breakpilot-drive/Unity/ ``` ### Empfohlene Projektstruktur ``` Unity/ ├── Assets/ │ ├── Scripts/ │ │ ├── Core/ │ │ │ ├── GameManager.cs # Spielzustand, Score │ │ │ ├── DifficultyManager.cs # Schwierigkeitsanpassung │ │ │ └── AudioManager.cs # Sound-Verwaltung │ │ ├── Player/ │ │ │ ├── PlayerController.cs # 3-Spur-Bewegung │ │ │ └── PlayerInput.cs # Touch/Keyboard Input │ │ ├── Track/ │ │ │ ├── TrackGenerator.cs # Endlose Strecke │ │ │ ├── ObstacleSpawner.cs # Hindernisse │ │ │ └── VisualTrigger.cs # Quiz-Trigger (Bruecke, etc.) │ │ ├── Quiz/ │ │ │ ├── QuizManager.cs # Quick/Pause-Modus │ │ │ ├── QuestionDisplay.cs # UI fuer Fragen │ │ │ └── QuizAudio.cs # TTS fuer Audio-Version │ │ ├── Network/ │ │ │ ├── BreakpilotAPI.cs # REST API Client │ │ │ └── OfflineCache.cs # Lokaler Fragen-Cache │ │ └── UI/ │ │ ├── MainMenu.cs # Startbildschirm │ │ ├── GameHUD.cs # Score, Leben │ │ └── QuizOverlay.cs # Frage-Anzeige │ ├── Prefabs/ │ │ ├── Player/ │ │ │ └── Car.prefab # Spieler-Auto │ │ ├── Obstacles/ │ │ │ ├── Rock.prefab │ │ │ └── Barrier.prefab │ │ ├── Items/ │ │ │ ├── Star.prefab │ │ │ ├── Coin.prefab │ │ │ └── Shield.prefab │ │ └── VisualTriggers/ │ │ ├── Bridge.prefab # Loest Quick-Quiz aus │ │ ├── House.prefab │ │ └── Tree.prefab │ ├── Audio/ │ │ ├── Music/ │ │ │ └── GameLoop.mp3 │ │ ├── SFX/ │ │ │ ├── Coin.wav │ │ │ ├── Crash.wav │ │ │ └── Correct.wav │ │ └── Voice/ │ │ └── (TTS-generiert) │ ├── Scenes/ │ │ ├── MainMenu.unity │ │ ├── Game_Video.unity │ │ └── Game_Audio.unity │ └── WebGLTemplates/ │ └── Breakpilot/ │ └── index.html # Custom WebGL Template ├── Packages/ │ └── manifest.json └── ProjectSettings/ └── ProjectSettings.asset ``` ## API-Endpunkte Das Backend stellt folgende Endpunkte bereit: ### Lernniveau ``` GET /api/game/learning-level/{user_id} → { overall_level: 1-5, math_level, german_level, english_level } ``` ### Schwierigkeit ``` GET /api/game/difficulty/{level} → { lane_speed, obstacle_frequency, question_complexity, answer_time } ``` ### Quiz-Fragen ``` GET /api/game/quiz/questions?difficulty=3&count=10&mode=quick → [{ id, question_text, options, correct_index, visual_trigger, time_limit_seconds }] GET /api/game/quiz/questions?difficulty=3&count=5&mode=pause → [{ id, question_text, options, correct_index }] ``` ### Visuelle Trigger ``` GET /api/game/quiz/visual-triggers → [{ trigger: "bridge", question_count: 2, difficulties: [1,2] }] ``` ### Session speichern ``` POST /api/game/session { user_id, game_mode, duration_seconds, score, questions_answered, questions_correct } → { session_id, status, new_level? } ``` ## WebGL Build erstellen 1. Unity oeffnen → File → Build Settings 2. Platform: WebGL auswaehlen 3. Player Settings: - Compression Format: Gzip - Decompression Fallback: Aktiviert - WebGL Template: Breakpilot (custom) 4. Build → Zielordner: `breakpilot-drive/Build/` Nach dem Build: ```bash # Docker Container neu bauen docker-compose --profile game build breakpilot-drive # Container starten docker-compose --profile game up -d breakpilot-drive ``` ## Quiz-Modus Implementierung ### Quick Mode (waehrend der Fahrt) ```csharp // Wenn Spieler sich einem VisualTrigger naehert public class VisualTrigger : MonoBehaviour { public string triggerType; // "bridge", "tree", etc. void OnTriggerEnter(Collider other) { if (other.CompareTag("Player")) { // Frage anzeigen, Spiel laeuft weiter QuizManager.Instance.ShowQuickQuestion(triggerType); } } } ``` ### Pause Mode (Spiel pausiert) ```csharp // Alle X Meter/Punkte eine Denkaufgabe public class QuizManager : MonoBehaviour { public void ShowPauseQuestion() { Time.timeScale = 0; // Spiel pausieren // Komplexe Frage anzeigen // Nach Antwort: Time.timeScale = 1; } } ``` ## Entwicklungs-Workflow 1. **Lokal entwickeln**: Unity Editor mit Play-Modus 2. **API testen**: `docker-compose up backend -d` 3. **WebGL testen**: Build erstellen, Container starten 4. **Commit**: Git-Aenderungen committen (ohne Build-Artefakte) ## Bekannte Einschraenkungen - Unity WebGL unterstuetzt kein natives Audio-Recording (fuer Sprachsteuerung) - Mobile Browser haben unterschiedliche Touch-Implementierungen - WASM-Dateien koennen gross werden (>50MB) - Kompression wichtig ## Ressourcen - [Unity WebGL Doku](https://docs.unity3d.com/Manual/webgl.html) - [UnityWebRequest](https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html) - [Breakpilot Drive Plan](../docs/breakpilot-drive-plan.md)