FASE 3 - AUDIO ⏰ 15' aprox
Este juego va a tener dos fuentes de sonido:
Música: Alternaremos entre dos melodías, una música relajante cuando no haya ladrones en la escena y otra de alerta cuando haya alguno.
Efectos: Añadiremos dos efectos de sonido, el primero cuando recuperemos un tiesto, y el otro cuando nos roben uno y perdamos una vida.
Para añadir estos efectos, tendremos que crear en nuestra escena dos AudioSources. Un AudioSource es un elemento que reproduce audio.
Creamos el primero haciendo click derecho en la jerarquía > Audio > AudioSource. Cambiamos su nombre a Musica.
Repetimos el proceso para crear el segundo AudioSource, al que llamaremos Efectos.
En el caso de Musica, activamos el Loop, ya que queremos que la música se reproduzca en bucle.

La gestión de los audios la haremos mediante script. Para ello, vamos a modificar GestorVidas.
Tendremos que modificar la línea 72, contamos el número de objetos de la escena cuyo nombre comienza con “Indicador”
int ladrones = FindObjectsOfType<GameObject>().Count(obj => obj.name.StartsWith("Indicador"));
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class GestorVidas : MonoBehaviour
{
public List<Image> imagenVida; // Lista de las imágenes de las vidas
private int vidas; // Número inicial de vidas
public TextMeshProUGUI mensajeInicio; //Mensaje inicial
public TextMeshProUGUI mensajeFinal; //Mensaje de Game Over
public Button botonReiniciar; //Botón de la pantalla de Game Over
public Image background; //Imagen de fondo de la pantalla de Game Over
private bool gameOVer;
public AudioSource musica; //AudioSource para la música de fondo
public AudioSource efectos; //AudioSource para los efectos de sonido
public AudioClip audioFondo; //Clip de audio para la música de fondo
public AudioClip audioAlerta; //Clip de audio para la música de alerta, cuando hay algún ladrón
public AudioClip perderVida; //Clip de audio para el sonido de perder una vida
//Inicializamos el número de vidas
//Buscamos las imágenes de las macetas en la escena y las añadimos a la lista
//Ponemos la música de fondo
//Mostramos el mensaje inicial y lo ocultamos a los 3 segundos
//Añadimos un listener al botón de reiniciar
void Start()
{
vidas = imagenVida.Count;
if (imagenVida.Count == 0)
{
foreach (Transform child in transform)
{
Image macetaImage = child.GetComponent<Image>();
if (macetaImage != null)
{
imagenVida.Add(macetaImage);
}
}
}
musica.clip = audioFondo;
musica.Play();
Invoke("OcultarMensaje", 3f);
botonReiniciar.onClick.AddListener(Reiniciar);
}
void Update()
{
//Expandimos el mensaje inicial antes de que desaparezca
if (mensajeInicio.isActiveAndEnabled)
{
mensajeInicio.transform.localScale = new Vector3(
mensajeInicio.transform.localScale.x + 0.02f,
mensajeInicio.transform.localScale.y + 0.02f,
mensajeInicio.transform.localScale.z + 0.02f);
}
//Llamamos al Game Over cuando no nos quedan vidas
if (vidas == 0)
{
if (!gameOVer)
{
gameOVer = true;
GameOver();
}
}
//Cambiamos la música de fondo dependiendo de si hay algún ladrón en la escena o no
int ladrones = FindObjectsOfType<GameObject>().Count(obj => obj.name.StartsWith("Indicador"));
if (ladrones > 0)
{
if (audioAlerta != null)
{
if (musica.clip.name == audioFondo.name)
{
musica.clip = audioAlerta;
musica.Play();
}
}
}
else
{
if (audioFondo != null)
{
if (musica.clip.name == audioAlerta.name)
{
musica.clip = audioFondo;
musica.Play();
}
}
}
SetAspectRatio();
}
//Método para que desaparezca el mensaje inicial utilizado en el método Start
private void OcultarMensaje()
{
mensajeInicio.gameObject.SetActive(false);
}
//Método para perder una vida que utilizamos en el script MoverPeaton
public void PerderVida()
{
if (vidas > 0)
{
vidas--;
imagenVida[9 - vidas].gameObject.SetActive(false);
efectos.clip = perderVida;
efectos.Play();
}
}
//Metodo para reiniciar la partida, lo llamamos al pulsar el botón de reiniciar
private void Reiniciar()
{
UnityEngine.SceneManagement.SceneManager.LoadScene(UnityEngine.SceneManagement.SceneManager.GetActiveScene()
.name);
}
//Método para mostrar la pantalla de game over
private void GameOver()
{
mensajeFinal.gameObject.SetActive(true);
botonReiniciar.gameObject.SetActive(true);
background.gameObject.SetActive(true);
foreach (Transform child in transform)
{
child.gameObject.SetActive(false);
}
audioSource.Stop();
}
//Método para fijar la resolución a 16:9
void SetAspectRatio()
{
float aspectRatio = 16.0f / 9.0f;
int newWidth = Screen.width;
int newHeight = Mathf.RoundToInt(newWidth / aspectRatio);
if (Screen.height != newHeight)
{
Screen.SetResolution(newWidth, newHeight, false);
}
}
}
Además de gestionar el audio, también hemos añadido una función para asegurar que la resolución de nuestro juego sea 16/9, y que se vea bien nuestra escena.
Volvemos a Unity, y seleccionamos el contador para modificar las variables del componente Gestor Vidas en el inspector. Añadimos los dos AudioSources que hemos creado antes, y añadimos también los clips de audio que podemos encontrar en la carpeta Sounds.
Todos los audios del juego han sido descargados en Pixabay

