🎮 UnityDocs

Animation Events y Root Motion

Dos piezas clave para que la animación y el juego vayan sincronizados: los Animation Events (llamar a un método en el frame exacto de un paso o un golpe) y el Root Motion (que el desplazamiento del personaje lo mande la animación, no el código).

📄 ArtículoIntermedio✅ RevisadoUnity 6.0 LTSActualizado 2026-07-17
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 7 min · ⌨️ Práctica 15 min

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#

  1. Abre el clip en Window → Animation → Animation.
  2. Coloca el cabezal en el frame exacto (el pie tocando el suelo).
  3. Pulsa el botón Add Event (la banderita) en la barra de tiempo.
  4. 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):

C#
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
    }
}
El daño en el frame, no al pulsar

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.

⚖️ Comparativa · Root Motion vs movimiento por código
Root MotionMovimiento por código
Fidelidad (nada de deslizamiento)AltaDepende de que ajustes la velocidad a mano
Control preciso (velocidad exacta)MenorTotal
Ideal paraPersonajes realistas, ataques con desplazamiento, animaciones de capturaPlataformas, arcade, control responsivo
Requiere animaciones con desplazamiento realNo (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:

C#
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#

📝 Pon a prueba lo aprendido

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".

Fuentes y para profundizar