Estoy empezando a usar Mecanim como
sistema de animación de movimiento. Y hoy voy a contar alguna de sus
bondades principales. Aunque habrá que empezar por explicar un poco
¿qué es mecanim?
Hay algo de confusión sobre esto, y
muchos hemos pensado que era lo que no era. Mecanim es la respuesta
de Unity ante la baja calidad de las animaciones de los juegos hecho
con Unity 3. Entonces, ¿se tienen mejores animaciones con Mecanim?
No, las animaciones serán las mismas pero se usarán mejor y será
más sencillo hacer cosas más complejas. Mecanim no es un sistema
para crear animaciones, sino para usarlas. Tendrás que darle las
animaciones hechas de forma externa exactamente igual que hasta
ahora. La novedad es que para usarlas en lugar de hacer todo por
código harás mucho con un editor visual y con muchas más opciones
y potencia.
Por poner un ejemplo avanzado de uso, imaginemos una animación de deslizarnos por el suelo para pasar por debajo de obstáculos. Aunque en la animación el personaje se agache, el collider seguirá siendo igual de alto y la física del juego no nos dejará pasar. A la vieja usanza tendríamos que ir chequeando en cada frame por qué parte de la animación nos llegamos, tener una tabla de valores e ir modificando la altura del collider según estos valores. Con Mecanim podemos pedir que nos haga una curva y retocarla, o hacerla nosotros a mano a lo largo de la animación y modificar el valor de un parámetro con esa curva. Así en código solo queda asignar la nueva altura del collider en cada frame. Puede sonar similar, pero una cosa supone bastante código, puede llegar a la hora de trabajo y el resultado será discreto; en el otro solo escribes 1-3 líneas de código, lo tienes en 2 minutos y el resultado será continuo. Si por alguna razón quieres que la animación vaya el doble de lento no tendrás que tocarlo, en el primer caso tendrías que volver a hacer todo.
A lo mejor este ejemplo era un poco
complejo de entrada, vamos con lo básico. Mecanim te permite
crear y controlar una máquina de estados finita de forma visual
para controlar el comportamiento de tu personaje. Bueno, de sus
animaciones, pero casi siempre su comportamiento estará relacionado
con una animación ¿no?. ¿Qué puede hacer un personaje? Estar
quieto, andar, correr, saltar, atacar, caerse, morir. Todos esos
estados están relacionados con animaciones, así que tiene sentido
llevarlos con una máquina de estados finita. Y Mecanim permite de
forma sencilla crear estados, asociar animaciones, poner las
transiciones de un estado a otro y sus condiciones, en base a unos
parámetros (que te inventas), y ya solo quedaría rellenar esos
parámetros desde tu código, casi siempre en relación a la entrada
de usuario (¿está el joystick hacia delante?, ¿ha pulsado el botón
de saltar?). También puedes acceder a los estados de la máquina
desde el código para hacer tu lógica. Por ejemplo al saltar, la
parte de subir la puedes saber a priori, pero no sabes cuanto caerás,
no es lo mismo saltar para llegar a un sitio más alto que para
despeñarse por algún lado, así que es normal tener las
comprobaciones de altura del personaje en código, solo si estás en
el estado de caer.
Así se pueden crear fácilmente
animaciones y transiciones al estilo Unity3. Aunque puedes controlar
mejor las transiciones con curvas, duración de la misma... Este tipo
de transiciones suelen ser para decisiones binarias: un botón está
pulsado o no, estás cayendo y has llegado al suelo o no... Hasta
aquí solo sería más cómodo.
Otra ventaja es que puedes crear capas
de animación. Imaginemos que hacemos un juego tipo metal slug, en
3d, o en 2d, da igual. Siempre podemos disparar y diferentes armas,
seguramente con animación diferente según qué arma. Y a la vez
podemos estar quietos, andando, corriendo, saltando, cayendo... Casi
cualquier arma de fuego supondrá solo animaciones de los brazos,
pero si lo hacemos de la forma tradicional, la combinación de
animaciones es brutal: andando sin disparar, andando disparando
pistola, andando disparando escopeta, saltando sin disparar, saltando
disparando pistola... Si hacemos la animación por capas podemos
combinar esos tipos de animaciones sin tener que realizar todas las
animaciones a mano. En una capa tendremos el movimiento neutral del
cuerpo (sin disparar) y en otra las animaciones de disparo, aplicadas
con una máscara solo a los brazos. Y así tendremos todas las
combinaciones de forma sencilla. De hecho ya estoy usando las capas.
Las animaciones de andar o correr normales me hacen cosas muy raras
en los dedos, así que tengo una capa solo para las manos, con una
animación de manos “tipo idle” para sobreescribir las
aberraciones de las demás animaciones en los dedos. Y es posible que
tenga que hacer otra capa para controlar el brazo de la espada y que
el personaje no se saque un ojo al hacer algunos movimientos.
Y por último por hoy, el blending de
animaciones. Una maravilla. Decía antes que las transiciones sirven
para eventos binarios, pero los joystick nos dan un continuo de
movimiento, incluso hay botones con recorrido. Y no debería ser lo
mismo la respuesta si tienes el joystick al 50% que a tope. En
tiempos de la PSX había juegos que si dabas un poco al joystick
andaban y a partir de cierto punto corrían, era binario igual, pero
con joystick. Yo digo controlar completamente la velocidad, que si
tengo un 20% de joystick hacia arriba se note la diferencia con un
40% y con un 80%. Y eso se hace con un blending tree en mecanim.
Hacemos que una animación compleja funcione como una fusión de
otras animaciones. Así para andar hacia delante pondremos dos
animaciones, andar y correr y según cuanto muevas el joystick tendrá
más peso una animación o la otra. Eso es lo que se ve en el vídeo,
lo suave que puede ser pasar de andar a correr.
Y eso que en mi juego el jugador va a
encarar inmediatamente la dirección de movimiento, lo cual lo hace
más sencillo, no anda hacia atrás ni nada así. En juegos más
realistas, además de movimiento hacia delante y hacia atrás,
tenemos el andar girando, no hay giro inmediato, esto supone tener 2
niveles de blending tree (y hablando solo de hacia delante). En el
primer nivel se hace el blending entre andar y correr, y en el nivel
inferior entre delante, delante izquierda y delante derecha. Por
ejemplo si tenemos el joystick dado a la mitad adelante y un poco a
la derecha: se hará en blending de andar: delante y derecha con más
peso de delante, luego el blending de correr: delante y derecha, con
más peso de delante, y luego blending del resultado de los dos al
50%, y eso será la animación final. Una animación cocinada con
otras 4 en tiempo real. Por eso el movimiento en los juegos realistas
actuales ha mejorado tanto.
Muy bueno :D
ResponderEliminar