C# Unity:使用UnityEvent处理自定义EventHandler的注销
我使用了我创建的自定义(系统)事件处理程序:C# Unity:使用UnityEvent处理自定义EventHandler的注销,c#,unity3d,C#,Unity3d,我使用了我创建的自定义(系统)事件处理程序: public event EventHandler<T> OnItemSelected; 然而,我很确定它没有自我清理,当我的游戏对象被破坏时,这会导致内存泄漏。 我怎样才能防止这种情况?我是否应该用UnityEvent替换我的EventHandler,并使用RemoveAllListeners?你不能 Lambda表达式如您所说是匿名的,因此无法注销,因为您无法对其进行寻址 如果以后需要删除它们-不要使用lambdas,而是使用显式方
public event EventHandler<T> OnItemSelected;
然而,我很确定它没有自我清理,当我的游戏对象被破坏时,这会导致内存泄漏。
我怎样才能防止这种情况?我是否应该用UnityEvent
替换我的EventHandler
,并使用RemoveAllListeners
?你不能强>
Lambda表达式如您所说是匿名的,因此无法注销,因为您无法对其进行寻址
如果以后需要删除它们-不要使用lambdas,而是使用显式方法,例如,而不是
OnItemSelected += (T) => { ... };
相当明确地使用
private void HandleItemSelected(T value)
{
...
}
OnItemSelected += HandleItemSelected;
现在您还可以使用
private void OnDestroy()
{
OnItemSelected -= HandleItemSelected;
}
有人说,在Unity Monobhavior的OnEnable()
中注册事件并在OnDisable()
中注销事件(通过-=
)是合适的,但也许其他人知道更好的模式。谢谢你的回答。然而,我在这里讨论的是Unity如何帮助我解决这个问题,而不是如何在c#中做到这一点。@Scipion,而是。。。Unity基于c#,您的所有脚本可能都是c#。。这基本上是一个关于c#的问题。你想使用哪种工具取决于你自己。我演示了如何从EventHandler
中删除侦听器。如果你想使用UnityEvent
的话,没有什么可以反对的。
private void OnDestroy()
{
OnItemSelected -= HandleItemSelected;
}