加载场景时删除额外的音频监听器

时间:2018-04-18 03:15:31

标签: c# unity3d asynchronous

我正在使用SceneManager.LoadSceneAsync预加载一个新场景以创建动画退出效果,但这给了我错误:

  

场景中有2个音频监听器。请确保有   在场景中总是只有一个音频监听器。

如何确保我的场景中只有一个音频监听器?

    // Public function to change Scene
    public void GoToScene(string goToScene)
    {
        // Starts exit animation and changes scene
        CanvasAnimation.SetBool("hide", true);
        StartCoroutine(ChangeScene(ExitTime, goToScene));
    }

    IEnumerator ChangeScene(float time, string goToScene)
    {
        //Set the current Scene to be able to unload it later
        Scene currentScene = SceneManager.GetActiveScene();

        // The Application loads the Scene in the background at the same time as the current Scene.
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(goToScene, LoadSceneMode.Additive);
        asyncLoad.allowSceneActivation = false;

        yield return new WaitForSeconds(time);

        asyncLoad.allowSceneActivation = true;

        //Wait until the last operation fully loads to return anything
        while (!asyncLoad.isDone)
        {
            yield return null;
        }

        //Move the GameObject (you attach this in the Inspector) to the newly loaded Scene
        SceneManager.MoveGameObjectToScene(ObjToSave, SceneManager.GetSceneByName(goToScene));

        //Unload the previous Scene
        SceneManager.UnloadSceneAsync(currentScene);
    }

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

通过检查所有相机,您可以确保油性地拥有一个AudioListener。它们通常自动连接到新创建的相机。检查每个相机并将其取下。您只需要将一个AudioListener连接到主摄像头。

您也可以从代码

执行此操作

使用AudioListener在场景中查找FindObjectsOfType的所有实例,如果它们未附加到MainCamera,则将其删除。您可以通过检查AudioListener名称应该是" MainCamera"来查看tag是否附加到主摄像头。默认情况下。

AudioListener[] aL = FindObjectsOfType<AudioListener>();
for (int i = 0; i < aL.Length; i++)
{
    //Destroy if AudioListener is not on the MainCamera
    if (!aL[i].CompareTag("MainCamera"))
    {
        DestroyImmediate(aL[i]);
    }
}

有时候,你可能会有多台摄像机使用&#34; MainCamera&#34;标签。如果是这种情况,请保留AudioListener返回的第一个FindObjectsOfType,但要销毁阵列中的AudioListener。你留下一个,因为它需要在场景中播放声音。

AudioListener[] aL = FindObjectsOfType<AudioListener>();
for (int i = 0; i < aL.Length; i++)
{
    //Ignore the first AudioListener in the array 
    if (i == 0)
        continue;

    //Destroy 
    DestroyImmediate(aL[i]);
}

请注意,Destroy函数也应该没问题。我选择DestroyImmediate立即删除它,而不是在另一帧中删除它。