Resumen

Lograr que una explosión aparezca al destruir un enemigo y luego desaparezca por sí sola es un patrón fundamental en el desarrollo de videojuegos 2D con Unity. Aquí se explica paso a paso cómo usar Animation Events para sincronizar el final de una animación con la destrucción del GameObject, y cómo gestionar colisiones entre el jugador y los enemigos para que todo funcione correctamente.

¿Qué son los Animation Events y cómo funcionan?

Los Animation Events son marcadores que se colocan en un punto específico de la línea de tiempo de una animación. Cuando la reproducción alcanza ese marcador, Unity llama automáticamente a una función pública del GameObject que contiene la animación [01:00]. Esto permite ejecutar lógica exactamente cuando se necesita, sin depender de temporizadores manuales.

Para implementarlo, primero se crea un script llamado ExplosionEnd dentro de una carpeta de efectos [01:23]. El script es extremadamente sencillo:

csharp public class ExplosionEnd : MonoBehaviour { public void EndExplosion() { Destroy(gameObject); } }

Después se convierte la explosión en un prefab arrastrándola a una carpeta dedicada [02:07]. En la ventana Animation, se selecciona el último frame de la animación, se hace clic en Add Event y se asigna la función EndExplosion [02:50]. Al dar play, la explosión desaparece de la jerarquía una vez que termina su ciclo, confirmando que el evento funciona correctamente [03:14].

¿Cómo hacer que los enemigos exploten al colisionar con el jugador?

Se crea un nuevo script llamado EnemyLife que detecta colisiones mediante OnTriggerEnter2D [03:40]. Dentro de este método se usa CompareTag para verificar si el objeto con el que se chocó tiene el tag "Player".

csharp public class EnemyLife : MonoBehaviour { public GameObject explosion;

private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Player")) { GameObject go = Instantiate(explosion); go.transform.position = transform.position; Destroy(gameObject); } }

}

  • Se instancia el prefab de explosión con Instantiate [04:20].
  • Se asigna la posición del enemigo a la explosión recién creada.
  • Se destruye el enemigo con Destroy(gameObject).

Un detalle importante: si se pasa el transform directamente a Instantiate, la explosión se crea como hija del enemigo y se destruye junto con él [06:30]. La solución es instanciar sin transform y luego asignar la posición manualmente, separando así la explosión del padre.

¿Por qué la colisión no funciona a la primera?

Durante las pruebas se detectó que el OnTriggerEnter2D no se ejecutaba [05:12]. Se usó un breakpoint para hacer debug y se identificaron dos problemas comunes:

  • El jugador no tenía asignado el tag "Player" [05:40].
  • El jugador no tenía un Collider 2D, que es requisito para que cualquier tipo de colisión funcione. Al menos uno de los dos objetos necesita un Rigidbody [05:30].

¿Cómo configurar colliders y tags correctamente?

Para que la detección de colisiones sea precisa y justa con el jugador:

  • Se añade un Capsule Collider 2D a cada avión enemigo con la opción Is Trigger activada [04:55].
  • Se añade un Collider 2D al jugador y se ajusta su tamaño, especialmente reduciendo la zona de las alas para dar una ventaja al jugador [06:58].
  • Se asignan los tags: "Player" al jugador y "Enemy" a los aviones enemigos [06:00].

Este ajuste de colliders más pequeños que el sprite es una práctica recomendada en diseño de juegos, ya que mejora la sensación de control y reduce la frustración del jugador [05:00].

Tras aplicar todas las configuraciones, al dar play los aviones explotan al contacto, la animación de explosión se reproduce completa y luego desaparece limpiamente de la jerarquía [07:20]. ¿Has probado a combinar Animation Events con otros efectos visuales o de sonido? Comparte tu experiencia en los comentarios.