Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Laufzustand | Feindverhalten
Kampfspiel in Unity
course content

Kursinhalt

Kampfspiel in Unity

Kampfspiel in Unity

1. Unity-Animationssystem
2. Spielerverhalten
3. Feindverhalten
4. Spiel Verbessern
5. Verbessere das Flappy Bird Spiel

book
Laufzustand

Änderungen und Ergänzungen

isStateFinished Variable:

Dies ist eine boolesche Variable, die angibt, ob der Zustand seine Ausführung abgeschlossen hat.

FinishState Methode:

Dies ist eine neue virtuelle Methode, die isStateFinished auf true setzt. Virtuell bedeutet, dass abgeleitete Klassen diese Methode überschreiben können, wenn sie zusätzliche Aktionen ausführen müssen, wenn ein Zustand endet.

Warum diese Änderungen vorgenommen wurden

Die Änderungen führen die Variable isStateFinished ein, um den Abschluss eines Zustands zu verfolgen, und die FinishState-Methode, um die Signalisierung des Zustandsabschlusses zu standardisieren, sodass abgeleitete Klassen benutzerdefinierte Logik beim Zustandsabschluss hinzufügen können.

Laufzustand

Schauen wir uns die RunState-Klasse an, die von der State-Klasse erbt. Diese Klasse ist verantwortlich für das Handling des Laufverhaltens unseres Feindes. Wir konzentrieren uns auf die Ergänzungen und Änderungen, die an dieser Klasse vorgenommen wurden.

Konstruktor:

public RunState(Rigidbody2D rb, Animator animator, Transform p, float speed);

Dieser Konstruktor initialisiert den RunState mit den notwendigen Komponenten: einem Rigidbody2D für die Bewegung, einem Animator für die Animationen, einem Transform, um den Spieler zu verfolgen, und einer speed, um festzulegen, wie schnell der Feind läuft;

StartState-Methode:

public override void StartState(); Diese Methode setzt isStateFinished auf false und löst die Laufanimation aus, indem der "run"-boolesche Parameter im Animator auf true gesetzt wird.

UpdateState Methode:

public override void UpdateState(float DeltaTime); Diese Methode aktualisiert die Position und Ausrichtung des Feindes basierend auf der Position des Spielers; Sie passt die Skalierung des Feindes an, um dem Spieler zugewandt zu sein, berechnet die Geschwindigkeit basierend auf der Geschwindigkeit und wendet diese Geschwindigkeit auf das Rigidbody2D an.

EndState Methode:

public override void EndState() Diese Methode stoppt die Laufanimation, indem sie den "run"-booleschen Parameter im Animator auf false setzt.

Funktionsweise für unseren Feind

  • Bewegung und Animation: Durch die Verwendung von Rigidbody2D und Animator stellt der RunState sicher, dass sich der Feind reibungslos bewegen kann und entsprechende Animationen hat. Dies macht das Verhalten visuell und physisch realistisch;

  • Verfolgung der Spielerposition: Der player-Transform ermöglicht es dem Feind, sich immer in Richtung des Spielers zu bewegen, was für Verfolgungs- oder Laufverhalten unerlässlich ist;

  • Richtungssteuerung: Die Anpassung der scale.x basierend auf der Position des Spielers stellt sicher, dass der Feind dem Spieler korrekt zugewandt ist, während er läuft, was zur Realismus beiträgt;

  • Dynamische Zustandsaktualisierungen: Die UpdateState-Methode wird in jedem Frame aufgerufen, um kontinuierlich die Bewegung und Richtung des Feindes basierend auf der Position des Spielers anzupassen, wodurch der Feind reaktionsschnell und dynamisch wird.

Feindinitialisierung

Erklärung

Zustandsinitialisierung:

Die Variablen idle und runState werden mit ihren jeweiligen Zuständen initialisiert. Die Variable idle ist eine Instanz von IdleState mit dem Animator, während runState eine Instanz von RunState ist, die ein Rigidbody2D, Animator, Transform für den Spieler und einen Geschwindigkeitswert enthält.

StateManager-Initialisierung:

stateManager = new StateManager(idle); Der StateManager wird mit dem idle-Zustand als Startzustand initialisiert.

Übergangsdefinitionen:

  • FarAwayTransition: FarAwayTransition = new Transition(() => { return (ThresholdDistance < Vector2.Distance(transform.position, player.position)); }, new StatePourcentage(runState, 50f), new StatePourcentage(dashState, 50f));; Dieser Übergang überprüft, ob der Spieler weiter entfernt ist als ThresholdDistance;

  • toIdleTransition: toIdleTransition = new Transition(() => { return stateManager.GetCurrentState().isStateFinished; }, new StatePourcentage(idle, 100)); Dieser Übergang überprüft, ob der aktuelle Zustand abgeschlossen ist. Wenn ja, wechselt er mit 100% Wahrscheinlichkeit in den idle-Zustand.

  • finishRunning: finishRunning = new Transition(() => { return (ThresholdDistance >= Vector2.Distance(transform.position, player.position)); }, new StatePourcentage(idle, 100)); Dieser Übergang überprüft, ob der Spieler näher ist als ThresholdDistance. Wenn ja, wechselt er mit 100% Wahrscheinlichkeit in den idle-Zustand.

Übergänge zum StateManager hinzufügen:

Diese Zeilen fügen die definierten Übergänge zum stateManager hinzu.

Warum wir es so gemacht haben

Dynamische Zustandsänderungen:

Die Übergänge ermöglichen es dem Feind, sein Verhalten dynamisch basierend auf der Position des Spielers und dem Abschlussstatus des aktuellen Zustands zu ändern, wodurch der Feind innerhalb der Spielumgebung reaktionsfähiger und interaktiver wird.

Bedingte Übergänge:

Der Einsatz von Bedingungen (wie das Überprüfen der Entfernung oder des Zustandsabschlusses) stellt sicher, dass Zustandsübergänge logisch und angemessen erfolgen, was die Spielrealität verbessert.

Wahrscheinlichkeitsbasierte Übergänge:

Die Verwendung von StatePourcentage ermöglicht wahrscheinlichkeitsbasierte Übergänge, die dem Verhalten des Feindes ein Element der Unvorhersehbarkeit und Vielfalt hinzufügen.

Was passiert mit dem `animator`, wenn die `StartState`-Methode in der `RunState`-Klasse aufgerufen wird?

Was passiert mit dem animator, wenn die StartState-Methode in der RunState-Klasse aufgerufen wird?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 5
We're sorry to hear that something went wrong. What happened?
some-alt