Comunidad orientada al desarrollo de videojuegos

Unity3D–Eventos en animaciones

En muchas ocasiones, me he preguntado como hacer que ocurra una determinada acción el un momento concreto de una animación. En Unity3D hay varias opciones, entre ellas la de crear un controlador y dependiendo  del timeline de una animación, ejecutar la acción que queramos. Pero Unity nos proporciona una herramienta con la que nos será mucho mas fácil crear eventos en el fotograma exacto de una animación de una manera bastante fácil.

Necesitamos un modelo animado para poder probar los eventos, cualquier modelo con animaciones nos valdría, yo he usado uno que podemos descargar gratuitamente del Assets Store:

https://www.assetstore.unity3d.com/#/content/3174

 

Lo que vamos a hacer, es reproducir un sonido de pisadas en la nieve en el momento justo de la animación en el que los pies están en la posición de apoyo en el suelo. Así que también podemos descargarnos este sonido:

https://db.tt/qhP8JrFW

 

Bueno, ya estamos listos para empezar. Lo primero que haremos será, convertir nuestro fichero de audio a un audio 3D, si aun no lo es, marcando el check “3D Sound”. De esta forma, tendrá en cuenta como se oirá dependiendo de donde este el Audio Listener:

image

Ahora añadiremos el componente “Audio Source”  a nuestro modelo y arrastramos el fichero de sonido a la casilla de “Audio Clip”, para poder reproducir el sonido desde el modelo allí donde esté.

imageimage

 

Bien, ya esta listo para reproducir audio. Vamos a preparar el Script que recibirá los eventos que se ejecutan en al animación. Lo que necesitamos ralamente, es crear los métodos que vayamos a necesitar, mas adelante se llamaran a esos métodos desde los eventos de la animación. Así pues, nos creamos un método que reproduzca el sonido que hemos asignado.

   1: void StepSound()

   2: {

   3:     audio.Play();

   4: }

 

Bastante sencillo, ¿verdad? Arrastramos el Script y se lo asignamos a nuestro modelo en la escena, para que sea visible desde la animación.

Lo siguiente que vamos a hacer, será, con el modelo seleccionado, abrir la ventana de animación desde el menú Windows->Animation o pulsando Ctrl+6

image

 

Bien, esta ventana será nueva para muchos. Desde aquí podemos crear y modificar animaciones, entre otras cosas. Como veis en la imagen, hay un desplegable con todas las animaciones del modelo seleccionado. Este modelo ha sido importado desde un FBX y al parecer, las animaciones han sido exportadas como solo lectura (Read-Only). Así que vamos a tener que duplicar la animación a la que le queramos asignar algún evento.

 

image

 

Una vez duplicada(Ctrl+D) la animación (runEvent en mi caso) que queremos usar para crear los eventos, tenemos que añadirla a la lista de animaciones del modelo. Incrementamos en uno el tamaño del la lista y arrastramos la nueva animación sobre el nuevo espacio vacío de la lista. También la arrastraremos al hueco de “Animation” para que se ejecute esa animación por defecto al arrancar el juego.

 

image

 

Ya podemos seleccionar la nueva animación en el desplegable de la ventana de animaciones y veremos que ya tenemos derechos de escritura..

image

 

Puesto que vamos a modificar la animación introduciendo eventos, le damos al botón de edición de la animación, que es el de grabar. Ahora, a la derecha, veremos una barrita roja, que podemos pinchar y arrastrar a lo largo del timeline y veremos como avanza la animación. Yo me he posicionado en el fotograma numero 2, que me ha parecido un buen sitio para que suene el sonido de pisada.

image

 

Cuando ya estamos posicionados en el momento adecuado de la animación, pulsamos el botón de añadir evento, ¡una sola vez! Si clickamos mas veces, se crearan varios eventos y será muy dificil gestionarlos.

image

 

