Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 如何在场景重置(重新加载)时重置事件订阅_Unity3d_Event Handling - Fatal编程技术网

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

Unity3d 如何在场景重置(重新加载)时重置事件订阅,unity3d,event-handling,Unity3d,Event Handling,我有一个场景,我想在玩家失败时重新加载。我使用SceneManager.LoadScene(“mainsene”)但是我有一个错误: MissingReferenceException:已删除类型为“AudioSource”的对象 已销毁,但您仍在尝试访问它 经过一番挖掘,我发现问题是由我的事件引起的。看起来上一个场景中的订阅者仍然处于活动状态,并且正在寻找已经被破坏的对象。因此,问题是: 是否可能以某种方式清除所有订户,或者在加载新场景之前,我必须逐个取消订户 (我知道我不应该问这个,但是…)

我有一个场景,我想在玩家失败时重新加载。我使用
SceneManager.LoadScene(“mainsene”)但是我有一个错误:

MissingReferenceException:已删除类型为“AudioSource”的对象 已销毁,但您仍在尝试访问它

经过一番挖掘,我发现问题是由我的事件引起的。看起来上一个场景中的订阅者仍然处于活动状态,并且正在寻找已经被破坏的对象。因此,问题是:

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

  • 1。可以清除所有订阅服务器,但最好在订阅的每个脚本中取消订阅。这并不难取消订阅
    OnDisable()
    函数中的
    ,在您订阅的每个类中取消订阅,您将不会遇到当前遇到的问题

    清除单个事件

    void OnDisable(){
    ClassName.eventName -= functionName;
    }
    
    清除所有事件

    void OnDisable(){
    ClassName.eventName -= functionName;
    }
    
    如果事件是Unity UI event
    ,则可以使用
    RemoveAllListeners()
    删除所有订阅服务器

    假设您正在使用C#
    事件
    委托
    ,并且您委托的名称为
    按钮按下
    ,而事件的名称为
    on按钮按下
    ,则您可以通过执行以下操作删除订阅服务器:

        if (onButtonPressed != null)
        {
            System.Delegate[] deletegates = onButtonPressed.GetInvocationList();
            for (int i = 0; i < deletegates.Length; i++)
            {
                //Remove all event
                onButtonPressed -= deletegates[i] as buttonPressed;
            }
        }
    
    if(onButtonPressed!=null)
    {
    System.Delegate[]deletegates=onButtonPressed.GetInvocationList();
    for(int i=0;i

    2。我不知道您在做什么,但您可能不需要
    事件管理器
    。只需在禁用的
    功能中订阅和取消订阅即可。如果您仍然需要,您可以使用event manager。

    在写完我的问题后,我尝试了OnDisable()方法,它很有效,但我一直在等待一些答案,因为这个解决方案对我来说似乎不是很优雅。感谢在OnDisable()函数中使用它是正确的方法。它保证每次都能工作。如果需要,可以使用clear all event方法或创建自己的事件管理器。看看Unity是如何处理事件的