How do I use an Animator Controller in Unity?

Domina el Animator Controller de Unity

27/05/2013

Valoración: 4.22 (7748 votos)

Dar vida a los personajes y objetos en un videojuego es uno de los pilares fundamentales para crear una experiencia inmersiva y atractiva. En Unity, el sistema de animación es increíblemente potente, y su núcleo es una herramienta llamada Animator Controller. Piénsalo como el cerebro que dirige una orquesta de movimientos; decide qué animación reproducir, cuándo hacerlo y cómo pasar suavemente de una a otra. Si alguna vez te has preguntado cómo hacer que un personaje camine, salte, ataque y vuelva a un estado de reposo de forma fluida, estás en el lugar correcto. Esta guía te llevará desde los conceptos más básicos, como la creación de tu primer clip de animación, hasta técnicas avanzadas como el control de transiciones mediante código C# y la sincronización de eventos.

How to modify animatorcontroller through script and save it?
Modify AnimatorController through script and save it? It load a AnimatorController from selection and found state1 and add transition to state2, then save this AnimatorController. Very simple. These code add transition succesfully,animator inspector shows it.
Índice de Contenido

Entendiendo las Herramientas: Animation vs. Animator

Antes de sumergirnos en la práctica, es crucial diferenciar las dos ventanas principales con las que trabajaremos: la ventana de Animación (Animation) y la ventana del Animador (Animator). Aunque sus nombres son similares, sus funciones son distintas y complementarias.

  • Ventana de Animación (Animation): Aquí es donde se crean y editan los clips de animación individuales. Un clip de animación es una secuencia de movimiento para un objeto, como "caminar", "correr" o "atacar". En esta ventana, trabajas con una línea de tiempo y keyframes para definir cómo cambian las propiedades de un objeto (posición, rotación, escala, color de un material, etc.) a lo largo del tiempo. Solo puedes ver y editar un clip a la vez.
  • Ventana del Animador (Animator): Esta es la ventana donde se gestiona la lógica general. Muestra el Animator Controller como una máquina de estados visual. Aquí no editas los movimientos individuales, sino que organizas los clips que creaste en la ventana de Animación. Defines estados (por ejemplo, "Estado Ocioso", "Estado Caminando") y creas transiciones entre ellos, estableciendo las reglas que dictan cuándo un personaje debe dejar de estar ocioso y empezar a caminar.

Tabla Comparativa Rápida

CaracterísticaVentana de Animación (Animation)Ventana del Animador (Animator)
Propósito PrincipalCrear y editar clips de animación individuales.Gestionar la lógica y las transiciones entre clips.
Elemento CentralLínea de tiempo y Keyframes.Máquina de Estados (States y Transitions).
Unidad de TrabajoAnimation Clip (.anim).Animator Controller (.controller).
¿Se usa código aquí?No directamente, pero se pueden añadir Eventos de Animación que llaman a funciones de código.No directamente, pero se controla mediante código al modificar sus parámetros.

Creando tu Primera Animación: Manos a la Obra

La teoría está muy bien, pero la mejor forma de aprender es haciendo. Vamos a crear una animación simple desde cero.

  1. Prepara la Escena: Crea un nuevo proyecto en Unity o abre uno existente. En tu escena, crea un objeto 3D simple, como un Cubo (GameObject > 3D Object > Cube).
  2. Abre la Ventana de Animación: Con el Cubo seleccionado en la jerarquía, ve al menú superior y selecciona Window > Animation > Animation. También puedes usar el atajo Ctrl+6.
  3. Crea el Clip: La ventana de Animación te mostrará un mensaje indicando que el objeto seleccionado no tiene animaciones. Haz clic en el botón "Create". Se abrirá una ventana para que guardes tu nuevo clip de animación. Nómbralo, por ejemplo, "RotacionCubo.anim".

¡Atención a lo que acaba de suceder! Unity ha hecho tres cosas automáticamente por ti:

  1. Ha creado el archivo de Animation Clip ("RotacionCubo.anim").
  2. Ha creado un archivo de Animator Controller (con el mismo nombre que tu objeto, por ejemplo, "Cube.controller").
  3. Ha añadido un componente Animator a tu Cubo en el Inspector y le ha asignado automáticamente el Animator Controller que acaba de crear.

Grabando el Movimiento

Ahora estás listo para animar. La ventana de Animación tiene una línea de tiempo y un modo de grabación.

  1. Activa el Modo Grabación: Haz clic en el círculo rojo en la parte superior izquierda de la ventana de Animación. La línea de tiempo se teñirá de rojo, indicando que estás en modo de grabación (auto-key mode). En este modo, cualquier cambio que hagas en las propiedades "animables" del objeto se registrará como un keyframe en la posición actual de la línea de tiempo.
  2. Define el Estado Inicial: La línea de tiempo está en el segundo 0:00 por defecto. No necesitas hacer nada aquí, ya que Unity registrará el estado actual (rotación 0,0,0) como el primer keyframe.
  3. Define el Estado Final: Arrastra la línea blanca vertical (el cabezal de reproducción) en la línea de tiempo hasta la marca de 1:00 (1 segundo).
  4. Modifica la Propiedad: Con el cabezal en 1:00, selecciona el Cubo en la vista de Escena y rótalo, o ve al Inspector y cambia los valores de Rotación en su componente Transform (por ejemplo, pon 360 en el eje Y). Verás que Unity crea automáticamente nuevos keyframes en la línea de tiempo para la propiedad de rotación.
  5. Desactiva la Grabación y Prueba: Vuelve a hacer clic en el círculo rojo para salir del modo de grabación. Ahora puedes usar los controles de reproducción (el botón de play) en la ventana de Animación para previsualizar tu animación. ¡Verás al cubo girar 360 grados en un segundo!