Si nos fijamos en la ventana del TimeLine, veremos que se ha creado una barrita que representa que al evento gráficamente. Y si hacemos click, se abrirá la ventana de edición de ese evento en la que aparecerá un desplegable con todas las funciones validas de los script asociados al nuestro GameObject. Ok, pues seleccionamos nuestro método, “StepSound”

image

 

Ya tenemos el evento para el paso con el pie derecho asignado a nuestro método que ejecuta el sonido de la pisada, vamos a hacer lo mismo con el pie izquierdo. A mi me parece que el fotograma 15, es el idóneo para el sonido del paso con el pie izquierdo. Añadimos el evento, una sola vez, y le asignamos la misma función que antes.

image

 

Si todo ha ido bien, al ejecutar el juego, ya deberíamos oír el sonido de las pisadas en el momento donde hemos asignados los eventos.

Vamos a ir un poco mas lejos, vamos a hacer que se levante una nube de polvo/nieve en el momento en el que pisa y en el lugar donde lo hace con cada pie. Nos descargamos una paquete con las partículas que simularan el efecto:

https://db.tt/bIi2jXb6

 

Vamos a necesitar un target para saber donde crear la instancia del GameObject de las partículas, para ellos, nos creamos un GameObject vacío, los nombramos descriptivamente para saber que es el target donde crear las partículas, y como vamos a usar su orientación y actualmente las partículas van para delante, lo giramos 180 grados en “Y”.

image

 

Muy bien, ahora lo duplicamos y lo renombramos para tener un target de referencia para cada uno de los pies.

image

 

Ok, necesitamos las referencias a los targets y al GameObject que queremos instanciar en el Script, también necesitaremos saber con que pie esta pisando en cada momento para saber en que target crear la instancia del GameObject de partículas. Para ello, nos creamos 3 variables publicas NieveEffect, del tipo GameObject que representara a las partículas y luego los 2 pies, del tipo Transform, ya que solo nos interesa la posición  y orientación en la que están.

Puesto que también necesitaremos saber con que pie esta pisando, le añadimos un parámetro a nuestra función que será llamada en el evento. Con un entero (int) será suficiente para distinguir que pie es. Hay que tener cuidado, ya que las funciones de los eventos en animaciones, no soportan la sobrecarga de métodos, así que si debemos usar la misma función de antes y añadirle el parámetro. Los tipos que soporta como parámetro son int, string, float y referencia a objetos.

Suponiendo que el pie 1 será el derecho, controlamos con un “if” donde creamos la instancia de la partícula de nieve, usando la posición y rotación de cada pie.

   1: public GameObject NieveEffect;

   2:  

   3: public Transform pieDerecho;

   4: public Transform pieIzquierdo;

   5:  

   6: void StepSound(int Pie)

   7: {

   8:     audio.Play();

   9:  

  10:     if (Pie == 1)

  11:         Instantiate(NieveEffect, pieDerecho.position, pieDerecho.rotation);

  12:     else

  13:         Instantiate(NieveEffect, pieIzquierdo.position, pieIzquierdo.rotation);

  14:  

  15: }

 

Ahora que lo tenemos todo preparado, vamos a seleccionar el modelo que tenia los eventos y abrimos la ventana de animación de nuevo, si hacemos click en cada uno de los eventos, veremos que las funciones tiene parámetro y podemos ponerle a cada parámetro el valor que queramos. En nuestro caso, a la primera, pie derecho, le asigno un 1 y a la segunda un 2.

 

image

 

¡Ya esta todo listo para probar nuestros eventos!

Podéis probar el resultado final aquí:

https://db.tt/N0q9qYxt

Y descargar el proyecto desde aquí:

https://db.tt/EvpV9dwI

¡Espero que os haya gustado, un saludo!

, , , ,

One thought on “Unity3D–Eventos en animaciones

  • Starky says:

    Gran tutorial, precisamente estaba implementando algo del estilo y me ha ayudado mucho!!

    Muchas gracias y a seguir así 😀

Leave a Reply