Configura un Animator fluido en Unity: dos blend trees (idle y movement), transiciones limpias con walking y parámetros last horizontal y last vertical que mantienen al personaje mirando su última dirección. Aquí verás cómo depurar el grafo y sincronizarlo desde tu controlador sin sobrecargar Update.
¿Qué cambia en el animator con blend trees y walking?
Para un resultado consistente, se utiliza un blend tree de player idle (sin barra baja) con cuatro poses: facing right, left, up y down, gobernadas por last horizontal y last vertical. El estado idle original ya no es necesario.
- Elimina el idle original: usa player idle (blend tree) como estado por defecto.
- Crea dos transiciones: de idle a movement con walking = true y de movement a idle con walking = false.
- Desactiva Exit Time y la duración fija de las animaciones. Mejora la fluidez.
- Conserva los parámetros last horizontal y last vertical en el blend tree de idle.
Así, el grafo alterna entre player idle y player movement solo con el booleano walking, manteniendo la pose según el último vector registrado.
¿Cómo configurar el player controller para sincronizar animator?
Desde el controlador, se derivan y envían los parámetros al Animator para que refleje el movimiento y la última dirección. Además, se evita crear strings en Update por rendimiento: se definen constantes arriba y se reutilizan.
¿Qué variables y constantes declarar?
- Estado de caminata y último movimiento.
- Constantes para nombres de parámetros del Animator.
// Variables de estado
private bool walking = false; // por defecto parado
public Vector2 lastMovement = Vector2.zero; // sin dirección previa
// Constantes de parámetros del Animator
private const string lastHorizontal = "LastHorizontal";
private const string lastVertical = "LastVertical";
private const string walkingState = "Walking"; // evita colisión con bool walking
Claves:
- No uses strings literales en Update. Cárgalos una sola vez como constantes.
- lastMovement guarda la última dirección válida para el idle.
¿Cómo actualizar walking y lastMovement en update?
- Inicia cada frame con walking = false.
- En los if de movimiento horizontal y vertical: marca walking = true y sobrescribe lastMovement con el eje activo.
- Notifica al Animator con SetBool y SetFloat.
void Update()
{
// Por defecto, no caminamos en este frame
walking = false;
// if (condición de movimiento horizontal) { ... }
// walking = true;
// lastMovement = new Vector2(Input.GetAxisRaw("Horizontal"), 0f);
// if (condición de movimiento vertical) { ... }
// walking = true;
// lastMovement = new Vector2(0f, Input.GetAxisRaw("Vertical"));
// Sincronización con Animator
animator.SetBool(walkingState, walking);
animator.SetFloat(lastHorizontal, lastMovement.x);
animator.SetFloat(lastVertical, lastMovement.y);
}
Puntos clave:
- walking solo es verdadero si hubo entrada válida en el frame.
- SetFloat de last horizontal y last vertical mantiene el facing correcto en idle.
- Resultado: transiciones suaves entre blend trees y una pose idle coherente.
¿Cómo depurar sprites y comprobar que el idle mira la última dirección?
Si el personaje siempre mira hacia abajo tras parar, revisa que cada pose del blend tree de idle esté bien asignada. Al corregir los sprites, el personaje queda mirando la última dirección registrada por lastMovement.
- facing up: usa el sprite “player 15”.
- facing down: usa el sprite “player 0”.
- facing left: usa el sprite “player 5”.
- facing right: usa el sprite “player 10”.
Después de actualizar las referencias, prueba en Play: al moverte arriba/izquierda/abajo/derecha, el idle debe conservar esa orientación gracias a walking, last horizontal y last vertical. Si tienes dudas o quieres compartir tu configuración, comenta qué parte del grafo o del código te gustaría revisar.