es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Singleton de Audio de Unity a través de Escenas

Tengo un singleton básico que maneja el audio a través de escenas.
“`
private void Awake() {
if (Instance == null) {
Instance = this;
} else {
Destroy(gameObject);
return;
}

    DontDestroyOnLoad(gameObject);
}

Si coloco este singleton de audio en Scene1, parece que funciona cuando cambio a Scene2. El único problema surge cuando inicio en Scene2, entonces el audio deja de funcionar. Supongo que esto se debe a que el singleton solo se crea en Scene1, por lo que no hay una referencia al singleton en Scene2. He intentado hacer mi singleton un prefab para poder tenerlo en cada una de mis escenas, lo que solucionaría mi problema de no tener un singleton existente en Scene2, pero si cambio de escenas, entonces deja de funcionar.

¿Hay alguna forma de tener un singleton de audio que funcione aunque no inicie en Scene1? Supongo que no tiene que ser un singleton, pero eso es lo que tengo hasta ahora. Soy nuevo en Unity, así que solo he estado buscando tutoriales básicos de Unity.

Edición: La razón por la que quiero comenzar en Scene2 es porque quiero probar escenas específicas.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es tener un script separado que se adjunte a cada escena en tu juego, el cual verifica si existe el singleton de audio y lo crea si no existe. De esta manera, sin importar desde dónde se inicie la escena, el singleton de audio se creará si no existe y persistirá a lo largo del juego.

    Podrías crear un nuevo script llamado AudioInit en Unity, adjuntarlo a un objeto vacío en cada escena y agregar el siguiente código:

    public class AudioInit : MonoBehaviour
    {
        // Referencia al singleton de audio
        public GameObject audioSingleton;
    
        // Verificar si existe el singleton de audio y crearlo si no existe
        void Awake()
        {
            if (GameObject.Find(audioSingleton.name) == null)
            {
                Instantiate(audioSingleton);
            }
        }
    }
    

    En cada escena, arrastrarías el prefab del singleton de audio al campo audioSingleton del script AudioInit para hacer referencia a él. De esta manera, cada escena tendrá su propio script AudioInit que verifica el singleton de audio y lo crea si es necesario.

    Alternativamente, podrías usar una clase estática en lugar de un singleton para manejar tu audio, ya que no requiere que se cree una instancia. Podrías crear un nuevo script llamado AudioManager y agregar el siguiente código:

    public static class AudioManager
    {
        // Método para reproducir audio
        public static void PlaySound(AudioClip clip, float volume)
        {
            // Crear fuente de audio y reproducir clip
            AudioSource audioSource = new GameObject("AudioSource").AddComponent<audiosource>();
            audioSource.clip = clip;
            audioSource.volume = volume;
            audioSource.Play();
    
            // Destruir fuente de audio después de que termine de reproducir el clip
            Object.Destroy(audioSource.gameObject, clip.length);
        }
    }
    

    Luego, en cualquier script que necesite reproducir audio, llamarías el siguiente código:

    AudioManager.PlaySound(audioClip, volumen);
    

    De esta manera, puedes reproducir audio desde cualquier escena sin preocuparte por crear y hacer referencia a un singleton.

Comments are closed.