Musica y explosiones un Unity.

La música o los efectos de sonido, son una parte muy importante de cualquier juego, estoy seguro que si alguna vez jugáis a vuestro juego preferido sin música la sensación y la experiencia será muy diferente y seguramente bastante mas pobre. La incorporación de efectos, como explosiones en Unity pueden hacer cambiar totalmente la concepción de un juego.

Este post forma parte del tutorial de desarrollo de juegos en Unity. En los post anteriores hemos creado la base del juego, con sus premios y enemigos. Si quiere empezar desde aquí puedes bajarte el fichero con el proyecto Unity con todas las modificaciones que hemos hecho por ahora: megafastball-premios.

Por ahora nuestro juego es un poco soso, vamos a decorarlo, a darle vidilla incorporando música, explosiones y dandole un poco de color.

Musica en Unity

En la creación de un juego hay muchos profesionales y muchos perfiles envueltos, uno de los principales es el del creador de la música, pero no tenemos que preocuparnos muchos juegos realizados por aficionados, utilizan recursos que se pueden encontrar libremente.

Buscar recursos para Unity

Para buscar la música a incorporar en los juegos, yo suelo usar las web’s:
www.freesound.org
www.newgrounds.com
incompetech.com
o como no, la tienda oficial de Assets de Unity.
Es muy normal no desarrollar todo nosotros a mano. Unity nos permite obtener recursos y usarlos.  Uno de los negocios más importantes es la creación de Assets para que los desarrolladores de juegos puedan usarlos.

No importa que web uséis, cada cual tendrá una favorita, o podemos utilizar una combinación de varias para obtener nuestros recursos musicales.

En esta ocasión para la música de fondo del juego he usado la web www.freesound.org y en su buscador he puesto: loop arcade retro, me ha devuelto una lista de resultados y he escogido un sonido llamado nihil2 loop.wav.

¿Como incorporar sonido de fondo a nuestro juego?

Primero una breve explicación de como funciona el audio en Unity. En cada escenario podemos tener un componente llamado Audio Listener, tan solo podemos tener uno activo. Normalmente lo asociamos a la cámara principal, es el responsable de recoger los sonidos generados por los otros componentes, siempre que estos componentes tengan asociado un Audio Source. Es decir, el Audio Listener recoge el sonido que generan los diferentes Audio Source. Lo que oye el usuario, nuestro player, es lo mismo que oye el Audio Listener. De esta forma el audio captado por el Audio Listener, es diferente dependiendo de la situación de los Audio Source en nuestra escena, es decir, escucharemos mas a los objetos cercanos que a los lejanos. Aparte que también tendremos sensación de la situación: escucharemos por la derecha los objetos que estén a la derecha y a la izquierda los objetos que estén en la izquierda.

El primer paso es incorporar el sonido que nos hemos bajado a nuestro proyecto, como ya sabéis esto es tan sencillo como arrastrar el fichero desde la carpeta en la que lo hemos bajado, hasta la carpeta en la que queremos ponerlo en la sección Project de nuestro Proyecto de Unity.

Fichero de sonido en Unity.
Arrastramos desde la carpeta download hasta nuestro Proyecto de Unity el fichero de sonido que queremos usar.

Ahora que ya tenemos el sonido, como hemos dicho necesitamos tener un objeto Audio Listener en nuestra cámara principal. Seleccionemos el Objeto Main Camera en la sección Project y veamos sus características en la sección inspector.

Audio Listener en Manin Camera
El componente Audio Listener de la cámara principal.

Nuestra cámara principal ya tiene un componente Audio Listener activado, no hace falta que hagamos nada, si el vuestro no esta activado activadlo marcando el check que hay al lado del nombre del componente.

Si ya tenemos el Audio Listener, lo que nos falta es configurar un Audio Source, para ello tendremos que añadir el componente al elemento Main Camera. Lo podemos añadir mediante el botón Add Component -> Audio -> Audio Source.

Mení Add Component -> Audio ->Audio Source
Añadiendo el Audio Source al componente Main Camera.

Una vez añadido el elemento nos aparecerá en la sección Inspector de Main Camera.
Tenemos que indicarle el audio a utilizar, y no olvidar que la música se tiene que repetir durante todo el juego, por lo que tenemos que marcar la casilla Loop.

Configuracion del Audio Source de Main Camera
El componente Audio Source configurado.

Podemos ajustar el volumen, y jugar con las diferentes opciones hasta que consigamos el efecto deseado. Con esto ya tendremos una musiquita de Arcade de fondo:

