Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Transición de Estado | Comportamiento del Enemigo
Juego de Lucha en Unity
course content

Contenido del Curso

Juego de Lucha en Unity

Juego de Lucha en Unity

1. Sistema de Animación de Unity
2. Comportamiento del Jugador
3. Comportamiento del Enemigo
4. Mejorar el Juego
5. Mejorar el Juego de Flappy Bird

bookTransició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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 4
some-alt