Sexta sesión del taller de creación de videojuegos con Unity

En la setxta sesión del taller de creación de videojuegos con Unity aprendemos a añadir sonido, un menú de pausa y materiales físcos 2D para crear efectos de rebote y deslizamiento.

A continuación os dejamos el vídeo que se ha estrenado hoy viernes 22 de mayo.

Podéis descargar los prefabs y los scripts aquí:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

[System.Serializable] // Permite que la clase sonido sea Serializable (que se puedan ver parámetros en el inspector
public class Sound { // Definimos la clase sonido y sus propiedades
public string Nombre; // Nombre del sonido
public AudioClip Clip; // Referencia al clip de audio

[Range(0f,1f)] // Permitimos que el rango del deslizador en el editor de Unity vaya de 0 a 1
public float Volumen = 0.7f; // Asignamos a la variable Volumen un valor por defecto de 0.7
[Range(0f, 1.5f)] // Permitimos que el rango del deslizador en el editor de Unity vaya de 0 a 1.5
public float Pitch = 1f; // Asignamos a la variable Pitch un valor por defecto de 1.0

private AudioSource Fuente; // Declaramos la variable AudioSource Fuente.

AudioManager MiAudioManager = AudioManager.Instancia; // Asignamos a MiAudioManager una instancia del AudioManager

// Función para asignar el AudioSource y el Clip.
public void SetSource(AudioSource fuente) {
Fuente = fuente; // Asignamos a Fuente el AudioSource fuente
Fuente.clip = Clip; // Asignamos al clip del source el clip de audio
}

// Función para reproducir el sonido una sola vez
public void Play() {
Fuente.volume = Volumen; // Asignamos el volumen
Fuente.pitch = Pitch; // Asignamos el pitch
Fuente.Play(); // Reproducimos el sonido de la fuente
}

// Función para reproducir el sonido con repetición
public void PlayLoop()
{
Fuente.volume = Volumen; // Asignamos el volumen
Fuente.pitch = Pitch; // Asignamos el pitch
Fuente.loop = true; // Asignamos el valor true (verdadero) a la propiedad para reproducir en continuo
Fuente.Play(); // Reproducimos el sonido de la fuente
}

// Función para detener un sonido
public void StopSonido()
{
Fuente.Stop(); // Detenemos el sonido de la fuente
}

/*
// Función para cambiar el volumen de un sonido
public void setVolume(float nuevoVolumen)
{
Volumen = nuevoVolumen; // Asignamos en nuevo valor de volumen a Volumen
Fuente.volume = Volumen; // Asignamos al volumen de la fuente la variable Volumen

}

// Función para cambiar el pitch de un sonido
public void setPitch(float nuevoPitch)
{
Pitch = nuevoPitch; // Asignamos en nuevo valor de pitch a Pitch
Fuente.pitch = Pitch; // Asignamos al pitch de la fuente la variable Pitch
}
*/
}

