Destroy(gameObject)仅在订阅事件时才有效

时间:2018-05-27 02:55:16

标签: unity3d events delegates

在我的第一个脚本中,我声明了一个类似的事件

public static event Action OnChangeScene;

private void OnMouseDown()
{
     OnChangeScene?.Invoke();
}

在我的第二个脚本中,我试图让Destroy(gameObject)通过lamda表达式订阅该事件。

private void Start()
{
    MoveButton.OnChangeScene += () => Destroy(gameObject);
}

问题是它只在第一次点击鼠标时才有效。之后,我收到错误," MissingReferenceException:' Animal'已被破坏,但你仍然试图访问它。您的脚本应检查它是否为空或您不应销毁该对象。"

1 个答案:

答案 0 :(得分:3)

您应该在销毁对象时取消订阅该事件。

但是,您正在订阅匿名方法,并且您需要引用它以取消订阅它。 (有关this questionthat too的更多详情)。您可以在MSDN page找到关于此事的官方信息。

  

如果您以后不必取消订阅活动,可以使用   附加赋值运算符(+ =)将匿名方法附加到   事件

     

重要的是要注意你不能轻易取消订阅   如果您使用匿名函数订阅它,则为event。至   在这种情况下取​​消订阅,有必要返回代码   在您订阅该事件的地方,将匿名方法存储在   委托变量,然后将委托添加到事件中。一般来说,   我们建议您不要使用匿名函数进行订阅   事件,如果您稍后将不得不取消订阅该事件   在你的代码中指出。

考虑这种方法:

private Action destroyDelegate;

private void Start()
{
    destroyDelegate = () => Destroy(gameObject);
    MoveButton.OnChangeScene += destroyDelegate;
}

protected void OnDestroy()
{
    MoveButton.OnChangeScene -= destroyDelegate;
}