Diferencia entre revisiones de «Unity Audio - Efectos de Sonido»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 142: Línea 142:
  
 
<br />
 
<br />
* Siguiendo con nuestro ejemplo:
+
* Siguiendo con nuestro ejemplo, vamos a realizar las siguientes modificaciones:
 +
:* Eliminamos el componente Audio Listener de la Main Camera.
 +
:* Agregamos el componente 'Audio Listener' a la bala (el GameObject Cápsule).
 +
:* Con el audio de la música de fondo añadida a la cámara, cambiamos la prioridad al valor 0, que se inicie al cargar la escena y que se repita.
 +
:* Hacemos que Unity cargue la música de fondo comprimida en memoria.
 +
:* Hacemos que el sonido sea 3D y con una curva lineal entre 5 y 20 metros.
 +
:* Probaremos el juego y escucharemos como la música de fondo cambia su volumen al mover la cápsula (mover la cápsula manualmente estando en ejecución).
 +
:: <u>Nota:</u> Esto será así dependiendo de la distancia de la cámara a la cápsula. Ajustar vuestra escena para que esté a unos 5-10 metros cuando la cápsula choque con el cubo.
  
 +
<gallery caption="Solución Ejercicio propuesto" widths="350" heights="300px" perrow="2">
 +
Image:Unity3d_audio_15.jpg| Eliminamos el componente 'Audio Listener' de la cámara.
 +
Image:Unity3d_audio_16.jpg| Lo añadimos a la cápsula.
 +
Image:Unity3d_audio_17.jpg| Ajustamos los parámetros del 'Audio Source'
 +
Image:Unity3d_audio_18.jpg| Ajustamos los parámetros del 'Audio Clip'.
 +
Image:Unity3d_audio_19.jpg| Al ejecutar el juego puede que comprobéis que no suena la música de fondo. Eso será debido a que la distancia entre la bala y la cámara no está dentro del rango 5-20 metros que establecimos que es cuando se empezará a escuchar. Podemos visualizar la distancia con respecto a la curva de sonido de la música de fondo en ejecución. Ejecutar el juego y sobre la cámara vamos a hacer que la ventana inspector no cambie al pulsar otro GameObject.
 +
Image:Unity3d_audio_20.jpg| Ahora pulsamos sobre la cápsula en la vista escena y la movemos manualmente para acercarla a la cámara. Podemos comprobar como aparece una línea roja vertical que indica la distancia de la cámara (Audio Clip con la música de fondo) al 'Audio Listener'. Acordaos de desbloquear la ventana de Inspector cuando paréis la ejecución.
 +
</gallery>
  
 +
 +
* Como la música de fondo queremos que suene igual en todas partes, vamos a cambiar el tipo de audio a 2D (hacerlo).
 +
 +
 +
 +
* Seguimos con nuestro ejemplo:
 