Por último, modificamos el script LadronInteraction para que se reproduzca el audio cuando recuperamos una flor.
using UnityEngine;
public class LadronInteraction : MonoBehaviour
{
private GameObject jugador; // Referencia al jugador
public GameObject prefabPeaton; //Prefab del peatón (antes y después de ser ladrón)
private Vector3 destino; //Destino del peatón
private AudioSource audioSource; //AudioSource para los efectos de sonido
public AudioClip sonidoRecuperar; //Clip de audio para el sonido de recuperar la flor
//Buscamos el AudioSource en la escena por su nombre
void Start()
{
audioSource = GameObject.Find("Efectos").GetComponent<AudioSource>();
}
// Llamamos al metodo RecuperarFlor cuando el jugador entra en el trigger
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
RecuperarFlor();
}
}
// Eliminamos el prefab del ladron y lo reemplazamos por el peaton
//Recuperamos el destino de nuestro ladrón para asignarlo al peatón
private void RecuperarFlor()
{
audioSource.clip = sonidoRecuperar;
audioSource.Play();
MoverPeaton moverLadron = transform.GetComponent<MoverPeaton>();
if (moverLadron != null)
{
destino = moverLadron.GetDestination();
}
Destroy(gameObject);
GameObject nuevoPeaton = Instantiate(prefabPeaton, transform.position, transform.rotation);
MoverPeaton moverPeaton = nuevoPeaton.GetComponent<MoverPeaton>();
if (moverPeaton != null)
{
moverPeaton.SetDestination(destino);
}
}
}
Después, tendremos que añadir el clip de audio a todos los prefabs de los ladrones (PolygonCity > Prefabs > Characters) en el componente Ladron interaction, en Sonido Recuperar.

Le damos a Play para comprobar el funcionamiento.
Debería sonar una música relajante al principio, y cambiar a una música de alerta cuando roben un tiesto. Cuando no haya ningún ladrón en la escena, debería sonar otra vez la música relajante.
Además, tiene que reproducirse un sonido al recuperar una maceta, y otra cuando un ladrón consigue escapar.