Kursinhalt
Kampfspiel in Unity
Kampfspiel in Unity
Angriffsstatus
Erklärung der AttackState-Klasse
Die AttackState
-Klasse ist ein spezifischer Zustand, der das Angriffsverhalten des Feindes steuert. Diese Klasse erbt von der State
-Klasse und enthält Methoden, um den Angriffsstatus zu starten, zu aktualisieren und zu beenden sowie die Angriffsaktion zu handhaben.
Klassendefinition und Mitgliedsvariablen
Klassendefinition:
public class AttackState : State
;
Diese Klasse erbt von der State
-Klasse, was bedeutet, dass sie die abstrakten Methoden implementieren muss, die in State
definiert sind.
Mitgliedsvariablen:
string attackStateName;
Der Name des Angriffsstatus, der im Animator verwendet wird.
bool isAttacking;
Ein Flag, um anzuzeigen, ob der Feind gerade angreift.
Animator animator;
Steuert die Animationen.
Transform transform;
Der Transform des Feindes, der für Positionierung und Raycasting verwendet wird.
float range;
Die Angriffsreichweite.
int damage;
Der durch den Angriff verursachte Schaden.
LayerMask playerLayer;
Die Layer-Maske, die verwendet wird, um den Spieler zu identifizieren.
Konstruktor
Der Konstruktor initialisiert den AttackState
mit den notwendigen Komponenten: einem Transform
für die Positionierung, einem Animator
für die Animationen, einer Layer-Maske zur Identifizierung des Spielers, dem Namen des Angriffsstatus, dem Schadenswert und der Angriffsreichweite. Er setzt diese Werte auf die entsprechenden Mitgliedsvariablen.
StartState-Methode
Diese Methode setzt isStateFinished
auf false
, löst die Angriffsanimation aus, indem der entsprechende boolesche Parameter im Animator auf true
gesetzt wird, und setzt das isAttacking
-Flag auf false
zurück.
EndState Methode
Diese Methode stoppt die Angriffsanimation, indem sie den entsprechenden booleschen Parameter im Animator auf false
setzt.
UpdateState Methode
Diese Methode wird in jedem Frame aufgerufen und löst die Attack
Methode aus, um die Angriffsaktion auszuführen.
StartAction Methode
Diese Methode setzt isAttacking
auf true
, was anzeigt, dass die Angriffsaktion begonnen hat.
FinishMovement Methode
Diese Methode setzt isAttacking
auf false
, was anzeigt, dass die Angriffsaktion beendet ist.
Attack Methode
Diese Methode führt die Angriffsaktion aus. Wenn isAttacking
true
ist, wird ein Strahl in die Richtung geworfen, in die der Feind schaut. Wenn der Strahl ein Objekt auf der playerLayer
trifft, wird die GetAttacked
Methode auf dem getroffenen Objekt aufgerufen, Schaden zugefügt und die Angriffsaktion beendet.
Warum wir es so gemacht haben
-
Kontrolle über das Angriffsverhalten: Das
isAttacking
-Flag ermöglicht eine präzise Kontrolle darüber, wann der Angriff stattfinden soll, wodurch das Verhalten reaktionsfähiger auf Spielereignisse wird; -
Dynamische Angriffsausführung: Durch die kontinuierliche Aktualisierung des Angriffsstatus des Feindes stellt der
AttackState
sicher, dass der Feind den Spieler genau und dynamisch angreifen kann; -
Integration der Animation: Durch die Verwendung von Animator-Parametern wird sichergestellt, dass die Animationen des Feindes korrekt mit seinen Angriffen synchronisiert sind, was ein flüssiges und realistisches Erlebnis bietet.
Wie es im Kontext funktioniert
Eintreten in den Angriffsmodus: Wenn der Feind den AttackState
betritt, wird die StartState
-Methode aufgerufen, die die Angriffsanimation auslöst und das isAttacking
-Flag zurücksetzt.
Während des Angriffs: Die UpdateState
-Methode wird in jedem Frame aufgerufen. Sie löst die Attack
-Methode aus, um zu überprüfen, ob ein Angriff stattfinden soll.
Angriff starten: Die StartAction
-Methode setzt isAttacking
auf true
, wodurch die Attack
-Methode die Angriffsaktion ausführen kann.
Angriff ausführen: Die Attack
-Methode wirft einen Strahl, um den Spieler zu erkennen und Schaden zu verursachen, wenn der Spieler getroffen wird.
Angriff beenden: Die FinishMovement
-Methode setzt isAttacking
auf false
, wodurch die Angriffsaktion gestoppt wird.
Verlassen des Angriffsmodus: Wenn der Feind den AttackState
verlässt, wird die EndState
-Methode aufgerufen, die die Angriffsanimation stoppt.
Durch die Strukturierung des AttackState
auf diese Weise stellen wir sicher, dass der Feind reaktionsschnelle und dynamische Angriffe auf den Spieler ausführen kann, mit fließenden Übergängen zwischen Animationen und Zuständen.
Nah-Übergang:
closeTransition:
Dieser Übergang überprüft, ob sich der Spieler in einer bestimmten horizontalen Entfernung (ThresholdDistance
) vom Feind befindet.
Wenn die Bedingung erfüllt ist, wechselt er zufällig mit gleicher Wahrscheinlichkeit (jeweils 50%) zu attack1
oder attack2
;
Code-Beispiel:
Hinzufügen von closeTransition zum Idle-Zustand:
stateManager.AddStateTransition(idle, closeTransition);
Diese Zeile fügt die closeTransition
zum idle
-Zustand hinzu, sodass der Zustandsautomat diese Bedingung überprüfen kann, wenn der Feind im Leerlaufzustand ist.
Warum wir es so gemacht haben
Das Übergangssystem ermöglicht es dem Feind, basierend auf der Nähe des Spielers in einen Angriffsmodus zu wechseln, was das Engagement erhöht. Der probabilistische Ansatz zur Auswahl zwischen verschiedenen Angriffen fügt Unvorhersehbarkeit hinzu, was die Herausforderung und das Interesse am Spiel steigert.
Wie es im Kontext funktioniert
Leerlaufzustand:
Während der Feind im idle
-Zustand ist, überprüft er ständig, ob der Spieler innerhalb der ThresholdDistance
mithilfe der closeTransition
ist.
Wenn der Spieler nah genug ist, wird die closeTransition
ausgelöst, und der Feind wechselt entweder zu attack1
oder attack2
.
Angriffszustände:
Sobald attack1
oder attack2
erreicht ist, führt der Feind den Angriff aus.
Nach Abschluss des Angriffs wechselt die bestehende toIdleTransition
den Feind zurück in den idle
-Zustand, bereit, die closeTransition
-Bedingung erneut zu überprüfen.
Durch das Hinzufügen dieser closeTransition
stellen wir sicher, dass der Feind den Spieler dynamischer und unvorhersehbarer angreifen kann, wenn sich der Spieler in unmittelbarer Nähe befindet. Dies verbessert das Gameplay, indem das Verhalten des Feindes reaktionsschneller und ansprechender wird.
Danke für Ihr Feedback!