Непрерывный аудиоисточник в DontDestroyOnLoad GameObject
Моя игра содержит несколько сцен, и я хочу играть непрерывную игровую музыку между несколькими сценами.
Для этой цели я написал такой код:
public static SoundManager Instance { get { return instance; } }
public AudioClip[] levelClips;
public AudioSource bgMusicAS;
//
private static SoundManager instance;
private bool isSoundEnable;
private void Awake ()
{
if (SoundManager.Instance != null) {
Destroy (gameObject);
return;
}
DontDestroyOnLoad (gameObject);
instance = this;
isSoundEnable = DataStorage.RetrieveSoundStatus ();
}
В главном меню игры запускается приведенный выше кодовый скрипт и создается игровой объект Don'tDestroyOnLoad AudioSource. Но когда я перехожу на игровую сцену, игровая музыка начиналась сначала, а теперь с того места, где мы остались в сцене главного меню.
Я хочу, чтобы это было непрерывным между всеми сценами игры. Пожалуйста, дайте мне несколько советов для этого.
РЕДАКТИРОВАТЬ:
Именно так я играю и приостанавливаю фоновую музыку.
public void PlayLevelMusic (int musicId)
{
if (!isSoundEnable)
return;
bgMusicAS.clip = levelClips [musicId];
bgMusicAS.Play ();
}
public void StopLevelMusic ()
{
bgMusicAS.Pause ();
}
При запуске новой сцены автоматически запускается фоновая музыка во всех моих сценах.
2 ответа
Я нашел решение этой проблемы с помощью @Harinezumi в разделе Вопрос / Ответ Unity.
Проблема в том, что AudioSource.Play() сбрасывает прогресс AudioClip. При вызове PlayLevelMusic() убедитесь, что выбранный клип отличается от текущего воспроизводимого клипа, и измените его и начните воспроизведение, только если оно есть. Как это:
if (bgMusicAS.clip != levelClips[musicId]) {
bgMusicAS.clip = levelClips[musicId];
bgMusicAS.Play();
}
В качестве решения вы можете использовать SceneManager.LoadSceneAsync() и поместить свой музыкальный объект в отдельную сцену.
DontDestroyOnLoad, скорее всего, в будущем обесценится (хотя не цитируйте меня по этому поводу, у меня нет внутренней информации, это догадки)