Contenido del Curso
Juego de Lucha en Unity
Juego de Lucha en Unity
Estado 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 estadoidle
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 queThresholdDistance
. Si es verdadero, transiciona al estadoidle
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.
¡Gracias por tus comentarios!