Animaciones de Muerte y Desaparición de Enemigos en Unity

Clase 27 de 33Curso de VR con Unity

Resumen

Domina un flujo claro para que los enemigos reaccionen de forma realista al daño en Unity: vincula el parámetro de Animator health a los puntos de vida, reproduce la animación de muerte, habilita o no la caída con Rigidbody y programa la desaparición con Destroy. Verás además cómo un error típico como “There is no Rigidbody” se detecta y soluciona rápido desde la consola.

¿Cómo vincular health de animator con la vida del enemigo?

El guion de vida es multifunción: sirve para enemigos con animaciones y para personajes sin ellas. La clave es asociar el parámetro de Animator llamado "health" a la variable interna de vida. Así, cada cambio de vida actualiza la animación automáticamente. Si el objeto no tiene Animator, el script sigue funcionando sin errores.

¿Qué pasos seguir para inicializar y sincronizar animator?

  • Detectar el Animator en Start con GetComponent y guardarlo en una variable privada.
  • Establecer el parámetro "health" inicial mediante SetFloat.
  • Mantener la sincronización dentro del setter de vida para reflejar cada cambio al instante.
using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int healthPoints;
    [SerializeField] private DamageType damageType; // Enemy / Player, etc.

    private Animator animator; // Vinculado si existe Animator en el objeto.

    void Start()
    {
        if (GetComponent<Animator>() != null)
        {
            animator = GetComponent<Animator>();
            animator.SetFloat("health", healthPoints);
        }
    }

    public int HealthPoints
    {
        get => healthPoints;
        set
        {
            healthPoints = value;
            if (animator != null)
                animator.SetFloat("health", healthPoints);

            if (healthPoints <= 0)
                OnDeath();
        }
    }

    private void OnDeath()
    {
        // Lógica de muerte abajo.
    }
}

¿Qué sucede al llegar a cero puntos de vida en Unity?

Al llegar a cero, se coordina la animación de muerte con la física y la limpieza de objetos. La idea mostrada es hacer que el enemigo caiga al suelo con Rigidbody y luego desaparecer con Destroy. Más tarde se comprobó que la propia animación ya incluye la caída, por lo que se puede prescindir de activar Use Gravity, pero conviene mantener Rigidbody para movemento.

¿Cómo aplicar Rigidbody, gravedad y Destroy de forma segura?

  • Obtener el Rigidbody en la muerte: si existe, activar o no useGravity según lo necesites.
  • Si el tipo es enemigo (DamageType.Enemy), programar su destrucción con retardo: Destroy(gameObject, 2f).
private void OnDeath()
{
    var rb = GetComponent<Rigidbody>();
    if (rb != null)
    {
        // Opcional: si la animación no hace caer al enemigo, habilitar gravedad.
        // rb.useGravity = true;
    }

    if (damageType == DamageType.Enemy)
        Destroy(gameObject, 2f);
}

¿Cómo depurar el error “There is no Rigidbody”?

  • Mirar la consola: mensaje textual “There is no Rigidbody”.
  • Seleccionar los cuatro dragones en la jerarquía e incorporar el componente Rigidbody.
  • Desactivar Use Gravity por defecto si la animación ya gestiona la caída.
  • Verificar en la jerarquía lateral que, tras la muerte, los dragones desaparecen a los dos segundos.

¿Qué pruebas y mejoras se aplicaron durante el combate con dragones?

Se validó la mecánica de daño con armas. Con la espada no se alcanzaba al dragón: se sugirió aumentar el collider para mejorar alcance. Con el fuego, el impacto reduce la vida, aparece la barrita de vida, se reproduce la muerte, el enemigo cae y desaparece. Al principio no desaparecía: se detectó en consola el error por falta de Rigidbody, se añadió el componente y quedó resuelto.

¿Qué miniejercicio se propone para la muerte del personaje?

  • No hay animación del jugador: puedes velar la pantalla en rojo.
  • Añadir un botón o un temporizador que reinicie la escena tras unos segundos.

¿Qué habilidades y keywords refuerzas?

  • Sincronización de Animator con variable de vida mediante "health" y SetFloat.
  • Uso de GetComponent y control de nulos para scripts multifunción.
  • Gestión de muerte con condición de vida <= 0.
  • Física con Rigidbody y opción Use Gravity según la animación.
  • Limpieza de escena con Destroy(gameObject, 2f).
  • Tipificación por DamageType.Enemy para lógica específica.
  • Diagnóstico con consola y verificación en jerarquía.
  • Ajuste de collider para alcance de la espada.

¿Tú cómo implementarías la muerte del personaje sin animación: overlay rojo, botón o temporizador? Comparte tu enfoque y mejoras que probarías para el patrullaje y la búsqueda del jugador.

      Animaciones de Muerte y Desaparición de Enemigos en Unity