La Máquina de Estados: El Animator Controller en Acción

Ahora que tenemos un clip, es hora de visitar la ventana del Animador (Animator). Seleccióna tu Cubo y ve a Window > Animation > Animator. Lo que verás es un diagrama de flujo visual.

Verás tres cajas: "Entry", "Any State" y una con el nombre de tu clip ("RotacionCubo"), que está de color naranja. "Entry" es el punto de partida; la flecha que va de "Entry" a tu clip significa que "RotacionCubo" es el estado por defecto. Cuando el juego comience, esta será la primera animación que se ejecute. El color naranja lo confirma.

How do I create a runtime animator controller?
Create Animator Controller: Create a new RuntimeAnimatorController asset in your project by right-clicking in the Project window, and then selecting Create -> Animator Controller. Add Animation Clips: Double-click the newly created animator controller asset to open it in the Animator window.

Añadiendo un Segundo Estado y Transiciones

Una sola animación no es muy útil. Vamos a crear una segunda para ver cómo funcionan las transiciones.

  1. Crea un Nuevo Clip: Selecciona el Cubo. En la ventana de Animación, haz clic en el menú desplegable donde aparece "RotacionCubo" y selecciona "[Create New Clip...]". Nómbralo "CambioEscala.anim".
  2. Anima la Escala: Repite el proceso de grabación. En el segundo 0:00, deja la escala en (1, 1, 1). En el segundo 1:00, cambia la escala a (2, 2, 2). Luego, en el segundo 2:00, vuelve a ponerla en (1, 1, 1). Esto hará que el cubo crezca y luego vuelva a su tamaño original.
  3. Crea la Transición: Vuelve a la ventana del Animator. Ahora verás dos estados: "RotacionCubo" y "CambioEscala". Para pasar de la rotación al cambio de escala, haz clic derecho en el estado "RotacionCubo", selecciona "Make Transition" y luego haz clic en el estado "CambioEscala". Aparecerá una flecha blanca conectando ambos.
  4. Crea la Transición de Vuelta: Haz lo mismo en la dirección opuesta: clic derecho en "CambioEscala", "Make Transition" y clic en "RotacionCubo".

Si ahora le das al Play en Unity, verás que el cubo rota, luego cambia de escala, luego vuelve a rotar, y así sucesivamente. Esto se debe a que, por defecto, una transición se activa cuando el estado de origen ha terminado de reproducirse (gracias a una opción llamada "Has Exit Time").

Control Inteligente con Parámetros y Scripts

Hacer que las animaciones se reproduzcan en un bucle fijo no es lo que normalmente queremos en un juego. Queremos control. Queremos que el personaje salte solo cuando el jugador presione un botón. Aquí es donde entran en juego los parámetros.

Los parámetros son variables que creas dentro del Animator Controller y que puedes modificar desde un script para controlar el flujo de la máquina de estados.

Tipos de Parámetros

  • Float: Un número con decimales. Útil para cosas como la velocidad de un personaje (un valor de 0.0 es estar quieto, 0.5 es caminar, 1.0 es correr).
  • Int: Un número entero. Útil para representar estados específicos, como un tipo de ataque (1 = ataque ligero, 2 = ataque pesado).
  • Bool: Un valor de verdadero o falso. Perfecto para estados binarios como "isJumping" (¿está saltando?) o "isGrounded" (¿está en el suelo?).
  • Trigger: Un tipo especial de booleano que se restablece automáticamente a falso después de ser consumido por una transición. Es ideal para eventos de una sola vez, como "Jump" o "Attack".

Usando un Trigger para Controlar la Transición

Vamos a modificar nuestro ejemplo para que el cambio de animación solo ocurra cuando nosotros queramos.

How do I use an Animator Controller in Unity?
An Animator Controller in Unity is used to manage Animation Clips and the Transitions between them for a gameObject (or character). You can use it to tell your gameObject which animation to play based on conditions that you specify.
  1. Crea el Parámetro: En la ventana del Animator, ve a la pestaña "Parameters" en la esquina superior izquierda. Haz clic en el botón "+" y selecciona "Trigger". Nómbralo "CambiarAnimacion".
  2. Añade la Condición: Selecciona la flecha de transición que va de "RotacionCubo" a "CambioEscala". En el Inspector, verás una sección llamada "Conditions". Por defecto está vacía. Haz clic en el "+" y se añadirá automáticamente tu trigger "CambiarAnimacion".
  3. Haz lo mismo para la otra transición: Selecciona la flecha que va de "CambioEscala" a "RotacionCubo" y añade la misma condición.
  4. Desactiva "Has Exit Time": En ambas transiciones, desmarca la casilla "Has Exit Time". Esto es importante. Si está marcada, la transición solo podrá ocurrir después de que la animación actual termine. Al desmarcarla, le decimos a Unity que la transición puede ocurrir en cualquier momento, siempre que se cumpla la condición del trigger.

