# MMI2 – Flugsimulator-Projekt (Unity)

| Tool | Version / Hinweis |
|------|-------------------|
| **Unity Hub** | Aktuelle Version installieren |
| **Unity Editor** | **6000.2.1f1** (Unity 6) |
| **Git** (optional) | Zum Klonen und Einreichen des Repos |

Beim ersten Öffnen lädt Unity alle benötigten Pakete herunter (URP, Input System, Cinemachine, …). Das kann einige Minuten dauern.

---

## Projekt öffnen

Das Unity-Projekt befindet sich **nicht** im obersten Git-Ordner, sondern im Unterordner `MMI2-project/`:

```
mmi2-project/
├── README.md          ← diese Datei
├── .gitignore
└── MMI2-project/      ← diesen Ordner in Unity Hub öffnen
    ├── Assets/
    ├── Packages/
    └── ProjectSettings/
```

**Unity Hub → Add → Ordner `MMI2-project` auswählen → Open**

Die Hauptszene für das Testen:

**`Assets/Scenes/PlaneScene.unity`**

Doppelklick in der Project-Ansicht, dann **Play ▶** drücken.

---

## Spielablauf (Überblick)

```mermaid
flowchart LR
    A[Start / Flug] --> B[Ring 1]
    B --> C[Ring 2]
    C --> D[Ring 3]
    D --> E[Konsole: Landen!]
    E --> F[Landebahn / Runway]
```

1. Das Spiel beginnt im **Flugmodus** (`Flying`).
2. **`RingCourseTracker`** überwacht, welche Ringe in **fester Reihenfolge** durchflogen wurden.
3. Nach dem letzten Ring erscheint in der **Console** die Aufforderung zur Landung.
4. Das Flugzeug landet über die **Runway** des Assets „Simple Airplane Controller".

Den aktuellen Fortschritt zeigt die **Console** (Menü: *Window → General → Console*), z. B.:

`[RingCourse] Ring 2/3 passed: Ring`

---

## Steuerung (Tastatur)

| Taste | Funktion |
|-------|----------|
| **W / S** oder **Pfeil hoch/runter** | Nicken (Pitch) |
| **A / D** oder **Pfeil links/rechts** | Rollen (Roll) |
| **Q / E** | Gieren (Yaw) |
| **Linke Umschalttaste** | Turbo |
| **Leertaste** | Nach der Landung: Flugzeug neu starten |

**Hinweis:** Einmal in die **Game**-Ansicht klicken, damit Tastatureingaben im Spiel ankommen und nicht im Inspector landen.

---

## Ordnerstruktur in `Assets/`

| Ordner / Datei | Inhalt |
|----------------|--------|
| **`Scenes/PlaneScene.unity`** | Hauptszene (Flugzeug, Ringe, Terrain, …) |
| **`Scripts/`** | Eigene Skripte für den Ring-Kurs (siehe unten) |
| **`HeneGames/Simple Airplane Controller/`** | Asset-Store-Paket: Flugphysik, Kamera, Runway, Beispielszenen |
| **`Settings/`** | URP-Grafikeinstellungen (Universal Render Pipeline) |

---

## Skripte

### Eigene Skripte (`Assets/Scripts/`)

| Skript | Aufgabe |
|--------|---------|
| **`RingCourseTracker.cs`** | Zentraler Kurs-Manager. Die Ringe werden im Inspector in der gewünschten Reihenfolge eingetragen. Das Skript verfolgt, welcher Ring als nächstes angeflogen werden muss, zählt den Fortschritt und gibt nach dem letzten Ring die Landeanweisung in der Console aus. |
| **`RingCheckpoint.cs`** | Sitzt auf jedem Ring-Objekt. Erkennt per Trigger, wenn das Flugzeug den Ring durchfliegt, und meldet dies an den `RingCourseTracker` – allerdings nur, wenn der Ring aktuell an der Reihe ist. Falsche Reihenfolge wird abgewiesen und protokolliert. Nach dem Durchfliegen wird der Trigger deaktiviert. |

`RingCourseTracker` steuert den übergeordneten Spielablauf (Ringe zählen → Landen); `RingCheckpoint` ist für die Kollisionserkennung an jedem einzelnen Ring zuständig und leitet Treffer weiter.

### HeneGames – Simple Airplane Controller (`Assets/HeneGames/.../Scripts/`)

| Skript | Aufgabe |
|--------|---------|
| **`SimpleAirPlaneController.cs`** | Herzstück des Flugzeugs. Verarbeitet Eingaben, bewegt und rotiert das Flugzeug und verwaltet Turbo sowie Motoreffekte. Kennt drei Zustände: **Flying** (normaler Flug), **Landing** (automatische Landesequenz) und **Takeoff** (Start von der Runway). Bei einer Kollision mit Hindernissen wird ein Absturz ausgelöst. |
| **`SimpleAirplaneInput.cs`** | Liest Tastatureingaben aus und wandelt sie in Steuerwerte um (WASD, Pfeiltasten, Q/E, Shift). Nutzt primär das neue Unity Input System; bei Bedarf Fallback auf das Legacy-Input-System. |
| **`SimpleAirplaneCamera.cs`** | Steuert die Cinemachine-Verfolgungskamera. Verengt das Sichtfeld (FOV) beim Turbo für einen Geschwindigkeitseffekt, sperrt den Mauszeiger und wechselt nach einem Absturz den Kamera-Update-Modus. |
| **`SimpleAirPlaneCollider.cs`** | Trigger-Komponente an den Rumpfteilen des Flugzeugs. Meldet Kollisionen mit der Spielwelt an den Controller – Ringe und die Landezone werden dabei bewusst ausgenommen. |
| **`LandingArea.cs`** | Trigger am Eingang der Landebahn. Prüft, ob das Flugzeug aus der richtigen Richtung anfliegt, und übergibt es dann an die `Runway` – der Zustand wechselt auf **Landing**. |
| **`Runway.cs`** | Führt die Landung durch, indem das Flugzeug sanft zur Endposition geführt wird. Nach abgeschlossener Landung startet die **Leertaste** den Takeoff. Sobald das Flugzeug wieder fliegt, wird die Runway zurückgesetzt. |
| **`RunwayUIManager.cs`** | Zeigt optionale UI-Hinweise während der Landephase an (z. B. „Leertaste zum Starten"). In `PlaneScene` wird der Fortschritt primär über die Console ausgegeben. |

Überblick über das Zusammenspiel: Tastatureingabe → `SimpleAirPlaneController` bewegt das Flugzeug → `SimpleAirplaneCamera` folgt → `RingCheckpoint`-Trigger melden Durchflüge an `RingCourseTracker` → nach dem letzten Ring leitet `LandingArea` die Landung ein → `Runway` führt sie aus.

---

## Externes Asset: Simple Airplane Controller

- Herkunft: [Asset Store – Simple Airplane Controller](https://assetstore.unity.com/packages/tools/game-toolkits/simple-airplane-controller-228575)
- Enthält: Flugzeug-Prefabs, Runway, Landezone, Sounds und Beispielszenen unter `Example scenes/`
- Skript-Details: siehe Abschnitt **Skripte** oben

**Render Pipeline:** Das Projekt verwendet **URP** (Universal Render Pipeline). Die Materialien des Assets wurden auf URP-Shader umgestellt – ohne diese Anpassung erscheinen Objekte **pink**.

---

Bei Fragen oder Problemen gerne eine Mail an **tom.hempel@hs-coburg.de**.
