Kursinhalt
Kampfspiel in Unity
Kampfspiel in Unity
Wut-Zustand
public class RageState : State
{
Animator animator;
System.Action addHealth;
System.Action changingAttackDmg;
public RageState(Animator animator, System.Action addHealth, System.Action changeAttack)
{
this.animator = animator;
this.addHealth = addHealth;
changingAttackDmg = changeAttack;
}
public override void StartState()
{
animator.SetBool("rage", true);
isStateFinished = false;
changingAttackDmg(); // add the enemy dmg after raging
}
public override void UpdateState(float deltaTime)
{
addHealth();
}
public override void EndState()
{
animator.SetBool("rage", false);
}
}
Erklärung der RageState-Klasse
Die RageState
-Klasse ist ein spezifischer Zustand, der das Verhalten des Gegners steuert, wenn dieser in den Wutmodus wechselt. Diese Klasse erbt von der State
-Klasse und enthält Methoden zum Starten, Aktualisieren und Beenden des Wutzustands. Außerdem sind Aktionen enthalten, um im Wutmodus Lebenspunkte hinzuzufügen und den Angriffsschaden zu verändern.
Klassendefinition und Membervariablen
Klassendefinition:
public class RageState : State
Diese Klasse erbt von der State
-Klasse, was bedeutet, dass sie die abstrakten Methoden aus State
implementieren muss.
Membervariablen:
Animator animator;
Steuert die Animationen.
System.Action addHealth;
Eine Aktion, um dem Gegner Lebenspunkte hinzuzufügen.
System.Action changingAttackDmg;
Eine Aktion, um den Angriffsschaden des Gegners zu verändern.
Konstruktor
Der Konstruktor initialisiert den RageState
mit den erforderlichen Komponenten: einem Animator
für Animationen sowie zwei Aktionen zum Hinzufügen von Gesundheit und zum Ändern des Angriffsschadens. Diese Werte werden den entsprechenden Member-Variablen zugewiesen.
StartState-Methode
Diese Methode setzt isStateFinished
auf false
, löst die Rage-Animation aus, indem der boolesche Parameter "rage" im Animator auf true
gesetzt wird, und ruft changingAttackDmg
auf, um den Schaden des Gegners zu erhöhen.
UpdateState-Methode
Diese Methode wird in jedem Frame aufgerufen und ruft addHealth
auf, um dem Gegner während des Rage-Zustands kontinuierlich Gesundheit hinzuzufügen.
EndState-Methode
Diese Methode stoppt die Rage-Animation, indem der boolesche Parameter "rage" im Animator auf false
gesetzt wird.
Warum wir es so umgesetzt haben
Verbesserte Gegnerverhalten;
Der RageState
verbessert das Verhalten des Gegners, indem er dessen Angriffsschaden erhöht und kontinuierlich Lebenspunkte hinzufügt, wodurch der Gegner für den Spieler herausfordernder wird;
Die Verwendung von Aktionen (System.Action
) ermöglicht flexible und modulare Anpassungen der Gegnerattribute.
Dynamisches und fesselndes Gameplay:
Durch das Einführen eines Rage-Zustands beim Gegner wird das Gameplay dynamischer und fesselnder, da sich der Spieler an einen stärkeren und widerstandsfähigeren Gegner anpassen muss.
Funktionsweise im Kontext
Betreten des Rage-Zustands: Wenn der Gegner in den RageState
wechselt, wird die Methode StartState
aufgerufen, die die Rage-Animation auslöst und den Angriffsschaden des Gegners erhöht.
Während des Rage-Zustands: Die Methode UpdateState
wird in jedem Frame aufgerufen. Sie fügt dem Gegner kontinuierlich Lebenspunkte hinzu, wodurch es für den Spieler schwieriger wird, den Gegner zu besiegen.
Verlassen des Rage-Zustands: Wenn der Gegner den RageState
verlässt, wird die Methode EndState
aufgerufen, die die Rage-Animation stoppt.
Durch diese Strukturierung des RageState
stellen wir sicher, dass der Gegner deutlich stärker und widerstandsfähiger werden kann, was dem Spieler eine größere Herausforderung bietet und das gesamte Spielerlebnis verbessert.
Rage-Zustand initialisieren
rage = new RageState(animator, () => { health += 10f * Time.deltaTime; }, () => { attack1.ChangeAttackDmg(15); attack2.ChangeAttackDmg(25); });
Erklärung
Initialisierung des RageState:
rage = new RageState(animator, (...) => {...}, (...) => {...});
Erstellt eine neue RageState
-Instanz mit dem Namen rage
;
Animator:
animator
: Übergibt den Animator zur Steuerung der Animationen;
Erhöhung der Gesundheit:
() => { health += 10f * Time.deltaTime; }
Eine Lambda-Funktion, die die Gesundheit pro Sekunde um 10
Einheiten erhöht;
Änderung des Angriffsschadens:
() => { attack1.ChangeAttackDmg(15); attack2.ChangeAttackDmg(25); }
Eine Lambda-Funktion, die den Angriffsschaden von attack1
auf 15
und von attack2
auf 25
setzt.
Rage-Übergang
rageTransition = new Transition(() =>
{
if (health <= 40f && haveRaged == false)
{
haveRaged = true;
return true;
}
return false;
}, new StatePourcentage(rage, 100f));
Die rageTransition
ist eine Transition, die den Gegner in einen RageState
versetzt, wenn bestimmte Bedingungen erfüllt sind. Diese Transition wurde entwickelt, um den Gegner gefährlicher zu machen, sobald seine Gesundheit unter einen bestimmten Schwellenwert fällt und er sich noch nicht im Rage-Zustand befindet.
Transition-Definition
Bedingung:
Die Transition prüft, ob die Gesundheit des Gegners kleiner oder gleich 40 ist und ob der Gegner den Rage-Zustand noch nicht betreten hat (haveRaged
ist false
).
Wenn beide Bedingungen erfüllt sind, wird haveRaged
auf true
gesetzt, um sicherzustellen, dass der Gegner den Rage-Zustand nur einmal betritt, und es wird true
zurückgegeben, um die Transition auszulösen.
State Pourcentage:
Die Transition verwendet new StatePourcentage(rage, 100f)
, um anzugeben, dass der Gegner beim Eintreten der Bedingung mit 100% Wahrscheinlichkeit in den RageState
übergeht.
Warum wir es so gemacht haben
Auslösen von mächtigem Verhalten: Die rageTransition
ermöglicht es dem Gegner, bei kritisch niedriger Gesundheit stärker zu werden und stellt so eine größere Herausforderung für den Spieler dar. Diese Transition stellt sicher, dass der Gegner den Rage-Zustand nur einmal betritt und verhindert wiederholte Übergänge in diesen Zustand.
Dynamisches und herausforderndes Gameplay: Durch die Einführung des Rage-Zustands bei kritischer Gesundheit wird das Gameplay dynamischer und anspruchsvoller, sodass der Spieler seine Strategie anpassen muss.
Funktionsweise im Kontext
Gesundheitsüberprüfung: Während des Spiels wird die Gesundheit des Gegners überwacht, wenn er Schaden erleidet. Sinkt die Gesundheit des Gegners auf 40 oder weniger und ist er noch nicht in Rage verfallen, wird die Bedingung rageTransition
erfüllt.
Auslösen des Rage-Zustands: Sobald die Bedingung erfüllt ist, wird haveRaged
auf true
gesetzt und der Übergang in den RageState
wird mit einer Wahrscheinlichkeit von 100 % ausgelöst.
Eintreten in den Rage-Zustand: Der RageState
wird aktiviert, wodurch der Angriffsschaden des Gegners erhöht und kontinuierlich Gesundheit hinzugefügt wird, was den Gegner deutlich schwerer besiegbar macht.
Danke für Ihr Feedback!