在我的第一个脚本中,我声明了一个类似的事件
public static event Action OnChangeScene;
private void OnMouseDown()
{
OnChangeScene?.Invoke();
}
在我的第二个脚本中,我试图让Destroy(gameObject)通过lamda表达式订阅该事件。
private void Start()
{
MoveButton.OnChangeScene += () => Destroy(gameObject);
}
问题是它只在第一次点击鼠标时才有效。之后,我收到错误," MissingReferenceException:' Animal'已被破坏,但你仍然试图访问它。您的脚本应检查它是否为空或您不应销毁该对象。"
答案 0 :(得分:3)
您应该在销毁对象时取消订阅该事件。
但是,您正在订阅匿名方法,并且您需要引用它以取消订阅它。 (有关this question和that too的更多详情)。您可以在MSDN page找到关于此事的官方信息。
如果您以后不必取消订阅活动,可以使用 附加赋值运算符(+ =)将匿名方法附加到 事件
重要的是要注意你不能轻易取消订阅 如果您使用匿名函数订阅它,则为event。至 在这种情况下取消订阅,有必要返回代码 在您订阅该事件的地方,将匿名方法存储在 委托变量,然后将委托添加到事件中。一般来说, 我们建议您不要使用匿名函数进行订阅 事件,如果您稍后将不得不取消订阅该事件 在你的代码中指出。
考虑这种方法:
private Action destroyDelegate;
private void Start()
{
destroyDelegate = () => Destroy(gameObject);
MoveButton.OnChangeScene += destroyDelegate;
}
protected void OnDestroy()
{
MoveButton.OnChangeScene -= destroyDelegate;
}