Unity:场景重载后音频源被销毁

时间:2020-05-10 16:34:13

标签: c# unity3d

我刚刚在我的小测试游戏中引入了暂停选项。我的背景音乐(即使场景发生变化也可以播放整个游戏),所以我决定在游戏暂停时停止音乐播放。出于某种原因,直到游戏重新加载/更改场景时,它才能正常工作。
然后弹出错误

“'AudioSource'类型的对象已被破坏。”

有人可以帮忙吗?另外..我认为它是一个组件,而不是对象!我不确定,也许两者都是。

我如何连续播放音乐:

void Awake()
{
    if (instance != null)
    {
        Destroy(gameObject);
    }
    else
    {
        instance = this;
        GameObject.DontDestroyOnLoad(gameObject);
    }      
}

我的暂停菜单:

public static bool GameIsPaused = false;
public GameObject pauseMenuUI;
public AudioSource song;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Escape))
    {
        if (GameIsPaused)
        {
            Resume();
        }
        else
        {
            Pause();
        }
    }
}

void Resume()
{
    pauseMenuUI.SetActive(false);
    Time.timeScale = 1f;
    GameIsPaused = false;
    song.mute = false;
}

void Pause()
{
    pauseMenuUI.SetActive(true);
    Time.timeScale = 0f;
    GameIsPaused = true;
    song.mute = true;
}

谢谢!

2 个答案:

答案 0 :(得分:2)

肯定是暂停菜单脚本中的音频变量。我认为暂停菜单会在新的场景加载时与AudioSrouce脱离关联。要检查这一点,请进入游戏模式并加载新场景。在新场景中,转到层次结构,然后单击上面带有暂停菜单脚本的GameObject。现在检查公共var AudioSource是否有任何关联。

答案 1 :(得分:1)

您的问题可能出在这里

 if (instance != null)

这是一个单例模式,此行的目的是防止存在您的单例类的两个实例,这是很大的禁忌。这意味着,如果尝试创建一个新对象但已经存在一个新对象,它将破坏该新对象。
但是,如果在第一个单例中出于任何原因再次调用Awake(),那么它将看到成员instance不是null并立即销毁自己。

一种解决方法是将其更改为此:

 if (instance != null && instance != this)

这将防止您的单身人士自我毁灭。