Animation Events: código en el frame exacto#
Un Animation Event ejecuta un método tuyo en un fotograma concreto de un clip. Es la forma correcta de sincronizar el juego con la animación: reproducir el sonido del pie justo cuando toca el suelo, aplicar el daño de una espada en el frame del impacto, soltar el proyectil cuando el brazo termina el gesto.
Crear un evento#
- Abre el clip en Window → Animation → Animation.
- Coloca el cabezal en el frame exacto (el pie tocando el suelo).
- Pulsa el botón Add Event (la banderita) en la barra de tiempo.
- Elige un método público del script que esté en el mismo GameObject.
El método puede recibir un parámetro simple (float, int, string, AnimationEvent):
using UnityEngine;
public class SonidosPersonaje : MonoBehaviour
{
[SerializeField] private AudioSource fuente;
[SerializeField] private AudioClip pisada;
// Llamado desde un Animation Event, en el frame del pie tocando suelo
public void Pisada()
{
fuente.PlayOneShot(pisada);
}
// El evento del frame del impacto de la espada
public void GolpeEspada()
{
// aplicar daño a lo que haya delante
}
}Aplicar el daño de un ataque con un Animation Event (en el frame del impacto) en vez de en el momento de pulsar hace que el combate se sienta justo: el golpe conecta cuando se ve conectar. Combínalo con sonido y partículas en el mismo frame.
Root Motion: que ande la animación, no el código#
Por defecto muchas animaciones de caminar son "in-place": el personaje mueve las piernas pero no avanza; lo desplazas tú con código. Con Root Motion, el desplazamiento (y giro) que la animación aplica al hueso raíz mueve de verdad al personaje. El resultado: cero deslizamiento de pies ("foot sliding"), porque el movimiento coincide exactamente con la animación.
Actívalo con Apply Root Motion en el componente Animator.
| Root Motion | Movimiento por código | |
|---|---|---|
| Fidelidad (nada de deslizamiento) | Alta | Depende de que ajustes la velocidad a mano |
| Control preciso (velocidad exacta) | Menor | Total |
| Ideal para | Personajes realistas, ataques con desplazamiento, animaciones de captura | Plataformas, arcade, control responsivo |
| Requiere animaciones con desplazamiento real | Sí | No (valen las "in-place") |
Ajustar el Root Motion por código#
Para combinar Root Motion con tu lógica (por ejemplo, no atravesar paredes) interceptas el desplazamiento en OnAnimatorMove:
private Animator anim;
void Awake() => anim = GetComponent<Animator>();
void OnAnimatorMove()
{
// Tomamos el movimiento que propone la animación y lo aplicamos nosotros
Vector3 delta = anim.deltaPosition;
transform.position += delta; // aquí podrías validar colisiones antes
transform.rotation *= anim.deltaRotation;
}Errores frecuentes#
- Método de un Animation Event no público o en otro GameObject: no se llama.
- Aplicar daño al pulsar en vez de en el frame de impacto (el golpe "no cuadra" con lo que se ve).
- Activar Apply Root Motion con animaciones "in-place" (el personaje no avanza) o desactivarlo con animaciones que sí desplazan (se queda quieto deslizando).
- Mezclar Root Motion y movimiento por código sin coordinarlos: el personaje "pelea" consigo mismo.
Ponte a prueba#
Resumen#
Los Animation Events ejecutan un método público en el frame exacto de un clip: la vía correcta para sincronizar pasos, impactos y proyectiles con lo que se ve. El Root Motion (Apply Root Motion) hace que el desplazamiento lo dicte la animación, eliminando el deslizamiento de pies; ideal para personajes realistas, y ajustable por código en OnAnimatorMove. Para control arcade responsivo, sigue moviendo por código con animaciones "in-place".