No esta mal, pero faltan algunos efectos, como por ejemplo un sonido cuando cogemos las monedas, o cuando chocan dos de los cubos, o cuando uno de los cubos acaba con nosotros. Estos sonidos los vamos a incoporar con las explosiones!
Necesitamos tres sonidos, que podemos buscar por las web’s que he indicado al principio del post, yo he escogido estos tres:

Incorporemos estos sonidos al proyecto igual que hemos hecho con el sonido ambiente, es decir, los arrastramos  desde la carpeta download hasta la carpeta correspondiente en la sección Project.

Creando explosiones en Unity.

Las explosiones en Unity se crean mediante el Particle System, es decir, sistema de partículas. Vamos a crear un nuevo System Particle para cada explosión que queremos introducir en el juego. Tenemos que pensar ¿Que objetos van a explotar? A mi me salen tres: las monedas, los cubos y el player.

Vamos a crear el primer Particle System, lo hacemos des de el menu create de la sección Hierarchy.

Menú desde el que creamos el Particle System.

Esta acción nos creará un elemento Particle System en nuestra Scene, lo podremos identificar inmediatamente porque estará lanzando partículas sin parar.

El Particle System funcionando en nuestra Scene.
Los puntos blancos son las partículas que lanza nuestro Particle System.

Le cambiamos el nombre, le ponemos: player_explosion. El apartado Inspector de nuestro Particle System es realmente inmenso, hay centenares de atributos que podemos modificar para dejar la emisión de partículas a lo que nosotros necesitemos. Vamos a tocar los siguientes:

  • Duration: Lo dejamos en 1 segundo.
  • Start Lifetime: 1 segundo.
  • Gravity: 0.7, para que las partículas se dirijan al suelo después de explotar.
  • Emission: Vamos a incorporar un Bursts, que indica las partículas que se lanzan al inicio. Para que no todas las explosiones sean iguales indicaremos un mínimo de 15 y un máximo de 30.
  • Shape: Seleccionaremos Hemisphere.
  • Size Over Lifetime: Lo activamos. Si pulsamos sobre el cuadrado de Size podremos jugar y cambiar el efecto de crecimiento de las partículas. Yo he modificado la curva para que las partículas primero crezca, para pasar a decrecer hasta desaparecer.

    La curva que he creado para la explosión.

  • Renderer Mode, lo cambiamos de BillBoard a Mesh, y como Mesh indicamos RollerBall. Así las partículas tendrán la forma de nuestra bola. También cambiamos el material para que use el mismo que nuestro Player.

Hasta aquí las modificaciones en el Particle System, aunque podemos estar horas jugando hasta que consigamos un resultado que nos guste. El siguiente paso es incorporar el sonido Player_explosión a la explosión . Tan sencillo como incorporar un Audio Source con el Botón Add Component y añadir el sonido que hemos encontrado para la explosión de la moneda.

Ya casi tenemos totalmente configurada nuestra explosión. Si la usamos así funcionaria, pero hay un problema de diseño que acabaría afectando al rendimiento de nuestro juego. Bueno, quizá la explosión de la moneda no, por que sucede justamente al final, pero si el usuario juega muchas partidas podría acabar afectando. Tenemos que eliminar nuestro objeto, para que no se quede ocupando memoria.

Los objetos en Unity ocupan memoria, se tiene que eliminar de ella los que ya no se van a usar en el juego. Si no los destruimos el juego acabaría por afectar al rendimiento del dispositivo en el que se esté ejecutando.

Com este problema lo vamos a tener muchas veces, vamos a crear un script que autodestruya los objetos. Este script podremos usarlo en todos aquellos objetos que tengan que tener un tiempo de vida limitado, como las explosiones.

Creando un script de autodestruccion de objetos en Unity

Con el objeto Player_Explosión seleccionado pulsamos sobre el botón Add Component de su zona Inspector y seleccionamos: new script.
Menú del botón Add Component con la opción Add Script seleccionada.
Al script lo llamamos Autodestrucción, y escogemos como lenguaje de programación C#. Pulsamos el botón Create and Add y nos creará un script vacío que asociará a nuestra explosión. Para editarlo tenemos que pulsar dos veces sobre su nombre y nos abrirá el editor de scripts de UNITY: Monodevelop.

using UnityEngine;
using System.Collections;
public class Autodestruccion : MonoBehaviour {
public float timeOut = 3.0f; //Variable que indica los segundos para la destrucción. 
public bool detachChildren = false; //En caso de que necesitemos destruir un objeto, pero que sus hijos aún esten en el juego. 
// se llama al crearse
void Awake () {
// Invocaremos al metodo de destrucción pasados los segundos indicados. 
Invoke ("DestroyNow", timeOut);
}
// Update is called once per frame
void Update () {
}
void DestroyNow ()
{
if (detachChildren) { // detach the children before destroying if specified
transform.DetachChildren ();
}
DestroyObject (gameObject);
}
}

