Kursinhalt
Kampfspiel in Unity
Kampfspiel in Unity
Zustandsübergang
In diesen Bildern sehen wir eine Transition
-Klasse und eine StatePourcentage
-Klasse. Diese Klassen arbeiten zusammen, um Übergänge zwischen verschiedenen Zuständen basierend auf bestimmten Bedingungen und Wahrscheinlichkeiten zu handhaben. Lassen Sie uns auf einfache Weise erklären, was dieser Code tut:
Erklärung
StatePourcentage-Klasse
Klassendefinition:
Die Zeile public class StatePourcentage
definiert eine Klasse namens StatePourcentage
. Diese Klasse enthält Informationen über einen Zustand und die prozentuale Wahrscheinlichkeit, zu diesem Zustand zu wechseln.
Mitgliedsvariablen:
public State state;
hält eine Referenz zu einem Zustand.
public float percentage;
hält die prozentuale Wahrscheinlichkeit, zu diesem Zustand zu wechseln.
Konstruktor:
public StatePourcentage(State state, float percentage)
ist eine Konstruktor-Methode. Sie nimmt einen State
und einen float
als Parameter und weist sie den Mitgliedsvariablen zu.
Transition-Klasse
Klassendefinition:
Die Zeile public class Transition
definiert eine Klasse namens Transition
. Diese Klasse behandelt die Logik für Übergänge zwischen Zuständen basierend auf einer Bedingung und Prozentsätzen.
Mitgliedsvariablen:
Func<bool> condition;
ist ein Delegat, der eine Bedingungsfunktion hält. Diese Funktion gibt einen booleschen Wert zurück, der angibt, ob die Übergangsbedingung erfüllt ist.
List<StatePourcentage> availableStates;
ist eine Liste, die mehrere StatePourcentage
-Objekte hält, die potenzielle Zustände darstellen, zu denen gewechselt werden kann, und deren jeweilige Wahrscheinlichkeiten.
Konstruktor:
public Transition(Func<bool> condition, params StatePourcentage[] statePourcentage)
ist eine Konstruktor-Methode. Sie nimmt eine Bedingungsfunktion und ein Array von StatePourcentage
-Objekten als Parameter. Sie initialisiert die condition
-Mitgliedsvariable mit der bereitgestellten Bedingungsfunktion und erstellt eine neue Liste für availableStates
, indem sie jedes StatePourcentage
-Objekt aus dem Array zu dieser Liste hinzufügt.
GetState-Methode:
public State GetState()
ist eine Methode, die bestimmt, zu welchem Zustand basierend auf zufälliger Auswahl und den bereitgestellten Prozentsätzen gewechselt werden soll. Sie generiert eine Zufallszahl zwischen 0 und 100 und iteriert durch die verfügbaren Zustände, akkumuliert deren Prozentsätze, bis sie den Zustand findet, der der Zufallszahl entspricht.
IsConditionMet-Methode:
public bool IsConditionMet()
ist eine Methode, die überprüft, ob die Übergangsbedingung erfüllt ist, indem sie die Bedingungsfunktion aufruft. Sie gibt das Ergebnis der Bedingungsfunktion zurück.
Wie es für unseren Feind funktioniert
Übergangseinrichtung: Wir definieren Übergänge zwischen Zuständen, indem wir die Bedingungen angeben, unter denen diese Übergänge stattfinden, und die Wahrscheinlichkeiten, zu jedem Zustand überzugehen.
Bestimmung des nächsten Zustands: Wenn ein Übergang ausgelöst wird, wählt die Methode GetState()
zufällig den nächsten Zustand basierend auf den definierten Wahrscheinlichkeiten aus. Dies fügt dem Verhalten des Feindes ein Element der Unvorhersehbarkeit hinzu, was es dynamischer und herausfordernder macht.
Bedingungen überprüfen: Die Methode IsConditionMet()
wird verwendet, um zu überprüfen, ob die Bedingungen für einen Übergang erfüllt sind. Wenn die Bedingung wahr ist, kann der Übergang stattfinden, und die Methode GetState()
bestimmt den nächsten Zustand.
Zustandsmanager
Änderungen und Ergänzungen
Zustandsübergänge-Wörterbuch: Dictionary<State, List<Transition>> stateTransitions;
ist ein Wörterbuch, das Listen von Übergängen für jeden Zustand enthält. Jeder Zustand ist mit einer Liste möglicher Übergänge verknüpft, die beim Aktualisieren des Zustands überprüft werden können.
Konstruktor: stateTransitions = new Dictionary<State, List<Transition>>();
initialisiert das stateTransitions
-Wörterbuch im Konstruktor und stellt sicher, dass es bereit ist, Übergänge für verschiedene Zustände zu speichern.
AddStateTransition-Methode: public void AddStateTransition(State state, Transition transition)
ist eine Methode, die einen Übergang zur Liste der Übergänge für einen bestimmten Zustand hinzufügt. Wenn der Zustand noch keinen Eintrag im Wörterbuch hat, wird ein neuer Eintrag mit einer leeren Liste von Übergängen erstellt. Der Übergang wird dann zur Liste der Übergänge für den angegebenen Zustand hinzugefügt.
UpdateStates-Methode: Die UpdateStates
-Methode wurde aktualisiert, um zuerst Übergänge zu überprüfen, indem die Liste der Übergänge für den aktuellen Zustand nach dessen Aktualisierung mit currentState.UpdateState(deltaTime);
abgerufen wird. Anschließend wird jeder Übergang in der Liste ausgewertet, um zu überprüfen, ob die Übergangsbedingung mit transition.IsConditionMet()
erfüllt ist. Wenn eine Übergangsbedingung erfüllt ist, ändert sie den Zustand mit ChangeState(transition.GetState());
und bricht die Schleife ab, um mehrere Zustandsänderungen in einem Update zu verhindern.
Warum diese Änderungen vorgenommen wurden
Die Hinzufügung des stateTransitions
-Wörterbuchs und der AddStateTransition
-Methode ermöglicht es dem StateManager
, mehrere potenzielle Übergänge für jeden Zustand zu verwalten, was die Flexibilität und Komplexität des Zustandsautomaten erhöht. Durch das dynamische Überprüfen von Übergängen innerhalb der UpdateStates
-Methode kann der StateManager
dem Feind ermöglichen, in Echtzeit auf verschiedene Ereignisse und Bedingungen zu reagieren. Die aktualisierte Methode stellt sicher, dass der aktuelle Zustand zuerst aktualisiert wird, gefolgt von der Überprüfung möglicher Übergänge, was eine ordnungsgemäße Ausführung der Zustandslogik vor der Entscheidungsfindung für Übergänge gewährleistet.
Durch die Implementierung dieser Änderungen wird der StateManager
fähiger, komplexe und vielfältige Verhaltensweisen zu handhaben, wodurch die Aktionen des Feindes dynamischer und reaktionsfähiger auf die Spielumgebung werden.
Danke für Ihr Feedback!