我正在使用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);
}
感谢您的帮助
答案 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
立即删除它,而不是在另一帧中删除它。