En el script hemos definido dos variables publicas, que podremos modificar desde el editor de Unity. El funcionamiento del script es muy sencillo. La primera función a la que el motor de Unity llama es Awake. En esta función mediante Invoke, llamamos a la función que destruye el objeto: DestroyNow, como segundo párametro le pasamos la variable timeOut, que indica los segundos a esperar antes de llamar a DestroyNow.

Incorporando la explosión a nuestro Player.

Ya tenemos nuestro objeto explosión finalizado: Player_Explosion. Lo tenemos en el apartado Hierarchy, y lo podemos ver en nuestra Scene, aunque no es esto lo que esperamos. Queremos usarlo, pero no va a ser un objeto que esté en nuestra scene desde el principio como la Bola, o las monedas. Así que vamos a arrastrarlo a la sección de Project para crear un Prefab.

Los Prefab son como plantillas que podemos usarlas para crear objetos o usar en scripts. Los vimos en el post creando el mundo de nuestro arcade. Donde creamos varios Prefabs que después utilizamos.

Arrastramos Player_Prefab a Project para crear un Project

Una vez hemos creado el Prefab podemos borrar el Player_Explosión de Hierarchy para que desaparezca de nuestra Scene.

Ejecutando la explosión cuando nuestro objeto desaparece.

Para asociar la explosión con la desaparición de nuestro Player (la Bola), vamos a crear un Script. Será un script reutilizable, que lo vamos a incorporar a todos los elementos que tengan que explotar al desaparecer. Para crear el script nos situamos en el apartado inspector de nuestro objeto FastBall y pulsamos el botón Add Component para añadir un nuevo script, como ya hemos hecho anteriormente. Al script lo llamamos explosion, con el siguiente contenido:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class explosion : MonoBehaviour {
public GameObject explosionObject; //Para que se pueda indicar la explosion a ejecutar. 
void OnDestroy(){ //Esta funciona se llama cuando el objeto va a ser destruido. 
if (explosionObject!=null) { //Comprobamos de que se ha informado la Explosion. 
Instantiate (explosionObject, transform.position, Quaternion.identity); //Se ejecuta la explosion
}
}
}

Este script lo únicvo que hace es esperar la llamada al método OnDestroy, que Unity llama justo antes de destruir al objeto, y en este método instanciamos la explosión.

Creando mas explosiones.

Ahora ya tenemos completa la explosión de nuestro player, pero tenemos que preparar dos mas, la de las monedas y la de los enemigos. Para ello lo mejor es duplicar la explosión del Player, la seleccionamos y pulsamos Cmd+D en Mac o Ctrl+D en Windows.

La explosión de las monedas.

Lo primero que hacemos es coger uno de los elementos duplicados y le cambiamos el nombre, le llamamos Moneda_Explosion, y cambiamos alguno de sus valores.

Modificamos start_color
Cambiamos el Shape

Cambiamos el Shape, para ponerlo en Circle, que tiene una forma parecida a nuestra moneda.

Modificamos Audio Source y Renderer.

Modificamos Renderer, Seleccionando el nuevo Mesh y Material, para que coincidan con el de nuestra moneda. Por último le indicamos que fichero de sonido queremos usar en nuestro Audio Source.
Ahora solo tenemos que incorporar la explosión a nuestro Prefab que representa la moneda, lo seleccionas y incorporamos el Script explosion que hemos creado antes, y le asociamos su explosión, así de Fácil! Ya tenemos un script que nos permite asociar tantas explosiones como queramos.
Asociamos el script Explosion al Prefab Moneda.

La explosión de los enemigos / cubos.

Esto os toca a vosotros, aunque si os da pereza, ya sabeis que al final del post encontrareis un zip con los el proyecto en Unity con todas las modificaciones que hemos realizado.

¿Que hemos aprendido?

Sonido!!!! Hemos jugado con el sonido, sabemos lo que es un Audio Listener, un Audio Source, hemos buscado sonidos y los hemos usado en explosiones. Hemos trabajado con los sistemas de partículas para crear explosiones. Hemos creado Scripts, ya llevamos unos cuantos, y algunos son totalmente reutilizables en diferentes objetos, y incluso, en diferentes proyectos. Este post es muy largo, pero hemos avanzado bastante en nuestro juego, cada vez hace mejor pinta, pero tenemos que mejorarlo. En el próximo post decoraremos el escenario y le daremos un toque mas ochentero.

Podeis descargar el archivo con el proyecto Unity con todas las modificaciones de este post en este link: megafastball_conexplosiones.

Next: Mejoramos el escenario de nuestro juego.

Comentarios.