Contenu du cours
Jeu de Combat dans Unity
Jeu de Combat dans Unity
Transition d'État
Dans ces images, nous voyons une classe Transition
et une classe StatePourcentage
. Ces classes travaillent ensemble pour gérer les transitions entre différents états basés sur certaines conditions et probabilités. Décomposons ce que fait ce code en termes simples :
Explication
Classe StatePourcentage
Définition de la classe :
La ligne public class StatePourcentage
définit une classe nommée StatePourcentage
. Cette classe contient des informations sur un état et le pourcentage de chance de transition vers cet état.
Variables Membres :
public State state;
contient une référence à un état.
public float percentage;
contient le pourcentage de chance de transition vers cet état.
Constructeur :
public StatePourcentage(State state, float percentage)
est une méthode constructeur. Elle prend un State
et un float
comme paramètres et les assigne aux variables membres.
Classe Transition
Définition de la classe :
La ligne public class Transition
définit une classe nommée Transition
. Cette classe gère la logique de transition entre les états basés sur une condition et des pourcentages.
Variables Membres :
Func<bool> condition;
est un délégué qui contient une fonction conditionnelle. Cette fonction retourne un booléen indiquant si la condition de transition est remplie.
List<StatePourcentage> availableStates;
est une liste qui contient plusieurs objets StatePourcentage
, représentant les états potentiels vers lesquels transitionner et leurs probabilités respectives.
Constructeur :
public Transition(Func<bool> condition, params StatePourcentage[] statePourcentage)
est une méthode constructeur. Elle prend une fonction conditionnelle et un tableau d'objets StatePourcentage
comme paramètres. Elle initialise la variable membre condition
avec la fonction conditionnelle fournie et crée une nouvelle liste pour availableStates
, ajoutant chaque objet StatePourcentage
du tableau à cette liste.
Méthode GetState :
public State GetState()
est une méthode qui détermine vers quel état transitionner basé sur une sélection aléatoire et les pourcentages fournis. Elle génère un nombre aléatoire entre 0 et 100 et parcourt les états disponibles, accumulant leurs pourcentages jusqu'à trouver l'état qui correspond au nombre aléatoire.
Méthode IsConditionMet :
public bool IsConditionMet()
est une méthode qui vérifie si la condition de transition est remplie en appelant la fonction conditionnelle. Elle retourne le résultat de la fonction conditionnelle.
Comment cela fonctionne pour notre ennemi
Configuration de la transition : Nous définissons des transitions entre les états, en spécifiant les conditions dans lesquelles ces transitions se produisent et les probabilités de transition vers chaque état.
Détermination du prochain état : Lorsqu'une transition est déclenchée, la méthode GetState()
sélectionne aléatoirement le prochain état en fonction des probabilités définies. Cela ajoute un élément d'imprévisibilité au comportement de l'ennemi, le rendant plus dynamique et stimulant.
Vérification des conditions : La méthode IsConditionMet()
est utilisée pour vérifier si les conditions pour une transition sont remplies. Si la condition est vraie, la transition peut se produire, et la méthode GetState()
détermine le prochain état.
Gestionnaire d'états
Modifications et ajouts
Dictionnaire des transitions d'état : Dictionary<State, List<Transition>> stateTransitions;
est un dictionnaire qui contient des listes de transitions pour chaque état. Chaque état est associé à une liste de transitions possibles qui peuvent être vérifiées lors de la mise à jour de l'état.
Constructeur : stateTransitions = new Dictionary<State, List<Transition>>();
initialise le dictionnaire stateTransitions
dans le constructeur, garantissant qu'il est prêt à stocker des transitions pour différents états.
Méthode AddStateTransition : public void AddStateTransition(State state, Transition transition)
est une méthode qui ajoute une transition à la liste des transitions pour un état donné. Si l'état n'a pas déjà d'entrée dans le dictionnaire, une nouvelle entrée est créée avec une liste vide de transitions. La transition est ensuite ajoutée à la liste des transitions pour l'état spécifié.
Méthode UpdateStates : La méthode UpdateStates
a été mise à jour pour d'abord vérifier les transitions en récupérant la liste des transitions pour l'état actuel après l'avoir mis à jour avec currentState.UpdateState(deltaTime);
. Elle évalue ensuite chaque transition dans la liste pour vérifier si la condition de transition est remplie en utilisant transition.IsConditionMet()
. Si une condition de transition est remplie, elle change l'état en utilisant ChangeState(transition.GetState());
et interrompt la boucle pour éviter plusieurs changements d'état en une seule mise à jour.
Pourquoi ces changements ont été effectués
L'ajout du dictionnaire stateTransitions
et de la méthode AddStateTransition
permet au StateManager
de gérer plusieurs transitions potentielles pour chaque état, améliorant ainsi la flexibilité et la complexité de la machine à états. En vérifiant dynamiquement les transitions dans la méthode UpdateStates
, le StateManager
permet à l'ennemi de réagir à différents événements et conditions en temps réel. La méthode mise à jour garantit que l'état actuel est mis à jour en premier, suivi de la vérification des transitions possibles, ce qui assure une exécution correcte de la logique d'état avant de prendre des décisions de transition.
En mettant en œuvre ces changements, le StateManager
devient plus capable de gérer des comportements complexes et variés, rendant les actions de l'ennemi plus dynamiques et réactives à l'environnement du jeu.
Merci pour vos commentaires !