Cambio de Animaciones de Personaje con Animator en Unity

Clase 12 de 53Curso de C# para Videojuegos

Resumen

Logra que el salto y las transiciones de tu personaje se vean fluidas y profesionales. Aquí aprenderás a cambiar estados del Animator con variables booleanas, a configurar valores iniciales y a actualizar animaciones en tiempo real desde C#. Todo partiendo del flujo típico en Unity con Awake, Start y Update.

¿Cómo sincronizar el salto con el animator?

Para que el personaje no siga con la animación de correr al saltar, hay que modificar estados del animation controller usando las variables booleanas definidas en el Animator (por ejemplo, "isAlive" e "isOnTheGround"). La clave está en referenciar la componente Animator y actualizar sus parámetros según el estado del juego.

  • Accede a la componente del GameObject en Awake con GetComponent.
  • Usa SetBool para configurar parámetros booleanos del Animator.
  • Evita ligar las animaciones a entradas de usuario dentro de un if aislado; actualiza el estado en cada Update.

Ejemplo base en C#:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    Animator animator; // Por defecto es privada si no se especifica.

    const string STATE_ALIVE = "isAlive";
    const string STATE_ON_THE_GROUND = "isOnTheGround";

    void Awake()
    {
        animator = GetComponent<Animator>();
    }

    void Start()
    {
        // Configuración inicial de estados.
        animator.SetBool(STATE_ALIVE, true);        // Empieza vivo.
        animator.SetBool(STATE_ON_THE_GROUND, false); // Según el punto de inicio.
    }

    void Update()
    {
        // Actualiza el estado de suelo cada frame, fuera de condiciones de input.
        animator.SetBool(STATE_ON_THE_GROUND, IsTouchingTheGround());
    }

    bool IsTouchingTheGround()
    {
        // Implementación existente que devuelve true/false.
        return false; // Placeholder: tu lógica real de colisión.
    }
}

¿Qué constantes y convenciones mejoran la claridad?

Usar constantes de tipo string para los nombres de parámetros del Animator es una práctica simple y efectiva. Así evitas errores por escritura y centralizas cualquier cambio de nombre.

  • const indica un valor que no cambia en ejecución.
  • Convención de constantes: MAYÚSCULAS_CON_GUIONES_BAJOS para legibilidad.
  • Los valores deben coincidir exactamente con los nombres del Animator: "isAlive" y "isOnTheGround".
  • La palabra private es redundante si no especificas modificador: el campo sigue siendo privado.

Beneficios directos: - Menos errores por typos en SetBool. - Código más fácil de leer y mantener. - Cambio de nombres centralizado en una sola línea.

¿Cómo actualizar el estado en tiempo real y pausar el salto?

El método que determina si el personaje toca el suelo devuelve un booleano. Usa ese valor directamente para sincronizar el parámetro del Animator en cada Update. De este modo, el grafo de animaciones hace la transición correcta.

  • Actualiza isOnTheGround cada frame con el resultado de IsTouchingTheGround().
  • Si la animación de salto está en bucle y no encaja, hay dos alternativas comunes: reducir su velocidad o pausar la animación durante el salto.

Pausar/reanudar desde el método de contacto con el suelo:

bool IsTouchingTheGround()
{
    bool touching = /* tu cálculo de colisión */;

    if (!touching)
    {
        // Pausa la animación en el último frame de salto.
        animator.enabled = false;
    }
    else
    {
        // Reanuda la animación al tocar suelo.
        animator.enabled = true;
    }

    return touching;
}

Recomendaciones prácticas: - Guarda el script antes de probar. Usa Command+S o Control+S. - Prueba con Play y verifica que el salto cambia de estado y vuelve a correr al tocar el suelo. - Ajusta velocidad o pausa según el efecto visual que busques.

Habilidades y conceptos puestos en práctica: - Control de estados con Animator y SetBool. - Uso de Awake, Start y Update para ciclo de vida. - Gestión de constantes string para parámetros del Animator. - Convenciones de nombres: camelCase vs MAYÚSCULAS_CON_GUIONES_BAJOS. - Lógica booleana para detección de suelo en IsTouchingTheGround(). - Alternativas visuales: bajar velocidad o pausar con animator.enabled.

¿Tú qué prefieres para el salto: reducir velocidad o pausar la animación? Comparte tu enfoque y por qué te funciona mejor.