Contenido del Curso
Juego de Lucha en Unity
Juego de Lucha en Unity
Estado de Ataque
csharp
Explicación de la clase AttackState
La clase AttackState
es un estado específico que gestiona 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 para gestionar la acción de atacar.
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;
Nombre del estado de ataque utilizado en el animador.
bool isAttacking;
Indicador para señalar si el enemigo está atacando actualmente.
Animator animator;
Controla las animaciones.
Transform transform;
El transform del enemigo, utilizado para posicionamiento y raycasting.
float range;
El alcance del 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 la posición, un Animator
para las 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. Asigna estos valores a 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 correspondiente en el animator 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 correspondiente en el animator 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
en true
, lo que indica que la acción de ataque ha comenzado.
Método FinishMovement
Este método establece isAttacking
en false
, lo que indica que la acción de ataque ha finalizado.
Método de Ataque
Este método realiza la acción de ataque. Si isAttacking
es true
, lanza un rayo en la dirección en la que mira el enemigo. Si el rayo impacta un objeto en la playerLayer
, llama al método GetAttacked
en el objeto impactado, causando daño y finalizando la acción de ataque.
Razones de Esta Implementación
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 sensible 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 con Animaciones: El uso de parámetros del animador garantiza que las animaciones del enemigo estén correctamente sincronizadas con sus ataques, proporcionando una experiencia fluida y realista.
Funcionamiento en Contexto
Entrada en el Estado de Ataque: Cuando el enemigo entra en el AttackState
, se llama al método StartState
, lo que activa la animación de ataque y reinicia la bandera isAttacking
.
Durante el Ataque: El método UpdateState
se llama en cada frame. Activa el método Attack
para comprobar si debe realizarse un ataque.
Inicio del Ataque: El método StartAction
establece isAttacking
en true
, permitiendo que el método Attack
realice la acción de ataque.
Ejecución del Ataque: El método Attack
lanza un rayo para detectar al jugador y causa daño si el jugador es impactado.
Finalización del Ataque: El método FinishMovement
establece isAttacking
en false
, deteniendo la acción de ataque.
Salida 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 dinámicos y responsivos al jugador, con transiciones fluidas entre animaciones y estados.
Transición Cercana:
csharp
closeTransition:
Esta transición verifica si el jugador se encuentra dentro de una cierta distancia horizontal (ThresholdDistance
) respecto al enemigo.
Si se cumple la condición, se realiza una transición aleatoria a attack1
o attack2
con igual probabilidad (50% cada uno);
Ejemplo de código:
Agregar closeTransition al estado Idle:
stateManager.AddStateTransition(idle, closeTransition);
Esta línea agrega la closeTransition
al estado idle
, permitiendo que la máquina de estados verifique esta condición cuando el enemigo se encuentra en estado idle.
Por qué lo hicimos así
El sistema de transiciones permite que el enemigo cambie a un estado de ataque según 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 Idle:
Mientras el enemigo está en el estado idle
, verifica constantemente si el jugador está dentro de la ThresholdDistance
usando la closeTransition
.
Si el jugador está lo suficientemente cerca, se activa la closeTransition
y el enemigo transiciona a attack1
o attack2
.
Estados de ataque:
Una vez en attack1
o attack2
, el enemigo realiza el ataque.
Después de finalizar el ataque, la toIdleTransition
existente transiciona al enemigo de vuelta al estado idle
, listo para verificar nuevamente la condición de closeTransition
.
Al agregar esta closeTransition
, aseguramos que el enemigo pueda interactuar con el jugador de manera más dinámica e impredecible cuando el jugador está a corta distancia. Esto mejora la jugabilidad al hacer que el comportamiento del enemigo sea más receptivo y atractivo.
¡Gracias por tus comentarios!