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是如何处理事件的