¿Cómo cambiar el AudioClip de DontDestroyOnLoad’ed AudioSource en una nueva escena?
– UnityAssets3Free
buenas , me llamo josel luis y en esta ocasion os traigo
nueva pregunta
Tengo algunas escenas diferentes y me gustaría tocar diferentes canciones en escenas específicas. Creé un objeto de juego y adjunté un clip de audio y un guión. El script básicamente evita que Unity falle. Para que pueda jugar en diferentes escenas.
using UnityEngine;
public class OSTPlayer : MonoBehaviour
private static OSTPlayer instance = null;
private static OSTPlayer Instance
get return instance;
private void Awake()
if (instance != null && instance != this)
Destroy(this.gameObject);
return;
else
instance = this;
DontDestroyOnLoad(this.gameObject);
En una escena específica, me gustaría cambiar el clip de audio para poder reproducir un archivo de sonido diferente. Escribí el código a continuación (adjunto a un objeto de juego vacío) y parece cambiar el clip de audio. Pero no se escucha ningún sonido, como dejar de tocar.
using UnityEngine;
using UnityEngine.SceneManagement;
public class StreetNavigate : MonoBehaviour
public AudioClip clip1;//I am dragging n dropping from the editor
private AudioSource BGMaudioSource;
private void Start()
BGMaudioSource = GameObject.FindGameObjectWithTag("OST1").GetComponent<AudioSource>();
BGMaudioSource.clip = clip1;
¿Estoy cometiendo errores o cuál es el problema?
1 respuesta 1
Tenga en cuenta que simplemente cambiando el clip
no tendrá ningún efecto.
asignando clip
con un nuevo clip de audio no cambia instantáneamente el clip que se está reproduciendo actualmente.
También tienes que (re)comenzar a jugar a través de Play
!
Para hacer las cosas un poco más fáciles:
Ya tienes un patrón singleton así que puedes hacerlo public
y hacer
public class OSTPlayer : MonoBehaviour
// If possible already reference this via the Inspector
[SerializeField] private AudioSource _audioSource;
public AudioSource AudioSource => _audioSource;
// Others can only read
// Only this class can set the value
public static OSTPlayer Instance get; private set;
private void Awake()
if (instance != null && instance != this)
Destroy(this.gameObject);
return;
instance = this;
DontDestroyOnLoad(this.gameObject);
// As fallback get it on runtime ONCE
if(!_audioSource) _audioSource = GetComponent<AudioSource>();
public void PlayClip(AudioClip clip)
_audioSource.clip = clip;
_audioSource.Play();
y luego en cualquier script puede acceder a él a través de
OSTPlayer.Instance.AudioSource.clip = clip;
OSTPlayer.Instance.AudioSource.Play();
O elimine el acceso público a la fuente y use el método que ya agregué
OSTPlayer.Instance.PlayClip(clip);
nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias
por hoy,espero que te halla servido