Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Estado de ejecución | 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

bookEstado de ejecución

Cambios y Adiciones

Variable isStateFinished:

Esta es una variable booleana que indica si el estado ha terminado su ejecución.

Método FinishState:

Este es un nuevo método virtual que establece isStateFinished a true. Ser virtual significa que las clases derivadas pueden sobrescribir este método si necesitan realizar acciones adicionales cuando un estado termina.

Por qué se hicieron estos cambios

Los cambios introducen la variable isStateFinished para rastrear la finalización del estado y el método FinishState para estandarizar la señalización de finalización del estado, permitiendo que las clases derivadas agreguen lógica personalizada al completar el estado.

Estado de Correr

Veamos la clase RunState, que hereda de la clase State. Esta clase es responsable de manejar el comportamiento de correr de nuestro enemigo. Nos centraremos en las adiciones y cambios realizados en esta clase.

Constructor:

public RunState(Rigidbody2D rb, Animator animator, Transform p, float speed);

Este constructor inicializa el RunState con los componentes necesarios: un Rigidbody2D para el movimiento, un Animator para las animaciones, un Transform para rastrear al jugador y una speed para determinar qué tan rápido corre el enemigo;

Método StartState:

public override void StartState(); Este método establece isStateFinished a false y activa la animación de correr configurando el parámetro booleano "run" en el animador a true.

Método UpdateState:

public override void UpdateState(float DeltaTime); Este método actualiza la posición y orientación del enemigo basándose en la posición del jugador; Ajusta la escala del enemigo para enfrentar al jugador, calcula la velocidad basada en la rapidez y aplica esta velocidad al Rigidbody2D.

Método EndState:

public override void EndState() Este método detiene la animación de correr configurando el parámetro booleano "run" en el animador a false.

Cómo Funciona para Nuestro Enemigo

  • Movimiento y Animación:

Usando Rigidbody2D y Animator, el RunState asegura que el enemigo pueda moverse suavemente y tenga animaciones correspondientes. Esto hace que el comportamiento sea visual y físicamente realista;

  • Seguimiento de la Posición del Jugador:

El transform del player permite que el enemigo siempre se mueva hacia el jugador, lo cual es esencial para comportamientos de persecución o huida;

  • Manejo de Dirección:

Ajustar el scale.x basado en la posición del jugador asegura que el enemigo enfrente al jugador correctamente mientras corre, añadiendo realismo;

  • Actualizaciones Dinámicas de Estado:

El método UpdateState se llama cada cuadro para ajustar continuamente el movimiento y dirección del enemigo basándose en la posición del jugador, haciendo que el enemigo sea receptivo y dinámico.

Inicialización del Enemigo

Explicación

Inicialización de Estados:

Las variables idle y runState se inicializan con sus respectivos estados. La variable idle es una instancia de IdleState con el animador pasado, mientras que runState es una instancia de RunState que incluye un Rigidbody2D, Animator, Transform para el jugador y un valor de velocidad.

Inicialización del StateManager:

stateManager = new StateManager(idle); El StateManager se inicializa con el estado idle como el estado inicial.

Definiciones de Transiciones:

  • FarAwayTransition:

FarAwayTransition = new Transition(() => { return (ThresholdDistance < Vector2.Distance(transform.position, player.position)); }, new StatePourcentage(runState, 50f), new StatePourcentage(dashState, 50f));;

Esta transición verifica si el jugador está más lejos que ThresholdDistance;

  • toIdleTransition: toIdleTransition = new Transition(() => { return stateManager.GetCurrentState().isStateFinished; }, new StatePourcentage(idle, 100)); Esta transición verifica si el estado actual ha terminado. Si es verdadero, transiciona al estado idle con un 100% de probabilidad.
  • finishRunning: finishRunning = new Transition(() => { return (ThresholdDistance >= Vector2.Distance(transform.position, player.position)); }, new StatePourcentage(idle, 100)); Esta transición verifica si el jugador está más cerca que ThresholdDistance. Si es verdadero, transiciona al estado idle con un 100% de probabilidad.

Añadiendo Transiciones a StateManager:

Estas líneas añaden las transiciones definidas al stateManager.

Por Qué Lo Hicimos Así

Cambios Dinámicos de Estado:

Las transiciones permiten que el enemigo cambie dinámicamente su comportamiento basado en la posición del jugador y el estado de finalización del estado actual, haciendo al enemigo más receptivo e interactivo dentro del entorno del juego.

Transiciones Condicionales:

El uso de condiciones (como verificar la distancia o la finalización del estado) asegura que las transiciones de estado ocurran de manera lógica y apropiada, mejorando el realismo del juego.

Transiciones Basadas en Probabilidad:

Usar StatePourcentage permite transiciones basadas en probabilidad, añadiendo un elemento de imprevisibilidad y variedad al comportamiento del enemigo.

¿Qué le sucede al `animator` cuando se llama al método `StartState` en la clase `RunState`?

¿Qué le sucede al animator cuando se llama al método StartState en la clase RunState?

Selecciona la respuesta correcta

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

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