: Vamos a añadir a la cápsula un [https://wiki.cifprodolfoucha.es/index.php?title=Unity_Gravedad._RigidBody#Fuerzas_constantes componente 'Constant Force'], que vamos a deshabilitar por ahora, con un valor de 10 en Force, así como un script de nombre 'UD3_Audio_GestionarBala':
 
: Vamos a añadir a la cápsula un [https://wiki.cifprodolfoucha.es/index.php?title=Unity_Gravedad._RigidBody#Fuerzas_constantes componente 'Constant Force'], que vamos a deshabilitar por ahora, con un valor de 10 en Force, así como un script de nombre 'UD3_Audio_GestionarBala':
 
[[Imagen:Unity3d_audio_10.jpg|300px|center]]
 
[[Imagen:Unity3d_audio_10.jpg|300px|center]]
Línea 170: Línea 191:
 
     void Update()
 
     void Update()
 
     {
 
     {
         if (Input.GetAxis("Fire1")>0)
+
         if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
 
         {
 
         {
 
             fuerza.enabled = true;
 
             fuerza.enabled = true;
Línea 181: Línea 202:
 
: Lo que hace dicho script es que al pulsar disparo, habilita el componente 'ConstantForce' y por lo tanto la cápsula se moverá en el Eje-X hasta chocar con el Cubo.
 
: Lo que hace dicho script es que al pulsar disparo, habilita el componente 'ConstantForce' y por lo tanto la cápsula se moverá en el Eje-X hasta chocar con el Cubo.
  
 +
* Ahora vamos a modificar la escena para que parezca que estamos en juego de tipo Shooter en primera persona.
 +
: Vamos a colocar la bala delante de la cámara y vamos a quitar el 'Audio Listener' de la bala y lo vamos a añadir a la cámara como estaba antes.
 +
: Puede ser que necesitéis cambiar el eje del componente Constant Force de la cápsula para que vaya hacia adelante.
 +
[[Imagen:Unity3d_audio_23.jpg|500px|center]]
 +
 +
 +
 +
 +
<gallery caption="Añadiendo audio de disparo" widths="350" heights="300px" perrow="2">
 +
Image:Unity3d_audio_11.jpg| Lo que vamos a hacer ahora es añadir el componente 'Audio Source' a la cápsula para que pueda reproducir el sonido de disparo. Para ello podemos pulsar el botón '''Add Component''' => '''Audio''' => '''Audio Source''' o bien arrastrar el audio que queramos reproducir al GameObject.
 +
Image:Unity3d_audio_21.jpg| Modificamos las propiedades para que sea un sonido 3D con una caída de sonido a media que la distancia aumenta (entre 0-3 metros)
 +
Image:Unity3d_audio_22.jpg| Modificamos el 'Audio Clip' y modificamos el formato de compresión a ADPCM.
 +
</gallery>
 +
 +
 +
* Modificamos el script para que suene el disparo:
 +
: Script '''UD3_Audio_GestionarBala''':
 +
<syntaxhighlight lang="java" line enclose="div" highlight="7">
 +
    // Update is called once per frame
 +
    void Update()
 +
    {
 +
        if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
 +
        {
 +
            fuerza.enabled = true;
 +
            audioSource.Play();
 +
        }
 +
       
 +
    }
 +
</syntaxhighlight>
 +
 +
 +
: Probar a ejecutar el juego y disparar.
 +
 +
 +
 +
* Ahora sólo nos queda la explosión y que la bala desaparezca cuando choque contra el cubo.
 +
: Aquí tenemos varias aproximaciones.
 +
:* Podríamos poner dos referencias a audio clips dentro del script y hacer que el Audio Source de la cápsula reprodujera uno u otro por programación.
 +
:* Poner el 'Audio Source' en el cubo y que cuando este detecte la colisión, que lo reproduzca (la forma más lógica).
 +
 +
: De todas formas, para mostraros como cargar varios 'Audio Clips' voy a hacerlo de las dos maneras:
 +
 +
* '''Opción 1 (no recomendada):'''
 +
: Script '''UD3_Audio_GestionarBala''':
 +
<syntaxhighlight lang="java" line enclose="div" highlight="10,12,26-30,31-39,47">
 +
using UnityEngine;
 +
 +
public class UD3_Audio_GestionarBala : MonoBehaviour
 +
{
 +
    [SerializeField]
 +
    public ConstantForce fuerza;
 +
    [SerializeField]
 +
    public AudioSource audioSource;
 +
    [SerializeField]
 +
    public AudioClip disparo;
 +
    [SerializeField]
 +
    public AudioClip explosion;
 +
 +
 +
 +
    private void Reset()
 +
    {
 +
        fuerza = GetComponent<ConstantForce>();
 +
        audioSource = GetComponent<AudioSource>();
 +
    }
 +
    // Start is called before the first frame update
 +
    void Start()
 +
    {
 +
       
 +
    }
 +
    private void Destruir()
 +
    {
 +
        Destroy(gameObject);
 +
 +
    }
 +
    private void OnCollisionEnter(Collision collision)
 +
    {
 +
        audioSource.clip = explosion;
 +
        audioSource.maxDistance = 100;
 +
        audioSource.Play();
 +
 +
        Invoke("Destruir", 1.7f);
 +
 +
    }
 +
 +
    // Update is called once per frame
 +
    void Update()
 +
    {
 +
        if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
 +
        {
 +
            fuerza.enabled = true;
 +
            audioSource.clip = disparo;
 +
            audioSource.Play();
 +
        }
 +
       
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 +
:<u>Nota:</u> Recordar que ahora tenéis que arrastrar los clips a la ventana Inspector donde se encuentra el script asociado al GameObject Capsule.
 +
 +
 +
: Como vemos tenemos múltiples dificultades para que la gestión de la explosión la lleve la bala.
 +
:* Primer problema: Si el sonido lo produce el Audio Source de la bala, no podemos destruírla hasta que termine de reproducir el sonido de la explisión. Por eso la línea 37 y el método Destruir() (íneas 26-30).
 +
:* Segundo problema: El disparo está asociado a una línea de sonido entre 0-3 metros. Si la explosión se produce a más de 3 metros no se escuchará nada. Por eso la línea 34.
 +
 +
: Lo que interesa de este script es que vaías como podéis cambiar el clip de reprodución por programación.
 +
: En este caso tenemos dos referencias en el Inspector de dos clips, pero podríamos crear un array y no tener que crear una variable por cada clip.
 +
: Fijarse que las líneas que cambia de clip son las líneas 33 y 47.
 +
 +
 +
<br />
 +
* '''Opción 2 (llevamos la gestión de la explosión al cubo):'''
 +
: Dejamos el script como estaba:
 +
 +
: Script '''UD3_Audio_GestionarBala''':
 +
<syntaxhighlight lang="java" line enclose="div" highlight="">
 +
using UnityEngine;
 +
 +
public class UD3_Audio_GestionarBala : MonoBehaviour
 +
{
 +
    [SerializeField]
 +
    public ConstantForce fuerza;
 +
    [SerializeField]
 +
    public AudioSource audioSource;
 +
    [SerializeField]
 +
    public AudioClip disparo;
 +
 +
 +
 +
    private void Reset()
 +
    {
 +
        fuerza = GetComponent<ConstantForce>();
 +
        audioSource = GetComponent<AudioSource>();
 +
    }
 +
    // Start is called before the first frame update
 +
    void Start()
 +
    {
 +
       
 +
    }
 +
 +
 +
    // Update is called once per frame
 +
    void Update()
 +
    {
 +
        if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
 +
        {
 +
            fuerza.enabled = true;
 +
            audioSource.Play();
 +
        }
 +
       
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 +
 +
: Arrastramos el AudioClip de Explosion al GameObject 'Cube' y ajustamos las propiedades como hicimos con el otro, ajustando la distancia a entre 0-30 metros (recordar modificar también las propiedades del AudioClip).
 +
 +
: Creamos un nuevo script que asociamos al cubo ('''recordar pulsar la opción de reset para que incialice las propiedades'''):
 +
: Script '''UD3_Audio_GestionarCubo''':
 +
<syntaxhighlight lang="java" line enclose="div" highlight="">
 +
using UnityEngine;
 +
 +
public class UD3_Audio_GestionCubo : MonoBehaviour
 +
{
 +
    [SerializeField]
 +
    public AudioSource audioSource;
 +
 +
    private void Reset()
 +
    {
 +
        audioSource = GetComponent<AudioSource>();
 +
    }
 +
 +
    private void OnCollisionEnter(Collision collision)
 +
    {
 +
        Destroy(collision.gameObject);  //Destruimos la bala
 +
        audioSource.Play();
 +
    }
 +
 +
 +
}
 +
</syntaxhighlight>
 +
 +
[[Imagen:Unity3d_audio_24.jpg|500px|center]]
 +
 +
 +
: Podéis probar el juego y ver como la bala desaparece y suena el sonido de la explisión...
  
* Lo que vamos a hacer ahora es añadir el componente 'Audio Source' a la cápsula para que pueda reproducir el sonido de disparo. Para ello podemos pulsar el botón '''Add Component''' => '''Audio''' => '''Audio Source''' o bien arrastrar el audio que queramos reproducir al GameObject.
 
  
[[Imagen:Unity3d_audio_11.jpg|500px|center]]
 
  
  

Revisión del 11:13 31 jul 2019

Introducción

  • El audio es uno de los elementos más importantes para conseguir una correcta ambientación y experiencia cuando jugamos a u juego.
El uso de audio incluye:
  • Música ambiental
  • Efectos de sonidos (explosiones, aceleraciones, choques, disparos,aciertos al disparar...)


  • En lo referente al manejo de Audios, Unity maneja tres conceptos:
  • Audio Clips: Son los ficheros de audio que guardan el sonido que queremos reproducir
  • Audio Source: Componente asociado a un GameObject que permite reproducir un AudioClip.
  • Audio Listener: Componente necesario para que se pueda escuchar cualquier Audio Source.


  • Para realizar esta sección, creamos una nueva escena de nombre Escena_UD3_Audio y vamos a descargar los siguientes recursos:
Bilderbergin by Robbero (c) copyright 2016 Licensed under a Creative Commons Attribution (3.0) license.



Audio Clips


  • Son los sonidos que queremos reproducir.
Unity los almacena en forma de Assets dentro de la ventana de proyecto.
Tendrán un formato determinado, como mp3, wav,...
Los formatos de audio que Unity soporta son los siguientes:
Unity3d audio 1.jpg
Imagen obtenido de https://docs.unity3d.com/Manual/AudioFiles.html


  • Para importar un audio a Unity crearemos una carpeta Audio y dentro de ella podremos crear una jerarquía de carpetas para tener todos los recursos de audio ordenados.
Así, podemos crear una carpeta en la sección Assets dentro del 'Project Window' para:
  • Los audios asociados a los protagonistas-enemigos (cuando mueren, saltan,...).
  • Música
  • Armas (al disparar, al explotar).
  • Para los Audio Mixer (sección de investigación dentro de esta unidad).


  • Una vez creada la estructura de carpetas dentro de Assets en la Project Window, sólo tenemos que arrastrar los audios a dichas carpetas (podemos cambiar el nombre de los archivos por otros más significativos):
Unity3d audio 3.jpg


  • Ahora, al pulsar un archivo de Audio (Audio Clip) podemos ver sus propiedades:
Unity3d audio 4.jpg
  • Todos los archivos de audio se importan como estéreo. Si quisiéramos forzar a que suenen como mono, marcaríamos la opción Force to Mono.
  • Todos los Audio Clips son cargados en memoria antes de que la escena comience a funcionar. Si tenemos una cantidad muy grande de audios, esto puede suponer que se produzca un cierto retardo en cargar la escena. En este caso podemos marcar que el audio se cargue en Background chequeando dicha opción en sus propiedades (Load in Background). Debemos de tener en cuenta como es nuestra escena, ya que si intentamos reproducir un audio que todavía no se haya cargado en memoria no se reproducirá.
  • Todos los audios se cargan antes de comenzar la escena, y se indica con la opción PreLoad Audio Data (opción por defecto). Fijarse que esta opción puede estar personalizada por cada plataforma. Así puedo tenerla activa en la versión PC y desactiva en la versión Android. Si desmarcamos esta opción el audio se cargará en memoria al reproducir dicho audio (AudioSource.play()) o si queremos podemos cargarlo mediante código con la orden AudioSource.LoadAudioData()).
  • Forma que usa Unity para cargar el audio en memoria (Load Types):
Unity3d audio 5.jpg
  • Decompress On Load: Lo que hace Unity es descomprimir el archivo de audio en memoria. Debemos de tener cuidado si estamos haciendo uso de archivos Vorbis ya que este tiene un formato de compresión de hasta un factor de 10. Quiere decir que si el archivo de audio ocupa 10MB, en formato Vorbis podría tener 1MB. Por lo tanto no debemos hacer uso de esta opción para archivos de audio muy grandes (ADPCM puede comprimir un archivo de audio hasta 3.5 veces su tamaño original). Esta es la opción a escoger cuando tenemos pequeños archivos de audio como efectos.
  • Compressed in Memory: En este caso Unity guarda el archivo de audio comprimido en memoria y cuando lo va a reproducir lo descomprime. En el caso de archivos Vorbis tiene una ligera sobrecarga de rendimiento. Sería la opción a escoger con archivos comprimidos de Audio muy grandes.
  • Streaming: En este caso Unity va cargando de disco-descomprimiendo-reproduciendo el archivo de audio. Es la opción que menos memoria consume pero que la más coste de CPU tiene.
  • Formatos de compresión: Van a depender del tipo de audio importado.
Unity3d audio 6.jpg
  • Vorbis: Permite establecer un parámetro de calidad que nos permite ahorrar espacio en memoria. En lar parte media aparece un cuadro donde se nos da información sobre el tamaño original, tamaño comprimido y ratio de compresión. Es el formato de compresión que reduce más el tamaño del archivo de audio original. Se debe utilizar en archivos de audio muy grandes.
  • PCM: Permite tener una calidad muy alta pero es la opción que menos compresión tiene.
  • ADPCM: Puede tener una compresión de 3.5. Suele utilizarse en audios que se reproducen de forma continua y no ocupan mucho, como por ejemplo, disparos o pisadas de pies al andar...


  • Sample Rate Settings. Indica la frecuencia de muestreo (el número de veces por segundo en la que tomamos una muestra de la señal de audio). Con la opción 'Preserve Sample Rate' dejamos la que viene del archivo de audio importado. Cuanto más frecuencia más fiel se reproduce el sonido del fichero de audio pero más espacio ocupa.
Unity3d audio 7.jpg


  • Unity permite realizar operaciones de reproducción sobre el archivo de audio:
Unity3d audio 8.jpg
  • La primera opción (Auto play on), si está marcada, hará que al pulsar cualquier archivo de audio comience su reproducción de forma automática.
  • La segunda opción (Loop on) hará que al terminar de reproducir el audio vuelva al comienzo y siga la reproducción.
  • La tercera opción (Play) hará que el audio suene.
Podemos ver las dos señales de audio (recordar que siempre importa en estéreo y por tanto tendremos dos canales con el mismo audio), indicando su frecuencia de muestreo, su formato de compresión y su duración.




Audio Source


  • Un Audio Source es un componente que se asocia a un GameObject en la escena y permite reproducir un AudioClip.
Veremos más adelante que, para que se reproduzca, es necesario que exista un 'Audio Listener' el cual está añadido por defecto como un componente del GameObject 'Main Camera'
Controla:
  • Volumen.
  • Tono.
  • Cuando un AudioClip es reproducido teniendo en cuenta aspectos 3D o no (por ejemplo, si es tratado como 3D, al aumentar la distancia el volumen disminuye, el sonido puede venir de un altavoz derecho y pasar a un izquierdo al desplazarse la fuente de audio).


  • Veamos su funcionamiento en nuestra escena.
Vamos a añadir un cubo y una cápsula (podéis usar modelos más complejos para hacer el mismo ejercicio, como un Zombie y una pistola que dispare balas) y vamos a situar a la cápsula (que va a hacer la función de bala) desplazada en el eje-x en negativo.
Unity3d audio 9.jpg


  • Las propiedades que disponemos en el 'Audio Source' son (recordar que el 'Audio Source' se aplica a un GameObject y podemos tener muchos Gameobjects con audio sources):
  • AudioClip: El el audio que se va a reproducir.
  • Output: Por defecto, el audio que se reproduce es 'enviado' al 'AudioListener'. Pero podemos enviarlo a un componente denominado 'Audio Mixer' el cual permite concentrar varios audios (mezclador) que se estén reproduciendo a la vez y crear diferentes efectos, como que una de las fuentes de audio resalte sobre las otras...
  • Muted: El audio que se está reproduciendo deja de escucharse.
  • ByPass Efects: Los 'Efects' son efectos de audio que se pueden añadir como componentes a cada GameObject (aparecen en AddComponet => Audio => ---- Filter). Si marcamos esta opción dichos efectos no sonarán.
  • ByPass Listener Efects: Son efectos del mismo tipo que el anterior, pero que son aplicados al 'Audio Listener', no al 'Audio Source'. Si marcamos esta opción dichos efectos no se aplicarán. Este tipo de efectos van a cambiar la forma en como el 'Audio Listener' escucha todos los sonidos que se reproducen en la escena. Si está activado este tipo de efectos no se tendrán en cuenta.
  • ByPass Reverb: Al igual que los anteriores permite 'activar' o 'desactivar' un tipo de efectos que producen reverberación, como por ejemplo, al hablar dentro de una cueva. Al igual que los anteriores este tipo de efectos se añaden a mayores como un componente más.
  • Play On Awake: Si está marcada el audio se reproducirá inmediatamente al cargar la escena. En caso contrario será necesario indicarlo por programación.
  • Loop: Si está activada el sonido se repetirá de forma continua al acabar. Utilizado cuando queremos tener una música de fondo y no queremos que pare de sonar.
  • Priority: Indica el nivel de prioridad que va a tener el sonido. En caso de que no se puedan reproducir todos los sonidos (sólo disponemos de dos canales) o que haya problemas de rendimiento, Unity dará más prioridad y por tanto reproducirá sin problemas, aquellos sonidos que tengan una prioridad más alta. Pondremos una prioridad alta a la música de fondo en caso de tenerla y al audio relacionada con el protagonista.
  • Volume: Está normalizado entre los valores 0-1 siendo 1 el sonido más alto.
  • Pitch: Velocidad en la reprodución del audio. El valor 1 sería la velocidad normal de reprodución.
  • Stereo Pan: Se utiliza en sonidos 2D. Son sonidos que no tienen en cuenta la distancia entre el 'Audio Listener' y el 'Audio Source', por ejemplo, el sonido de pulsar un botón o una opción de menú. Esta opción determina por cual de los dos altavoces se va a reproducir el sonido.
  • Spatial Blend: Indica si el sonido a reproducir es 2D o 3D.
  • Reverb Zone Mix: Indica como se va a haber afectado este Audio Source por un efecto de tipo Reverb.
Las siguientes secciones sólo se aplicarán a sonidos que sean del tipo 3D según la opción 'Spatial Blend':
  • Doppler Level: Ya comentada, modifica la frecuencia del sonido a medida que se acerca o se aleja del 'Audio Listener'.
  • Spread: Indica el ángulo de propagación del sonido en un entorno de audio 3D.
  • Volume Rolloff: Indica la curva que va a tener el sonido cuando se reproduzca. Las distancias están indicadas en metros. Disponemos de varias curvas las cuales podemos modificar. Recordar que estamos refiriéndonos a sonidos 3D los cuales varían en función de la distancia al 'Audio Listener'.



  • Siguiendo con nuestro ejemplo, vamos a realizar las siguientes modificaciones:
  • Eliminamos el componente Audio Listener de la Main Camera.
  • Agregamos el componente 'Audio Listener' a la bala (el GameObject Cápsule).
  • Con el audio de la música de fondo añadida a la cámara, cambiamos la prioridad al valor 0, que se inicie al cargar la escena y que se repita.
  • Hacemos que Unity cargue la música de fondo comprimida en memoria.
  • Hacemos que el sonido sea 3D y con una curva lineal entre 5 y 20 metros.
  • Probaremos el juego y escucharemos como la música de fondo cambia su volumen al mover la cápsula (mover la cápsula manualmente estando en ejecución).
Nota: Esto será así dependiendo de la distancia de la cámara a la cápsula. Ajustar vuestra escena para que esté a unos 5-10 metros cuando la cápsula choque con el cubo.


  • Como la música de fondo queremos que suene igual en todas partes, vamos a cambiar el tipo de audio a 2D (hacerlo).


  • Seguimos con nuestro ejemplo:
Vamos a añadir a la cápsula un componente 'Constant Force', que vamos a deshabilitar por ahora, con un valor de 10 en Force, así como un script de nombre 'UD3_Audio_GestionarBala':
Unity3d audio 10.jpg
Script UD3_Audio_GestionarBala:
 1 using UnityEngine;
 2 
 3 public class UD3_Audio_GestionarBala : MonoBehaviour
 4 {
 5     [SerializeField]
 6     public ConstantForce fuerza;
 7 
 8     private void Reset()
 9     {
10         fuerza = GetComponent<ConstantForce>();
11     }
12     // Start is called before the first frame update
13     void Start()
14     {
15         
16     }
17 
18     // Update is called once per frame
19     void Update()
20     {
21         if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
22         {
23             fuerza.enabled = true;
24         }
25         
26     }
27 }
Lo que hace dicho script es que al pulsar disparo, habilita el componente 'ConstantForce' y por lo tanto la cápsula se moverá en el Eje-X hasta chocar con el Cubo.
  • Ahora vamos a modificar la escena para que parezca que estamos en juego de tipo Shooter en primera persona.
Vamos a colocar la bala delante de la cámara y vamos a quitar el 'Audio Listener' de la bala y lo vamos a añadir a la cámara como estaba antes.
Puede ser que necesitéis cambiar el eje del componente Constant Force de la cápsula para que vaya hacia adelante.
Unity3d audio 23.jpg




  • Modificamos el script para que suene el disparo:
Script UD3_Audio_GestionarBala:
 1     // Update is called once per frame
 2     void Update()
 3     {
 4         if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
 5         {
 6             fuerza.enabled = true;
 7             audioSource.Play();
 8         }
 9         
10     }


Probar a ejecutar el juego y disparar.


  • Ahora sólo nos queda la explosión y que la bala desaparezca cuando choque contra el cubo.
Aquí tenemos varias aproximaciones.
  • Podríamos poner dos referencias a audio clips dentro del script y hacer que el Audio Source de la cápsula reprodujera uno u otro por programación.
  • Poner el 'Audio Source' en el cubo y que cuando este detecte la colisión, que lo reproduzca (la forma más lógica).
De todas formas, para mostraros como cargar varios 'Audio Clips' voy a hacerlo de las dos maneras:
  • Opción 1 (no recomendada):
Script UD3_Audio_GestionarBala:
 1 using UnityEngine;
 2 
 3 public class UD3_Audio_GestionarBala : MonoBehaviour
 4 {
 5     [SerializeField]
 6     public ConstantForce fuerza;
 7     [SerializeField]
 8     public AudioSource audioSource;
 9     [SerializeField]
10     public AudioClip disparo;
11     [SerializeField]
12     public AudioClip explosion;
13 
14 
15 
16     private void Reset()
17     {
18         fuerza = GetComponent<ConstantForce>();
19         audioSource = GetComponent<AudioSource>();
20     }
21     // Start is called before the first frame update
22     void Start()
23     {
24         
25     }
26     private void Destruir()
27     {
28         Destroy(gameObject);
29 
30     }
31     private void OnCollisionEnter(Collision collision)
32     {
33         audioSource.clip = explosion;
34         audioSource.maxDistance = 100;
35         audioSource.Play();
36 
37         Invoke("Destruir", 1.7f);
38 
39     }
40 
41     // Update is called once per frame
42     void Update()
43     {
44         if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
45         {
46             fuerza.enabled = true;
47             audioSource.clip = disparo;
48             audioSource.Play();
49         }
50         
51     }
52 }
Nota: Recordar que ahora tenéis que arrastrar los clips a la ventana Inspector donde se encuentra el script asociado al GameObject Capsule.


Como vemos tenemos múltiples dificultades para que la gestión de la explosión la lleve la bala.
  • Primer problema: Si el sonido lo produce el Audio Source de la bala, no podemos destruírla hasta que termine de reproducir el sonido de la explisión. Por eso la línea 37 y el método Destruir() (íneas 26-30).
  • Segundo problema: El disparo está asociado a una línea de sonido entre 0-3 metros. Si la explosión se produce a más de 3 metros no se escuchará nada. Por eso la línea 34.
Lo que interesa de este script es que vaías como podéis cambiar el clip de reprodución por programación.
En este caso tenemos dos referencias en el Inspector de dos clips, pero podríamos crear un array y no tener que crear una variable por cada clip.
Fijarse que las líneas que cambia de clip son las líneas 33 y 47.



  • Opción 2 (llevamos la gestión de la explosión al cubo):
Dejamos el script como estaba:
Script UD3_Audio_GestionarBala:
 1 using UnityEngine;
 2 
 3 public class UD3_Audio_GestionarBala : MonoBehaviour
 4 {
 5     [SerializeField]
 6     public ConstantForce fuerza;
 7     [SerializeField]
 8     public AudioSource audioSource;
 9     [SerializeField]
10     public AudioClip disparo;
11 
12 
13 
14     private void Reset()
15     {
16         fuerza = GetComponent<ConstantForce>();
17         audioSource = GetComponent<AudioSource>();
18     }
19     // Start is called before the first frame update
20     void Start()
21     {
22         
23     }
24 
25 
26     // Update is called once per frame
27     void Update()
28     {
29         if (Input.GetAxis("Fire1")>0 && !fuerza.enabled)
30         {
31             fuerza.enabled = true;
32             audioSource.Play();
33         }
34         
35     }
36 }


Arrastramos el AudioClip de Explosion al GameObject 'Cube' y ajustamos las propiedades como hicimos con el otro, ajustando la distancia a entre 0-30 metros (recordar modificar también las propiedades del AudioClip).
Creamos un nuevo script que asociamos al cubo (recordar pulsar la opción de reset para que incialice las propiedades):
Script UD3_Audio_GestionarCubo:
 1 using UnityEngine;
 2 
 3 public class UD3_Audio_GestionCubo : MonoBehaviour
 4 {
 5     [SerializeField]
 6     public AudioSource audioSource;
 7 
 8     private void Reset()
 9     {
10         audioSource = GetComponent<AudioSource>();
11     }
12 
13     private void OnCollisionEnter(Collision collision)
14     {
15         Destroy(collision.gameObject);  //Destruimos la bala
16         audioSource.Play();
17     }
18 
19 
20 }
Unity3d audio 24.jpg


Podéis probar el juego y ver como la bala desaparece y suena el sonido de la explisión...




Audio Listener


  • Componente necesario para que se pueda escuchar cualquier Audio Source.
Todo proyecto que se cree en Unity viene con un Audio Listener creado por defecto asociado como un componente a la cámara:
Unity3d audio 2.jpg
NOTA IMPORTANTE: Sólo puede haber un Audio Listener activo en la escena.
  • Un Audio Listener representa el punto desde el cual el jugador va a escuchar el sonido.
La posición del Audio Listener va a influir en el sonido que escucha el jugador debido a que va a poder tener en cuenta la distancia entre el Audio Listener y los Audio Sources que reproducen los Audio Clips.
Así la frecuencia del sonido va a variar si nos acercamos o nos alejamos del Audio Source produciendo un efecto Doppler.





Investigación




-- Ángel D. Fernández González -- (2018).