Game AI
Kernphilosophie
Game Artificial Intelligence (KI) ist kein akademisches maschinelles Lernen, das versucht, die Zukunft vorherzusagen oder menschliche Schachgroßmeister zu schlagen. Game AI ist eine Illusion für Unterhaltung und Spieldynamik. Ein NPC, der mit übermenschlicher Genauigkeit, pixelgenauen Zielen und null Zögern spielt, ist frustrierend und macht keinen Spaß. Game AI muss klare Ankündigungen, lesbare taktische Entscheidungen, glaubwürdige sensorische Wahrnehmung und eine dynamische Schwierigkeitsanpassung bieten, die dem Spieler das aufregende Gefühl gibt, einen kompetenten Gegner auszutricksen.
4-Schritte Game-AI-Architektur
Schritt 1: Entscheidungsarchitekturen: Behavior Trees vs. FSMs
- Behavior Trees (der Industriestandard für Kampf-KI):
- Basieren auf hierarchischen Knoten, die von links nach rechts ausgewertet werden:
- Komposite:
- Sequenz ($ o$): Führt Kindknoten nacheinander aus; schlägt fehl, wenn ein Kind fehlschlägt (z. B. Hat Waffe $ o$ Nachladen $ o$ Zielen).
- Selektor ($?$): Führt Kindknoten aus, bis einer erfolgreich ist (z. B. Fliehen bei niedriger Gesundheit $?$ Nahkampfangriff $?$ Deckung suchen).
- Decorators: Bedingte Tore (z. B. Invertieren, Zeitlimit, Abklingzeit).
- Blätter / Aufgaben: Konkrete ausführbare Aktionen (z. B. MoveToPosition, PlayAnimation).
- Komposite:
- Basieren auf hierarchischen Knoten, die von links nach rechts ausgewertet werden:
- Endliche Automaten (FSMs):
- Am besten geeignet für einfache Umgebungswesen oder diskrete Bosse (Zustände: Patrouille, Untersuchen, Verfolgen, Angreifen, Fliehen).
Schritt 2: Sensorische Wahrnehmungssysteme (Sicht & Gehör)
- Sichtkegel (Sehwahrnehmung):
- Bewerte die Sichtbarkeit eines Ziels anhand von 3 Prüfungen:
- Entfernungsprüfung: Ist der Spieler innerhalb des Sichtradius ($D \le R_{\text{max}}$)?
- Blickwinkel: Ist das Skalarprodukt des Vorwärtsvektors des Gegners und der Richtung zum Spieler $\ge \cos(\theta / 2)$?
- Sichtlinie (Raycast): Trifft ein physikalischer Raycast von den Augen des Gegners zum Rumpf des Spielers auf Weltgeometrie oder den Spieler?
- Bewerte die Sichtbarkeit eines Ziels anhand von 3 Prüfungen:
- Akustische Wahrnehmung (Hören):
- Verbreite Schallereignisse in der Spielwelt (z. B. Schuss = 40 m Radius; Schritte = 8 m Radius).
- Alarmierte NPCs wechseln in einen Untersuchen-Zustand, der zur Schallquelle führt.
Schritt 3: NavMesh-Pfadfindung & taktisches Flanking
- A-Pfadfindung auf Navigationsnetzen*:
- NPCs fragen vorgebackene NavMeshes für Pfaddurchquerungen ab.
- Reziproke Geschwindigkeitshindernisse (RVO / ORCA): Implementiere lokale Kollisionsvermeidung, damit Gruppen von 5 Feinden nicht in einer identischen Einzeldatei marschieren oder Türeingänge verstopfen.
- Taktische Deckungssuche & Flankenangriff:
- Nutze Environmental Query Systems (EQS): Probenahme von Kandidatenpunkten um den Spieler herum, Bewertung der Punkte basierend auf Deckungsgeometrie-Winkel, Entfernung und Sichtlinienschutz.
Schritt 4: Ankündigung & die Illusion von Kompetenz
- Ankündigung von Absichten:
- Bevor NPCs einen tödlichen Angriff ausführen, müssen sie ihre Absicht durch Audiocues („Flanke links!“, „Granate raus!“), Auflade-Animationen oder Laserzielstrahlen ankündigen.
- Der „Stormtrooper-Effekt“ (kontrollierte Inkompetenz):
- Der erste Schuss auf einen ahnungslosen Spieler sollte absichtlich um 1 Meter verfehlen, um den Spieler zu warnen und Adrenalin zu erzeugen, bevor echter Schaden zugefügt wird.
Lieferformat: Spezifikation des Feind-KI-Verhaltensbaums (ENEMY-AI-SPEC.md)
# Spezifikation des Kampf-KI-Verhaltensbaums: [NPC-Archetyp]
## 1. Wahrnehmungsparameter
- **Sichtweite**: 25 Meter (Tag) / 14 Meter (Nacht)
- **Blickwinkel**: 110 Grad
- **Hörradius**: Schüsse = 50 m | Laufende Schritte = 12 m | Geducktes Gehen = 0 m (leise)
- **Reaktionszeitpuffer**: 350 ms Verzögerung zwischen Zielerfassung und Angriffsauslösung
## 2. Master-Verhaltensbaum-Hierarchie
Root (Selektor) ├── [Decorator: Gesundheit < 20 %] -> Sequenz (Notflucht) │ ├── FindeDeckungWegVomSpieler() │ ├── BewegeZuDeckung() │ └── SpieleAnimation("Heilen") ├── [Decorator: KannSpielerSehen == Wahr] -> Selektor (Kampf-Ast) │ ├── [Decorator: InNahkampfreichweite] -> Sequenz (Nahkampfschlag) │ │ ├── SpieleAudioBark("Angriff!") │ │ ├── AnkündigungsAufladung(400 ms) │ │ └── FühreNahkampfSchadenAus() │ └── Sequenz (Fernkampf-Gefecht) │ ├── Selektor (Deckung nehmen oder flankieren) │ │ ├── [Decorator: InDeckung] -> ZielenAufSpieler() │ │ └── BewegeZuFlankenPosition() │ └── Feuerstoß(3_Schüsse) └── Sequenz (Patrouille / Leerlauf) ├── WähleNächstenPatrouillenpunkt() ├── BewegeZuPunkt() └── WarteZufällig(2 s, 5 s)
## 3. Audio-Barks & Spieler-Rückmeldung
- **Beim Entdecken des Spielers**: *„Kontakt! Auf neun Uhr!“*
- **Beim Granatenwurf**: *„Splitter raus! In Deckung!“*
Praxisbeispiel: Behebung einer „unfairen“ Scharfschützen-KI
- Problem: Spieletester hassten einen Scharfschützen-Gegner, weil er Spieler sofort aus der Ferne tötete, ohne Vorwarnung.
- Lösung: Hinzufügen einer sichtbaren roten Laserziel-Linie, die 2,0 Sekunden lang über den Boden streicht, bevor der Schuss erfolgt, gepaart mit einem eindeutigen Audio-Ladegeräusch.
- Ergebnis: Spielertode fühlten sich fair und vermeidbar an; die Zufriedenheit der Tester stieg von 32 % auf 88 %.
Überprüfungs-Checkliste
- Wahrnehmungssystem validiert Entfernung, Sichtkegel sowie physikalische Sichtlinie (Raycast).
- Verhaltensbaum priorisiert Überlebens-/Fluchtzustände vor offensiven Aktionen.
- Alle tödlichen Angriffe enthalten lesbare Ankündigungsanimationen oder Audio-Barks.
- NavMesh-Agenten implementieren lokale Kollisionsvermeidung (RVO), um Türverstopfungen zu vermeiden.
- Feindliche Reaktionszeiten enthalten realistische menschliche Verzögerungspuffer (200–400 ms).
Anti-Patterns
- Allwissende KI: Feinde kennen die Spielerkoordinaten durch feste Wände hindurch, ohne Wahrnehmungsprüfungen.
- Frame-Null-Ausrichtung: Feinde drehen sich um 180° und feuern in einem einzigen Frame mit 100 % Genauigkeit.
- Die Einzeldatei-Lemminge: 8 Feinde marschieren in einer geraden Linie durch einen einzigen Flur, um einen nach dem anderen abgeschlachtet zu werden.