Domina el flujo de animaciones 2D en Unity con un grafo claro, transiciones precisas y parámetros bien definidos. Aquí verás cómo usar el Animator para alternar entre estados como idle, up, down, left y right, cómo evitar retrasos con Has Exit Time y cómo sincronizar todo desde el script con SetFloat y el Input Manager.
¿Cómo configurar el Animator de Unity para un personaje 2D?
Organizar bien el grafo facilita el mantenimiento y reduce errores. La idea es partir de un estado idle /ˈaɪdəl/ estático y transicionar según el movimiento del jugador.
¿Cómo organizar el grafo de animaciones?
Crea cinco animaciones: up, down, left, right e idle con una imagen estática.
Colócalas como una cruceta: down abajo, up arriba, left a la izquierda, right a la derecha, idle al centro.
Verifica que cada clip “se mueve” correctamente antes de conectar transiciones.
Evita “cajitas” amontonadas: deja espacio para leer el grafo.
¿Cómo definir el estado por defecto idle /ˈaɪdəl/?
Si el personaje arranca en down, cambiará siempre a mirar abajo.
Pulsa botón derecho en idle y elige Set as Default State.
El personaje permanecerá quieto hasta recibir entrada del usuario.
¿Qué parámetros y condiciones controlan las transiciones de animación?
La clave está en dos parámetros float del Animator que reflejan la entrada del jugador: horizontal y vertical. Ambos deben coincidir exactamente con los nombres del Input Manager.
¿Qué parámetros float usar en el Animator?
Crea un parámetro float: horizontal.
Crea un parámetro float: Vertical (V mayúscula, aprovechando los strings definidos).
Su rango es continuo entre −1 y 1.
¿Qué condiciones y umbrales activar para cada dirección?
De idle a up: Vertical > 0.5.
De up a idle: Vertical < 0.5.
De idle a right: horizontal > 0.5.
De right a idle: horizontal < 0.5.
De idle a down: Vertical < −0.5.
De down a idle: Vertical > −0.5.
De idle a left: horizontal < −0.5.
De left a idle: horizontal > −0.5.
Notas prácticas:
Son condiciones complementarias: cuando una es mayor, la otra es menor.
En total, deben quedar ocho transiciones conectadas con sus condiciones.
Alinea flechas para mantener el grafo legible.
¿Cómo evitar el delay por Has Exit Time?
El retraso al girar se debe a Has Exit Time activo en cada transición.
Desmarca Has Exit Time en las ocho transiciones.
Resultado: cambio inmediato al presionar arriba, abajo, izquierda o derecha.
¿Cómo sincronizar el script con el grafo de animaciones?
El Animator necesita recibir, fotograma a fotograma, los valores de los ejes. Para ello, se expone una referencia al componente y se actualizan los parámetros al final de Update.
¿Cómo declarar y obtener el componente Animator?
Declara una variable privada: Animator animator.
Inicialízala en Start con GetComponent<Animator>().
usingUnityEngine;publicclassPlayerControl:MonoBehaviour{privateAnimator animator;voidStart(){ animator =GetComponent<Animator>();}voidUpdate(){// Sincroniza parámetros con el Input Manager. animator.SetFloat("horizontal", Input.GetAxisRaw("horizontal")); animator.SetFloat("Vertical", Input.GetAxisRaw("vertical"));}}
¿Cómo queda la comunicación Animator–Input Manager?
El script envía horizontal y Vertical en tiempo real.
El Animator evalúa condiciones y dispara transiciones.
El movimiento del jugador se refleja en el grafo sin retardos.
Ideas clave que refuerzan buenas prácticas:
Usa idle como estado por defecto para arrancar en reposo.
Define umbrales claros (±0.5) para transiciones estables.
Mantén nombres de parámetros idénticos a los del Input Manager.
Desactiva Has Exit Time para respuestas inmediatas, común en RPGs.
Considera un blend tree más adelante para reducir el número de estados y flechas.
¿Te gustaría ver cómo montar ese blend tree y simplificar el grafo? Deja tus preguntas o dudas en los comentarios.
Por si alguno se pregunta por que se esta usando GetAxisRaw en vez de GetAxis:
GetAxisRaw te devolvera el valor inmediatamente en 1 o -1.
En cambio GetAxis devolvera el valor dependiendo de la fuerza que se le aplique al Joystick, usando este podemos hacer el efecto que normalmente vemos en juegos de consola como Assasin's Creed cuando queremos Caminar solo movemos la palanca un poquito en esa direccion.
En el caso de este juego no tiene mucho sentido que le apliquemos GetAxis porque no habran animaciones de Caminar o de Trotar, sin embargo si usamos GetAxis, la velocidad del jugador se graduara dependiendo de la sensibilidad del Joystick.
Edit: El efecto queda mejor con raw jajajaja
Exelente aporte bro :)
Para el movimiento del idle hice un ajuste pequeño pero para que no se vea tan tiezo
si les gusta les dejo un enlace
esta genial! le da mas vida al personaje quizá podrías agregarle una versión pestañeando
Cierto, buena idea, la verdad ya eran las 12 de la noche y no se me ocurrio
Resumen de la clase
El objetivo es combinar las animaciones del personaje.
OJO hay que crear una quinta animación, Player_idle con un Sprite del jugador de frente.
TRUCO: comprobar que las animaciones se reproducen
Abrimos WIndow > Animation > Animator. El consejo es colocar los estados según van, ejemplo Player_left a la izquierda...
Además pulsamos con el botón derecho sobre Player_Idle y ponemos Set as Default State. Con ello el jugador queda quieto al darle al Play.
Pulsamos el botón derecho y creamos transiciones entre Player_Idle y Player_Up. Nos creamos dos parámetros Horizontal y Vertical como floats
En la transición de Player_Idle a Player_Up ponemos la condición Vertical Greater 0.5 y de Player_Up a Player_Input ponemos Vertical Less 0.5. Entonces creamos todas las flechas y les añadimos las condiciones.
En el PlayerController tenemos la variable animator, iniciada en el Start con GetComponent.
Al final del Update usamos el animator SetFloat cambiando horizontal y vertical con los Inputs.
OJO porque las animaciones suelen tener un tiempo de salida que obliga a retardar las animaciones. Para quitarlo en cada una de las transiciones desmarcamos HasExitTime.
Entiendo es mucho mejor mover al personaje en el FixedUpdate y setear las animaciones en el LateUpdate.
El update está bien para captar los inputs del usuario pero no para el resto de cosas.
Most Valuable Gamer reportando.
Presente!
Aquí con los cambios agregados
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassPlayerController:MonoBehaviour{public float speed =4.0f;privateconst string horizontal ="Horizontal";privateconst string vertical ="Vertical";privateAnimator animator;// Start is called before the first frame updatevoidStart(){ animator =GetComponent<Animator>();}// Update is called once per framevoidUpdate(){// s = v*t;//Movimiento horizontalif(Mathf.Abs(Input.GetAxisRaw(horizontal))>0.5f){this.transform.Translate(newVector3(Input.GetAxisRaw(horizontal)*speed*Time.deltaTime,0,0));}//Movimiento verticalif(Mathf.Abs(Input.GetAxisRaw(vertical))>0.5f){this.transform.Translate(newVector3(0,Input.GetAxisRaw(vertical)*speed*Time.deltaTime,0));} animator.SetFloat(horizontal,Input.GetAxisRaw(horizontal)); animator.SetFloat(vertical,Input.GetAxisRaw(vertical));}}
Genial
Buenas, tengo el siguiente problema.
cuando inicio el juego, la animación de arranque es "Idle" como debe ser, pero se ejecuta una sola vez y luego se activa la animación "Left " , por que puede estar pasando esto si Idle esta seteada correctamente como el estado por Default.
Quizá es un error muy Obvio, pero ya lo revise varias veces y no logro encontrarlo.
La razón por la cual solo se repite una vez el Idle sea porque está desactivado el checkbox, has doble clic en la animación y comprueba que esté marcada la opción de Loop. Para lo de la animación a la izquierda, puede ser que esté mal configurada la condición.