Contenido del Curso
Juego de Lucha en Unity
Juego de Lucha en Unity
Estado de Ataque
Explicación de la Clase AttackState
La clase AttackState
es un estado específico que maneja el comportamiento de ataque del enemigo. Esta clase hereda de la clase State
e incluye métodos para iniciar, actualizar y finalizar el estado de ataque, así como manejar la acción de ataque.
Definición de la Clase y Variables Miembro
Definición de la Clase:
public class AttackState : State
;
Esta clase hereda de la clase State
, lo que significa que debe implementar los métodos abstractos definidos en State
.
Variables Miembro:
string attackStateName;
El nombre del estado de ataque utilizado en el animador.
bool isAttacking;
Una bandera para indicar si el enemigo está atacando actualmente.
Animator animator;
Controla las animaciones.
Transform transform;
La transformación del enemigo, utilizada para posicionamiento y raycasting.
float range;
El rango de ataque.
int damage;
El daño infligido por el ataque.
LayerMask playerLayer;
La máscara de capa utilizada para identificar al jugador.
Constructor
El constructor inicializa el AttackState
con los componentes necesarios: un Transform
para posicionamiento, un Animator
para animaciones, una máscara de capa para identificar al jugador, el nombre del estado de ataque, el valor de daño y el rango de ataque. Establece estos valores en las variables miembro correspondientes.
Método StartState
Este método establece isStateFinished
en false
, activa la animación de ataque configurando el parámetro booleano apropiado en el animador a true
, y reinicia la bandera isAttacking
a false
.
Método EndState
Este método detiene la animación de ataque configurando el parámetro booleano apropiado en el animador a false
.
Método UpdateState
Este método se llama en cada fotograma y activa el método Attack
para realizar la acción de ataque.
Método StartAction
Este método establece isAttacking
a true
, indicando que la acción de ataque ha comenzado.
Método FinishMovement
Este método establece isAttacking
a false
, indicando que la acción de ataque ha terminado.
Método Attack
Este método realiza la acción de ataque. Si isAttacking
es true
, lanza un rayo en la dirección en la que el enemigo está mirando. Si el rayo golpea un objeto en el playerLayer
, llama al método GetAttacked
en el objeto golpeado, causando daño y terminando la acción de ataque.
Por Qué Lo Hicimos Así
- Control Sobre el Comportamiento de Ataque:
La bandera
isAttacking
permite un control preciso sobre cuándo debe ocurrir el ataque, haciendo que el comportamiento sea más receptivo a los eventos del juego; - Ejecución Dinámica del Ataque:
Al actualizar continuamente el estado de ataque del enemigo, el
AttackState
asegura que el enemigo pueda atacar al jugador de manera precisa y dinámica; - Integración de Animación: Usar parámetros del animador asegura que las animaciones del enemigo estén correctamente sincronizadas con sus ataques, proporcionando una experiencia fluida y realista.
Cómo Funciona en Contexto
Entrando en Estado de Ataque: Cuando el enemigo entra en el AttackState
, se llama al método StartState
, activando la animación de ataque y reiniciando la bandera isAttacking
.
Durante el Ataque: El método UpdateState
se llama en cada fotograma. Activa el método Attack
para verificar si debe ocurrir un ataque.
Iniciando el Ataque: El método StartAction
establece isAttacking
en true
, permitiendo que el método Attack
realice la acción de ataque.
Realizando el Ataque: El método Attack
lanza un rayo para detectar al jugador y causa daño si el jugador es alcanzado.
Terminando el Ataque: El método FinishMovement
establece isAttacking
en false
, deteniendo la acción de ataque.
Saliendo del Estado de Ataque: Cuando el enemigo sale del AttackState
, se llama al método EndState
, deteniendo la animación de ataque.
Al estructurar el AttackState
de esta manera, aseguramos que el enemigo pueda realizar ataques receptivos y dinámicos al jugador, con transiciones suaves entre animaciones y estados.
Transición Cercana:
closeTransition:
Esta transición verifica si el jugador está dentro de una cierta distancia horizontal (ThresholdDistance
) del enemigo.
Si se cumple la condición, se transiciona aleatoriamente a attack1
o attack2
con igual probabilidad (50% cada uno);
Ejemplo de Código:
Añadiendo closeTransition al Estado Idle:
stateManager.AddStateTransition(idle, closeTransition);
Esta línea añade la closeTransition
al estado idle
, permitiendo que la máquina de estados verifique esta condición cuando el enemigo está en el estado idle.
Por qué lo hicimos así
El sistema de transición permite que el enemigo cambie a un estado de ataque basado en la proximidad del jugador, mejorando la interacción. El enfoque probabilístico para elegir entre diferentes ataques añade imprevisibilidad, aumentando el desafío e interés del juego.
Cómo funciona en contexto
Estado de reposo:
Mientras el enemigo está en el estado idle
, verifica constantemente si el jugador está dentro del ThresholdDistance
usando el closeTransition
.
Si el jugador está lo suficientemente cerca, se activa el closeTransition
, y el enemigo cambia a attack1
o attack2
.
Estados de ataque:
Una vez en attack1
o attack2
, el enemigo realiza el ataque.
Después de que el ataque termina, el toIdleTransition
existente transiciona al enemigo de vuelta al estado idle
, listo para verificar nuevamente la condición de closeTransition
.
Al agregar este closeTransition
, nos aseguramos de que el enemigo pueda interactuar con el jugador de manera más dinámica e impredecible cuando el jugador está dentro de un rango cercano. Esto mejora la jugabilidad al hacer que el comportamiento del enemigo sea más receptivo y atractivo.
¡Gracias por tus comentarios!