Español Valencià
Instrucciones
🌹

Instrucciones

FASE 3 - AUDIO ⏰ 15' aprox

👉
Esta página contiene las instrucciones específicas de la Tercera Fase de la sexta sesión para desarrollar el juego del Puente de las Flores.

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.

image

La gestión de los audios la haremos mediante script. Para ello, vamos a modificar GestorVidas.

⚠️
Si los nombres de los prefabs de los ladrones que hemos creado anteriormente no comienzan con “Indicador_…”, este script no funcionará.

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

image

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.

image

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.