En este tutorial les mostraré cómo reproducir un archivo de audio en Unity y, lo más importante, cómo resolví un problema relacionado con la superposición de audio desde un Audio Source.


La versión en video de este tutorial no está disponible actualmente en este idioma.


Transcripción del video

¡Hola a todos! En este tutorial les mostraré cómo reproducir un archivo de audio en Unity y, lo más importante, cómo resolví un problema relacionado con la superposición de audio desde un Audio Source. Antes de continuar, tengan en cuenta que la solución presentada en el video es simplemente la que adopté para este problema, pero probablemente existan otras soluciones, e incluso mejores, así que no consideren la información aquí proporcionada como el enfoque definitivo.

El tutorial fue creado utilizando Unity 2022. En concreto, quiero reproducir un archivo de audio de pasos, tomado del primer Prince of Persia, creado por Jordan Mechner, que fue mi primera experiencia de juego en PC, cuando el personaje se mueve dentro de la escena. Puede parecer una tarea sencilla, pero como veremos, esconde un pequeño desafío.

Para reproducir el audio de los pasos, el primer paso es añadir un objeto Audio Source al personaje. Dentro de este objeto definiremos el archivo de audio específico que se debe reproducir y configuraremos otras propiedades de reproducción.

Un Audio Source es un componente que debe añadirse a un objeto dentro de la escena. Puede ser el personaje, una puerta, una pelota o incluso un objeto invisible, lo cual resulta útil para reproducir un archivo de audio cuando el personaje entra en una habitación específica o se acerca a un determinado objeto.

Para que el audio pueda ser escuchado por la Main Camera, la cámara necesita tener un componente Audio Listener activo. En los nuevos proyectos de Unity, la Main Camera suele incluir un Audio Listener activo por defecto, ya que se asume que el usuario querrá escuchar archivos de audio. Si el Audio Listener predeterminado no está presente, se puede añadir desde el Inspector del objeto Main Camera.

En mi caso, el archivo de audio debe estar vinculado al personaje.

Dentro de mi proyecto hay un objeto Player que actúa como padre de la Main Camera. El script de movimiento está asociado al objeto Player, mientras que la cámara tiene un script que permite mirar alrededor. Por lo tanto, añadiré un componente AudioSource al objeto Player.

Al acceder a la pestaña del componente recién creado, verán inmediatamente el campo AudioClip, que inicialmente está configurado como None.

También hay una casilla llamada Play on Awake que está seleccionada por defecto. Esta opción reproduce el archivo de audio cuando el juego comienza, lo cual puede ser útil en ciertos casos. Sin embargo, para nuestro caso no es necesario, así que la desmarcaré.

Importar un clip de audio en el proyecto es muy sencillo. Basta con arrastrar el archivo desde una ventana del File Browser a la pestaña Project o seleccionarlo desde el disco mediante Assets - Import New Asset.

Unity es compatible con varios formatos de audio, como mp3, y mostrará un icono de nota musical junto al elemento correspondiente dentro de la pestaña Project.

Como pueden ver, mi proyecto ya contiene varios archivos de audio destinados a reproducirse en distintos momentos. Entre ellos, el que nos interesa específicamente es PoP---walk.

Para continuar, primero selecciono el Player en la Hierarchy.

Después, hago clic y mantengo presionado el botón sobre el asset PoP---walk en la pestaña Project.

Por último, arrastro este elemento al cuadro AudioClip del componente AudioSource asociado al Player.

Como se mencionó anteriormente, el sonido debe reproducirse cuando el personaje se mueve.

Para lograrlo, abriré el script encargado de gestionar el movimiento del personaje e insertar el código necesario.

Primero, creo una variable AudioSource y la inicializo dentro de la función Start asociándola con el componente AudioSource del Player.

Para ello escribo el siguiente código:

private AudioSource playerAudioSource;

y dentro de la función Start:

playerAudioSource = GetComponent();

También necesito crear una variable AudioClip para asociarla con el archivo de audio que se debe reproducir. Llamaré a esta variable myAudioClip y utilizaré el atributo SerializeField porque quiero que sea visible en el Inspector. Después de guardar el archivo del script, el siguiente paso será arrastrar el asset PoP---Walk al campo myAudioClip del script en el Inspector.

Inmediatamente después de la definición de playerAudioSource, escribo la siguiente línea de código:

[SerializeField] private AudioClip myAudioClip;

Después de guardar el script, regreso al Editor de Unity y arrastro el asset PoP---Walk al campo myAudioClip del script, como se describió anteriormente.

Por el momento, el audio no se está reproduciendo.

Dentro de la función Update del script hay algunas instrucciones para detectar las teclas presionadas por el usuario, que controlan el movimiento del personaje.

En concreto, cuando el usuario mueve el personaje, el valor de Input.GetAxis para Horizontal y Vertical, que he renombrado como x e y por comodidad, puede ser -1 o 1 según la dirección.

En este caso podría escribir el siguiente código:

if ((Mathf.Abs(x) == 1) || (Mathf.Abs(z) == 1))

playerAudioSource.PlayOneShot(myAudioClip);

e intentar ejecutar el juego. Sin embargo, esto sería un error importante, porque Unity reproduciría el archivo de audio en CADA FOTOGRAMA DEL JUEGO.

El resultado no mejora si simplemente movemos la función PlayOneShot dentro de una Coroutine y añadimos un comando de retraso de un segundo con yield return new WaitForSeconds(1). El problema sigue siendo que Update llamará a la Coroutine en cada fotograma, llevándonos de nuevo al mismo error.

Por lo tanto, la Coroutine no es necesaria. En su lugar, debemos implementar una comprobación sencilla sobre el AudioSource: reproducir el audio solo si el AudioSource NO lo está reproduciendo ya.

Esto puede hacerse dentro de la función Update escribiendo el siguiente código dentro del bloque if que verifica los valores de x e y:

if (!(playerAudioSource.isPlaying))

playerAudioSource.PlayOneShot(myAudioClip);

Ahora podemos guardar el script, ejecutar el juego y observar, o mejor dicho escuchar, el resultado.

Antes de concluir este tutorial, quiero compartir una reflexión. El campo AudioClip del componente AudioSource puede modificarse mediante script.

Esto significa que pueden utilizar este AudioSource para reproducir un archivo de sonido estándar de pasos y también reemplazar el clip de audio durante el juego por otro si, por ejemplo, el personaje camina sobre grava, en la orilla del mar u otras superficies, que pueden identificarse mediante Colliders.

Además, si su personaje puede volar, pueden desactivar el AudioSource para que no se reproduzca ningún sonido.

Eso es todo por este tutorial. Espero que les haya resultado útil. ¡Hasta pronto!

Este sitio web tiene como único propósito mostrar algunos de mis trabajos, sin ninguna intención promocional. Ten en cuenta que actualmente no estoy buscando - ni responderé a - solicitudes de trabajos personalizados, consultorías u otro tipo de colaboraciones profesionales.


POLÍTICA EXTENDIDA DE PRIVACIDAD Y UTILIZACIÓN DE COOKIES