我有一个场景,我想在玩家失败时重新加载。我使用SceneManager.LoadScene("MainScene");
执行此操作,但后来出现此错误:
MissingReferenceException:类型' AudioSource'的对象一直都是 被摧毁但你还在试图访问它。
经过一番挖掘后,我发现问题是由我的事件造成的。看起来前一场景的订阅者仍然活跃,并且正在寻找已被破坏的对象。所以问题是:
答案 0 :(得分:0)
1 。可以清除所有订阅者,但最好在您订阅的每个脚本中取消订阅。这并不难。在您订阅某个活动的每个班级的OnDisable()
功能中取消订阅,您就不会遇到目前遇到的问题。
清除个人事件:
void OnDisable(){
ClassName.eventName -= functionName;
}
清除所有活动:
如果活动为Unity UI Event
,您可以使用RemoveAllListeners()
删除所有订阅者。
假设您正在使用C#event
和delegates
,并且委托的名称为buttonPressed
,而事件的名称是onButtonPressed
,您可以通过
if (onButtonPressed != null)
{
System.Delegate[] deletegates = onButtonPressed.GetInvocationList();
for (int i = 0; i < deletegates.Length; i++)
{
//Remove all event
onButtonPressed -= deletegates[i] as buttonPressed;
}
}
2 。我不知道你在做什么,但你可能不需要Event Manager
。只需在OnDisable
函数中订阅和取消订阅即可。如果您仍然需要,可以获得活动经理here。