Contenido del Curso
Juego de Lucha en Unity
Juego de Lucha en Unity
Transición de Estado
En estas imágenes, vemos una clase Transition
y una clase StatePourcentage
. Estas clases trabajan juntas para manejar transiciones entre diferentes estados basados en ciertas condiciones y probabilidades. Vamos a desglosar lo que hace este código en términos simples:
Explicación
Clase StatePourcentage
Definición de Clase:
La línea public class StatePourcentage
define una clase llamada StatePourcentage
. Esta clase contiene información sobre un estado y el porcentaje de probabilidad de transición a ese estado.
Variables Miembro:
public State state;
mantiene una referencia a un estado.
public float percentage;
mantiene el porcentaje de probabilidad de transición a este estado.
Constructor:
public StatePourcentage(State state, float percentage)
es un método constructor. Toma un State
y un float
como parámetros y los asigna a las variables miembro.
Clase Transition
Definición de Clase:
La línea public class Transition
define una clase llamada Transition
. Esta clase maneja la lógica para la transición entre estados basada en una condición y porcentajes.
Variables Miembro:
Func<bool> condition;
es un delegado que mantiene una función de condición. Esta función devuelve un booleano que indica si se cumple la condición de transición.
List<StatePourcentage> availableStates;
es una lista que contiene múltiples objetos StatePourcentage
, representando los estados potenciales a los que se puede transitar y sus respectivas probabilidades.
Constructor:
public Transition(Func<bool> condition, params StatePourcentage[] statePourcentage)
es un método constructor. Toma una función de condición y un arreglo de objetos StatePourcentage
como parámetros. Inicializa la variable miembro condition
con la función de condición proporcionada y crea una nueva lista para availableStates
, añadiendo cada objeto StatePourcentage
del arreglo a esta lista.
Método GetState:
public State GetState()
es un método que determina a qué estado transitar basado en una selección aleatoria y los porcentajes proporcionados. Genera un número aleatorio entre 0 y 100 e itera a través de los estados disponibles, acumulando sus porcentajes hasta encontrar el estado que coincide con el número aleatorio.
Método IsConditionMet:
public bool IsConditionMet()
es un método que verifica si se cumple la condición de transición llamando a la función de condición. Devuelve el resultado de la función de condición.
Cómo Funciona para Nuestro Enemigo
Configuración de Transición: Definimos transiciones entre estados, especificando las condiciones bajo las cuales ocurren estas transiciones y las probabilidades de transición a cada estado.
Determinación del Siguiente Estado: Cuando se activa una transición, el método GetState()
selecciona aleatoriamente el siguiente estado basado en las probabilidades definidas. Esto añade un elemento de imprevisibilidad al comportamiento del enemigo, haciéndolo más dinámico y desafiante.
Verificación de Condiciones: El método IsConditionMet()
se utiliza para verificar si se cumplen las condiciones para una transición. Si la condición es verdadera, la transición puede ocurrir, y el método GetState()
determina el siguiente estado.
Administrador de Estados
Cambios y Adiciones
Diccionario de Transiciones de Estado: Dictionary<State, List<Transition>> stateTransitions;
es un diccionario que contiene listas de transiciones para cada estado. Cada estado está asociado con una lista de posibles transiciones que se pueden verificar al actualizar el estado.
Constructor: stateTransitions = new Dictionary<State, List<Transition>>();
inicializa el diccionario stateTransitions
en el constructor, asegurando que esté listo para almacenar transiciones para diferentes estados.
Método AddStateTransition: public void AddStateTransition(State state, Transition transition)
es un método que agrega una transición a la lista de transiciones para un estado dado. Si el estado no tiene ya una entrada en el diccionario, se crea una nueva entrada con una lista vacía de transiciones. Luego, la transición se agrega a la lista de transiciones para el estado especificado.
Método UpdateStates: El método UpdateStates
ha sido actualizado para primero verificar transiciones recuperando la lista de transiciones para el estado actual después de actualizarlo con currentState.UpdateState(deltaTime);
. Luego evalúa cada transición en la lista para verificar si se cumple la condición de transición usando transition.IsConditionMet()
. Si se cumple una condición de transición, cambia el estado usando ChangeState(transition.GetState());
y rompe el bucle para prevenir múltiples cambios de estado en una actualización.
Por Qué Se Hicieron Estos Cambios
La adición del diccionario stateTransitions
y el método AddStateTransition
permite al StateManager
gestionar múltiples transiciones potenciales para cada estado, mejorando la flexibilidad y complejidad de la máquina de estados. Al verificar dinámicamente las transiciones dentro del método UpdateStates
, el StateManager
permite que el enemigo responda a diferentes eventos y condiciones en tiempo real. El método actualizado asegura que el estado actual se actualice primero, seguido de la verificación de posibles transiciones, lo que garantiza la ejecución adecuada de la lógica de estado antes de tomar decisiones de transición.
Al implementar estos cambios, el StateManager
se vuelve más capaz de manejar comportamientos complejos y variados, haciendo que las acciones del enemigo sean más dinámicas y receptivas al entorno del juego.
¡Gracias por tus comentarios!