Programación de Ataques y Animaciones en Videojuegos

Clase 29 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

Controla con precisión el cambio entre movimiento y ataque en Unity combinando el Animator y el PlayerController. Aquí verás cómo activar un estado booleado de attacking, usar un contador de tiempo para la duración del ataque y evitar que el personaje se mueva mientras ataca. Todo con C# claro, directo y fácil de depurar.

¿Cómo alternar entre ataque y movimiento con animator y controlador?

Para conmutar entre animaciones, se utiliza un parámetro booleano en el Animator llamado exactamente attacking. Este parámetro gobierna las transiciones desde movimiento e idle hacia la animación de ataque en el blend tree. La lógica se programa en Update para leer la entrada del ratón y actualizar el contador de ataque.

¿Qué variables y constantes necesitas?

  • Constante para el nombre del estado del Animator: attacking.
  • Booleana de control: attacking en tiempo de ejecución.
  • Duración del ataque: attackTime pública para ajustarla en el Inspector.
  • Contador interno: attackTimeCounter privado para decrementar en cada frame.

Ejemplo en C#:

// Nombre exacto del parámetro en Animator
private const string attackingState = "attacking";

// Control del ataque
public float attackTime = 0.5f;      // ajustable en el Inspector
private bool attacking = false;      // estado actual
private float attackTimeCounter;     // contador interno

¿Cómo gestionar el ciclo de ataque en update?

La clave es decrementar el contador mientras se ataca y apagar el estado cuando llegue a cero. Así evitas mezclar movimiento y ataque.

void Update()
{
    // Mientras se ataca, cuenta hacia atrás y bloquea el movimiento.
    if (attacking)
    {
        attackTimeCounter -= Time.deltaTime;
        if (attackTimeCounter < 0f)
        {
            attacking = false;
            animator.SetBool(attackingState, false);
        }
    }
    else
    {
        // Aquí iría la lógica de movimiento horizontal/vertical.
        // Ejemplo: animator.SetFloat("moveX", inputX); animator.SetFloat("moveY", inputY);
        // El cálculo de walking es común.
    }

    // Resto de Update...
}

¿Cómo detectar la entrada del ratón para iniciar el ataque?

Se usa el clic izquierdo con Input.GetMouseButtonDown(0). Al iniciar, se reinicia el contador, se pone la velocidad a cero y se activa el parámetro del Animator.

if (Input.GetMouseButtonDown(0))
{
    attacking = true;
    attackTimeCounter = attackTime;           // copia desde la pública
    playerRigidBody.velocity = Vector2.zero;  // detener por completo
    animator.SetBool(attackingState, true);   // activar animación de ataque
}

¿Qué errores comunes debes evitar?

Un fallo típico es un desajuste de nombres entre código y Animator. El parámetro debe llamarse exactamente "attacking". Otro error frecuente es invertir los modificadores: hacer pública la variable del contador y privada la duración. El comportamiento que revela este error es claro: el parámetro nunca pasa a true en el Animator y no aparece ningún error en la consola. La corrección consiste en dejar attackTime pública (se edita en el Inspector) y attackTimeCounter privada (uso interno), y asignar correctamente el valor del contador desde la pública al iniciar el ataque.

Consejos rápidos: - Verifica en tiempo de ejecución el parámetro attacking en el Animator. - Revisa la consola por si hay errores silenciosos. - Asegúrate de que las transiciones en el grafo usan la booleana correcta.

¿Cómo ajustar la experiencia de ataque?

El ajuste fino mejora la sensación del combate y evita inconsistencias entre animación y lógica.

  • Configura attackTime en el Inspector: por ejemplo, 0,5 s para pruebas rápidas.
  • Sincroniza la duración con la animación: si es más larga, pueden salir dos blandidas; si quieres una sola, iguala tiempos.
  • Durante el ataque, el grafo del Animator bloquea el movimiento: es intencional para evitar deslizamientos.
  • Si el alcance es corto, considera hacer el arma un poco más grande: aumenta la accesibilidad sin cambiar la lógica.
  • Reutiliza Animator.SetFloat y Animator.SetBool para mantener consistencia entre estados.

¿Tienes dudas sobre la configuración del Animator o el manejo del contador? Comparte tu caso y comenta qué resultado buscas, así se puede afinar el flujo de ataque y movimiento.

      Programación de Ataques y Animaciones en Videojuegos