如何在场景重置时重置事件订阅(重新加载)

时间:2016-04-15 16:11:26

标签: unity3d event-handling

我有一个场景,我想在玩家失败时重新加载。我使用SceneManager.LoadScene("MainScene");执行此操作,但后来出现此错误:

  

MissingReferenceException:类型' AudioSource'的对象一直都是   被摧毁但你还在试图访问它。

经过一番挖掘后,我发现问题是由我的事件造成的。看起来前一场景的订阅者仍然活跃,并且正在寻找已被破坏的对象。所以问题是:

  1. 是否有可能以某种方式清除所有订阅者,或者在加载新场景之前我是否必须逐个取消订阅?
  2. (我知道我不应该问这个但是......)你能指点我一些简单的事件管理器的教程或例子吗?我正在考虑一些静态类,它将包装我的事件处理程序并允许我管理订阅?

1 个答案:

答案 0 :(得分:0)

1 。可以清除所有订阅者,但最好在您订阅的每个脚本中取消订阅。这并不难。在您订阅某个活动的每个班级的OnDisable()功能中取消订阅,您就不会遇到目前遇到的问题。

清除个人事件

void OnDisable(){
ClassName.eventName -= functionName;
}

清除所有活动

如果活动为Unity UI Event,您可以使用RemoveAllListeners()删除所有订阅者。

假设您正在使用C#eventdelegates,并且委托的名称为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