public class AudioManager : MonoBehaviour { // Definimos la clase AudioManager para controlar el sonido

public static AudioManager Instancia;
[SerializeField] Sound[] Sonidos;

// Llamamos Awake al iniciar la escena, antes del Start()
void Awake()
{
if (Instancia != null) // Comprobamos si ya existe una instancia
{
Debug.LogError(“Más de un AudioManager en la escena”); // Mostramos un aviso en la consola para indicar que tenemos más de un AudioManager
}
else {
Instancia = this; // Si no existe, creamos una instancia
}
}

private void Start()
{
for (int i = 0; i < Sonidos.Length; i++) { // Recorremos todos los sonidos de la lista dentro del AudioManager…
GameObject _go = new GameObject(Sonidos[i].Nombre); // Creamos una referencia en _go
_go.transform.SetParent(this.transform); // Asignamos el Parent de _go a nuestro AudioManager y lo podremos ver como Child de éste en la jerarquía
Sonidos[i].SetSource(_go.AddComponent<AudioSource>()); // Asignamos la fuente del sonido
}
AudioManager MiAudioManager = AudioManager.Instancia; // Asignamos a la referencia MiAudioManager la instancia del AudioManager

MiAudioManager.PlayTheme(“theme_Game”); // Reproducimos el sonido theme_Game en loop

}

// Función para reproducir un sonido una sola vez
public void PlaySound(string nombre) {
for (int i = 0; i < Sonidos.Length; i++) // Iteramos por todos los sonidos
{
if (Sonidos[i].Nombre == nombre) { // Si el nombre coincide con el indicado, lo reproducimos. No paramos los otros sonidos.
Sonidos[i].Play();
return; // Salimos de la función
}
}
// Si no aparece el sonido en la lista, mostramos un mensaje de tipo warning en la consola
Debug.LogWarning(“AudioManager: Sonido no encontrado en la lista, ” + nombre);
}

// Función para reproducir un “tema” de fondo
public void PlayTheme(string nombre)
{
for (int i = 0; i < Sonidos.Length; i++) // Iteramos por todos los sonidos una vez
{
Sonidos[i].StopSonido(); // Pausamos los sonidos. Esto nos permitirá que no se solapen los sonidos de fondo.
}
for (int i = 0; i < Sonidos.Length; i++) // Iteramos por todos los sonidos
{
if (Sonidos[i].Nombre == nombre) // Cuando encontramos el que tiene el nombre indicado…
{
Sonidos[i].PlayLoop(); // Lo reproducimos en loop
return; // Salimos de la función
}
}
// Si no aparece el sonido en la lista, mostramos un mensaje de tipo warning en la consola
Debug.LogWarning(“AudioManager: Sonido no encontrado en la lista, ” + nombre);
}

// Función para reproducir el sonido asignado a un botón
public void PlaySonidoBoton()
{
PlaySound(“se_Button”); // Reproducimos el sonido que hemos llamado se_Button
}

}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PanelManager : MonoBehaviour
{
[SerializeField] GameObject[] PanelesJuego; // Lista con las referencias a los GameObjects de los paneles del juego
[SerializeField] AudioManager MiAudioManager; // Referencia al AudioManager

// Función para mostrar un panel del juego
public void ShowPanel(int index)
{
/* Explicación sobre el for loop:
Dentro del for loop declaramos una variable i y le asignamos el valor 0.
Repetimos lo que hay dentro del loop hasta que el valor de i tenga el mismo valor que la longitud de los paneles del juego.
El valor de i aumenta de 1 en 1. Lo indicamos con i++, o podemos cambiar i++ por i=i+1.
Dentro de una lista, cuando programamos con Unity empezamos a contar las posiciones desde 0. Es decir: 0, 1, 2…
Si tenemos 3 paneles en la lista, sus índices son: 0, 1 y 2, pero su PanelesJuego.Length es 3.
De esta manera, cuando la i tenga valor 3, saldremos del loop y no haremos nada.
*/
for(int i=0; i < PanelesJuego.Length; i++) // Recorremos todos los paneles en la lista PanelesJuego con una iteración FOR
{
if (PanelesJuego[i].activeSelf && i!=index) { // Si el panel en el que estamos está activo y index es diferente a i (de la iteración)…
PanelesJuego[i].SetActive(false); // Desactivamos el GameObject del panel que se encuentra en la posición i de la lista
}
}
PanelesJuego[index].SetActive(true); // Una vez los hemos desactivado todos, activamos el panel en la posición i de la lista

if (index == 1) // Si el panel que mostramos es el panel de pausa, con índice 1 en la lista, pausamos el juego.
{
PausarJuego(); // Ejecutamos la función para pausar el juego
// Podemos reproducir otra música dentro del menú pausa
MiAudioManager.PlayTheme(“theme_Pause”); // Le damos al play del tema con el nombre “theme_Pausa”.
return; // Salimos de la función
}
}

// Función para esconder un panel
public void HidePanel(int index)
{
PanelesJuego[index].SetActive(false); // Desactivamos el panel en la posición index de la lista de paneles

if (index == 1) // Si el panel que ocultamos es el panel de pausa, con índice 1 en la lista, continuamos el juego.
{
ContinuarJuego(); // Ejecutamos la función para continuar el juego
MiAudioManager.PlayTheme(“theme_Game”); // Reproducimos el tema del juego
return; // Salimos de la función
}
}

// Función para pausar el juego
private void PausarJuego()
{
// Para pausar el juego, hemos de poner Time.timeScale a 0. Esto pausará todos los procesos que usen Time.
if (Time.timeScale == 0) { return; } // Si la escala de tiempo es 0, no hacemos nada -> return sale de la función.
Time.timeScale = 0; // Si no hemos salido de la función, ejecutamos ésta línea y cambiamos la timeScale a 0.
}

// Función para continuar el juego
private void ContinuarJuego()
{
if (Time.timeScale == 1) { return; } // Si la escala de tiempo es 1, no hacemos nada -> return sale de la función.
Time.timeScale = 1; // Si no hemos salido de la función, ejecutamos ésta línea y cambiamos la timeScale a 1.
}

}

¡Esperamos que os sea de ayuda! ¡Nos vemos en la próxima sesión!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Pin It on Pinterest

×