Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Ballistische Projektilvorhersage für Gefängnis-Dodgeball: Ein Tutorial zur Implementierung in Unity

Lerne, wie du ballistische Flugbahnen für Projektilvorhersage in einem Prison-Dodgeball-Spiel implementierst. Dieses Tutorial führt dich durch die Konzepte der Wurfmechanik, iterative Verfeinerung und Schussauswahl – perfekt für CS7632.

ballistische Flugbahn Projektilvorhersage Unity Tutorial CS7632 Prison Dodgeball Wurfmechanik iterative Verfeinerung Schussauswahl Game AI Target Interception Millington Methode Kosinusgesetz Dodgeball KI ballistische Trajektorie C# Unity Skript Projektilbewegung

Einführung in die ballistische Projektilvorhersage

In diesem Tutorial beschäftigst du dich mit der Implementierung einer Vorhersage für ballistische Flugbahnen, um einen sich bewegenden Gegner in einem Gefängnis-Dodgeball-Spiel zu treffen. Die Aufgabe stammt aus dem Kurs CS7632 und ist besonders relevant, da du im nächsten Homework 6 darauf aufbauen wirst. Stell dir vor, du spielst ein aktuelles Battle-Royale-Spiel wie Fortnite: Auch dort musst du den Einschlagpunkt deiner Granate vorhersagen, während der Gegner sprintet. Genau diese Fähigkeit trainierst du hier – nur mit einem Dodgeball und einer Gefängnismauer.

Grundlagen der Ballistik

Die Flugbahn eines Projektils unter dem Einfluss der Schwerkraft wird durch die klassische Physik beschrieben. Für einen Wurf mit konstanter Geschwindigkeit und konstantem Winkel gilt: y = x * tan(θ) - (g * x²) / (2 * v² * cos²(θ)). Deine Aufgabe ist es, diese Gleichung so zu lösen, dass der Ball den Gegner nach einer bestimmten Flugzeit trifft. Dabei hilft dir eine iterative Methode, die du aus dem Buch von Millington kennst.

Millingtons statische Zielmethode

Der einfachste Ansatz ist das iterative Anpassen des Winkels für ein statisches Ziel. Du startest mit einem Schätzwinkel und berechnest die Flugzeit. Dann verschiebst du das Ziel basierend auf dieser Zeit und wiederholst den Vorgang. Nach wenigen Iterationen konvergiert der Winkel. Diese Methode ist leicht zu implementieren und liefert gute Ergebnisse für Ziele, die sich nicht zu schnell bewegen.

Kosinusgesetz mit 10% Rückhalt

Alternativ verwendest du das Kosinusgesetz, um den Abfangwinkel zu berechnen. Die Idee: Du ziehst 10% der Flugzeit ab, um sicherzustellen, dass du den Ball nicht zu weit vorauswirfst. Das ist einfacher, aber ungenauer bei schnellen Gegnern. Für dieses Tutorial empfehle ich dir Millington mit iterativer Verfeinerung, da es eine gute Balance zwischen Aufwand und Genauigkeit bietet.

Implementierung der ballistischen Flugbahnvorhersage

Deine Implementierung erfolgt in ThrowMethods.cs. Die Methode PredictThrow() soll prüfen, ob ein Ziel erreichbar ist, und den optimalen Wurfvektor zurückgeben. Du erhältst die Position des Werfers, die Wurfgeschwindigkeit, die Schwerkraft und die Zielinformationen (Position, Geschwindigkeit).

public ThrowData PredictThrow(Vector3 throwerPos, float throwSpeed, Vector3 gravity, OpponentInfo target) {
    // Initialisierung
    Vector3 targetPos = target.Pos;
    Vector3 targetVel = target.Vel;
    float g = gravity.magnitude;
    // Iterative Verfeinerung
    for (int i = 0; i < 10; i++) {
        float time = ...; // aus ballistischer Gleichung
        Vector3 futurePos = targetPos + targetVel * time;
        // Winkelberechnung
        if (time > 0 && time < maxTime) {
            return new ThrowData(true, direction, time);
        }
    }
    return new ThrowData(false, Vector3.zero, 0);
}

Wichtig: Du musst auch den Fall abfangen, dass das Ziel unerreichbar ist (z. B. zu weit entfernt oder zu schnell). Deine Methode soll in diesem Fall false zurückgeben.

Schussauswahl-Logik

In ShotSelection.cs implementierst du die Methode SelectThrow(). Hier entscheidest du, ob ein Wurf sinnvoll ist. Kriterien sind:

  • Bewegt sich der Gegner gleichmäßig? Wenn er abrupt beschleunigt, solltest du den Wurf verzögern.
  • Ist die Flugbahn durch ein Hindernis blockiert? Nutze Raycasting, um zu prüfen, ob der Weg frei ist.
  • Hat der Gegner eine Ausweichbewegung gemacht? Falls ja, warte ab.

Ein aktuelles Beispiel: In Valorant musst du oft abwarten, bis der Gegner eine Deckung verlässt, bevor du schießt. Genauso hier: Wirf nur, wenn der Gegner in einer geraden Linie läuft und keine Hindernisse im Weg sind.

Testen im Shooting Range und AdvancedMinionTestThrowScenario

Dein Code wird in zwei Szenarien getestet: Shooting Range (isoliert) und AdvancedMinionTestThrowScenario (mit KI-Gegnern). Im Shooting Range werden statische und gleichmäßig bewegte Ziele getestet. Deine Vorhersage muss für diese Fälle zuverlässig funktionieren. Im fortgeschrittenen Szenario wird auch die Schussauswahl bewertet. Achte darauf, dass dein Minion nicht wirft, wenn der Gegner sich unberechenbar verhält.

Optimierung mit iterativer Verfeinerung

Um die Genauigkeit zu erhöhen, kannst du die iterative Verfeinerung nach Millington verwenden. Du startest mit einer geschätzten Flugzeit und passt den Winkel an, bis die Abweichung minimal ist. Das ist rechenintensiver, aber bei 10 Iterationen noch echtzeitfähig. Ein Tipp: Nutze die Time.deltaTime aus Unity, um die Simulation zu beschleunigen.

Fehlerbehandlung und Randfälle

Deine Implementierung muss auch mit extremen Situationen umgehen: sehr hohe oder tiefe Ziele, extreme Geschwindigkeiten oder Schwerkraft null. In diesen Fällen soll die Methode false zurückgeben. Denke daran, dass die Schwerkraft immer in negativer Y-Richtung wirkt oder null sein kann. Nutze die bereitgestellten Hilfsfunktionen wie Minion.ThrowSpeed und OpponentInfo.Radius.

Zusammenfassung und Ausblick

Mit diesem Tutorial hast du die Grundlagen für eine funktionierende ballistische Vorhersage und Schussauswahl gelernt. Diese Fähigkeiten sind nicht nur für CS7632 wichtig, sondern auch für viele andere Bereiche wie Game AI, Simulationen oder sogar reale Ballistik. Im nächsten Homework wirst du das gesamte Prison-Dodgeball-Spiel integrieren und deine KI-Gegner gegeneinander antreten lassen. Viel Erfolg!