Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
C# Unity:使用UnityEvent处理自定义EventHandler的注销_C#_Unity3d - Fatal编程技术网

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;
}