Andre Huaman Yovera
Aquí los audios!
Leonel Grisaleña
Muchas gracias!
¿Qué es un Singleton y cuándo usarlo?
El Singleton es un patrón de diseño que asegura que una clase solo tenga una instancia mientras se ejecuta un programa. Imagínate un sistema de audio que, en un juego, deba reproducir sonidos en diferentes contextos y escenas. Si este sistema se multiplicara en distintas instancias, manejar los sonidos se volvería caótico. Por eso, el uso de un Singleton asegura una coordinación consistente, evitando solapamientos y asegurando que los sonidos sean manejados por una única fuente. Veamos cómo implementarlo.
¿Cómo implementar un Singleton en Unity con C#?
Para implementar un Singleton en Unity, seguimos estos pasos:
Crear el Script: Dentro de tu proyecto Unity, crea una carpeta llamada singletons en scripts y dentro de ella, un script de C# llamado SoundManager.
Definir el Singleton en C#: Abre Visual Studio y define el Singleton.
public class SoundManager : MonoBehaviour { public static SoundManager instance; // Punto de acceso global void Awake() { if (instance != null) { Destroy(gameObject); } else { instance = this; DontDestroyOnLoad(gameObject); // Preservar durante cambios de escenas } } }
Configurar la Clase para Reproducir Sonidos:
AudioSource y un AudioClip.private AudioSource audioSource; public AudioClip shoot;
Start, inicializa el audioSource.void Start() { audioSource = GetComponent<AudioSource>(); }
public void PlayShoot() { audioSource.PlayOneShot(shoot); }
Configurar en Unity:
AudioSource en tu escena y asocia el AudioClip.Play On Awake y Loop.¿Cómo usar el Singleton para disparos en el juego?
Para integrar el disparo de un personaje usando el sistema desarrollado:
Modificar el Script del Player: En el script PlayerController, añade un método OnFire que interactúe con el SoundManager.
void OnFire() { SoundManager.instance.PlayShoot(); }
Configurar Input Actions:
Input Action y agrega un binding a la acción fire, vinculando la tecla "espacio".Verificar la Funcionalidad:
Play mode de Unity que el disparo ocurre al presionar "espacio" y ajusta las configuraciones si es necesario.El uso de un Singleton en este contexto facilita que, sin importar la escena seleccionada, el sistema de audio funcione coherentemente y se mantenga durante todo el juego, mejorando la experiencia del jugador.
Consejo adicional:
Convierte tu GameManager existente en un Singleton, lo que te permitirá acceder directamente a la instancia de GameManager desde otros scripts, mejorando la eficiencia y manejo del estado global en tu juego. ¡Sigue explorando y practicando! Unity te ofrece infinitas posibilidades para desarrollar tus habilidades en programación de videojuegos.
Andre Huaman Yovera
Aquí los audios!
Leonel Grisaleña
Muchas gracias!
Aprovechando lo aprendido en la clase de eventos agregue al susodicho evento que creamos anteriormente, una funcion para que desactive el mapa de acciones "Player" de modo que si el player muere se desactive todo los inputs contenidos en ese mapa como teclas de movimiento, disparo, etc. De esta forma el al morir tambien deja de reproducirse sonidos si presiono la tecla space o si uso wasd para moverme.
private void Awake() { GameManager.SharedInstance.onPlayerDeath += () => { TryGetComponent(out PlayerInput playerInput); playerInput.actions.FindActionMap("Player").Disable(); }; }
Espero les sirva manitos.
Divani David Fuentes Marcos
No se de donde obtener los audios mencionados, en recursos no me aparecen =(
Daniel Sanchez
ProfesorHola! si no están en el repositorio puedes encontrar algunos similares con una búsqueda rápida en https://freesound.org/ Es de dónde yo los saqué
Leonel Grisaleña
En algunas charlas vi que los Singletons no eran buenas practicas, ya que hacian el codigo poco modular y dependiente entre las distintas clases. Por que se "incentiva" a usar singletons en vez de llamar referencias a la clase en el Awake?
Daniel Sanchez
ProfesorDepende la aproximación al problema, pero muchas veces tenemos sistemas que pueden ser tan "modulares" que no sabemos si están o no creados para ese punto y hacer una referencia a ellos en el awake puede dar lugar a un error, por lo que un elemento único que exista "perpetuamente" puede aliviar algo de eso, son preferencias y si bien el singleton puede convertirse en una muy mala práctica, en un caso simple como AudioManager, soluciona muchos de los problemas al manejar audios entre escenas
Leonel Grisaleña
Que pasa si quiero reproducir una canción pero quiero manejar el volumen de los efectos de forma separada a la musica? Por ejemplo el disparo se escucha muy fuerte y lo quiero más bajo que otros efectos
Daniel Sanchez
ProfesorSe usan Audio Mixers para "conectar" la salida de los AudioSources que se encargan de los SFX, cada Mixer tiene un "máster" que controla su intensidad y estos a su vez se pueden controlar desde un "volumen global"
Victoria Hugo Pérez Arteaga
Singleton
Patrón de diseño que restringe una clase a una sola instancia en ese momento.
Consideremos un sistema de audio que tal vez deba reproducir múltiples sonidos en múltiples espacios de tiempo y tal vez en múltiples escenas. Si nosotros tenemos más de 1 sistema de audio o más de 1 instancia hará que coordinar esos sonidos entre varios objetos sea mucho más difícil.
Santiago Rada
Los audios estan en los recursos de la clase 27, los de la clase 29 no tienen audo
Rogelio Gomez
En los recursos de la clase 27 estan los audios.