Si ahora ejecutas el juego, el cubo solo rotará sin parar. La transición no se activará hasta que el trigger "CambiarAnimacion" sea llamado.

Controlando el Trigger desde un Script C#

El último paso es activar ese trigger desde el código.

  1. Crea un Script: En tu ventana de Proyecto, crea un nuevo script de C# llamado "ControladorCubo".
  2. Edita el Script: Abre el script y reemplaza su contenido con el siguiente código:
using UnityEngine; public class ControladorCubo: MonoBehaviour { private Animator miAnimator; // Start is called before the first frame update void Start() { // Obtenemos la referencia al componente Animator del objeto miAnimator = GetComponent<Animator>(); } // Update is called once per frame void Update() { // Si el jugador presiona la barra espaciadora if (Input.GetKeyDown(KeyCode.Space)) { // Activamos el trigger en el Animator Controller miAnimator.SetTrigger("CambiarAnimacion"); } } }
  1. Asigna el Script: Arrastra el script "ControladorCubo" sobre tu objeto Cubo en la jerarquía o en el Inspector.

Ahora, al ejecutar el juego, el cubo rotará. Pero cada vez que presiones la barra espaciadora, ¡activarás el trigger y cambiarás a la otra animación!

Eventos de Animación: Sincronizando Sonidos y Efectos

A veces necesitas que ocurra algo en un punto exacto de una animación. Por ejemplo, que suene un paso justo cuando el pie del personaje toca el suelo. Para esto existen los Animation Events.

Un evento de animación te permite llamar a una función pública en cualquier script que esté en el mismo GameObject en un frame específico de la animación.

  1. Prepara la Función: Abre tu script "ControladorCubo" y añade una nueva función pública:
public void MensajeDesdeAnimacion(string mensaje) { Debug.Log("Evento de animación disparado: " + mensaje + " en el tiempo: " + Time.time); }
  1. Añade el Evento: Selecciona tu Cubo. Abre la ventana de Animación y asegúrate de que el clip "RotacionCubo" esté seleccionado. Mueve el cabezal de reproducción a un punto intermedio, por ejemplo, 0:30. Justo encima de la línea de tiempo, verás una pequeña barra para eventos. Haz clic derecho en esa barra y selecciona "Add Animation Event".
  2. Configura el Evento: Aparecerá un pequeño marcador azul en la línea de tiempo. Con ese marcador seleccionado, mira en el Inspector. Verás un campo "Function" con un menú desplegable. Selecciona tu nueva función "MensajeDesdeAnimacion". Debajo, podrás rellenar el parámetro de tipo string. Escribe algo como "Mitad de la rotación".

Ahora, cuando ejecutes el juego, cada vez que la animación de rotación pase por el segundo 0.5, se llamará a esa función y verás tu mensaje en la consola de Unity. ¡Las posibilidades para sincronizar efectos de partículas, sonidos o cualquier otra lógica son infinitas!

Preguntas Frecuentes (FAQ)

¿Puedo animar algo más que la posición, rotación y escala?
¡Absolutamente! Puedes animar casi cualquier propiedad pública de cualquier componente en un GameObject. Esto incluye colores de materiales, intensidad de luces, valores en tus propios scripts, activar y desactivar componentes, y mucho más. Simplemente haz clic en el botón "Add Property" en la ventana de Animación para ver todo lo que puedes animar.
Mi animación se reproduce en bucle, ¿cómo hago para que se reproduzca solo una vez?
Selecciona el archivo del Animation Clip (.anim) en tu ventana de Proyecto. En el Inspector, verás una opción llamada "Loop Time". Desmárcala y la animación se reproducirá una sola vez cuando se active su estado.
¿Qué es un `RuntimeAnimatorController`?
Es el nombre técnico del archivo de Animator Controller que has estado usando. El término "Runtime" (tiempo de ejecución) se debe a que puedes cambiar este controlador en un objeto mediante código durante el juego. Esto es útil para cambiar completamente el conjunto de animaciones de un personaje, por ejemplo, si recoge un arma y necesita un nuevo set de movimientos.
¿Por qué mi transición no se activa cuando presiono el botón?
Las razones más comunes son: 1) El nombre del parámetro en el script (`SetTrigger("MiTrigger")`) no coincide exactamente con el nombre en la ventana del Animator (es sensible a mayúsculas). 2) La transición todavía tiene "Has Exit Time" activado y la animación de origen no ha terminado. 3) El script no está asignado al GameObject correcto, o el GameObject no tiene un componente Animator.

Si quieres conocer otros artículos parecidos a Domina el Animator Controller de Unity puedes visitar la categoría Juegos.

Subir