DontDestroyOnLoad 游戏对象中的连续音频源

Continuous AudioSource in 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 ();
 }

新场景启动时,我所有场景自动从第一个开始播放背景音乐。

作为解决方案,您可以使用 SceneManager.LoadSceneAsync() 并将您的音乐对象放在单独的场景中。

无论如何,DontDestroyOnLoad 将来可能会贬值(尽管不要引用我的话,我没有内部信息,这是猜测)

我在 Unity Question/Answer 部分通过 @Harinezumi 的帮助找到了解决这个问题的方法。

问题是 AudioSource.Play() 重置了 AudioClip 的进度。当您调用 PlayLevelMusic() 时,请检查所选剪辑是否与当前播放的剪辑不同,并且只有在不同时才更改并开始播放。像这样:

if (bgMusicAS.clip != levelClips[musicId]) {
     bgMusicAS.clip = levelClips[musicId];
     bgMusicAS.Play();
 }