Unity3d Destroy(gameObject)仅在订阅事件时工作一次

Unity3d Destroy(gameObject)仅在订阅事件时工作一次,unity3d,events,delegates,Unity3d,Events,Delegates,在我的第一个脚本中,我声明了这样一个事件 public static event Action OnChangeScene; private void OnMouseDown() { OnChangeScene?.Invoke(); } 在我的第二个脚本中,我试图通过lamda表达式让Destroy(gameObject)订阅该事件 private void Start() { MoveButton.OnChangeScene += () => Destroy(gam

在我的第一个脚本中,我声明了这样一个事件

public static event Action OnChangeScene;

private void OnMouseDown()
{
     OnChangeScene?.Invoke();
}
在我的第二个脚本中,我试图通过lamda表达式让Destroy(gameObject)订阅该事件

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

问题是,它只在第一次单击鼠标时起作用。在这之后,我得到一个错误,“MissingReferenceException:类型为'Animal'的对象已被销毁,但您仍在尝试访问它。您的脚本应该检查它是否为null,或者您不应该销毁该对象。

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

但是,您正在订阅一个匿名方法,您需要对它的引用才能取消订阅。(有关和的更多详细信息)。你可以找到有关此事的官方信息

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

重要的是要注意,您不能轻易地取消订阅 事件,如果您使用匿名函数订阅它。到 取消订阅在这种情况下,有必要返回代码 在订阅事件的位置,将匿名方法存储在 委托变量,然后将委托添加到事件中。一般来说 我们建议您不要使用匿名函数来订阅 如果您必须在以后某个时间取消订阅活动,请选择“活动” 在代码中插入一个点

考虑这种方法:

private Action destroyDelegate;

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

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

销毁对象后,应取消订阅事件

但是,您正在订阅一个匿名方法,您需要对它的引用才能取消订阅。(有关和的更多详细信息)。你可以找到有关此事的官方信息

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

重要的是要注意,您不能轻易地取消订阅 事件,如果您使用匿名函数订阅它。到 取消订阅在这种情况下,有必要返回代码 在订阅事件的位置,将匿名方法存储在 委托变量,然后将委托添加到事件中。一般来说 我们建议您不要使用匿名函数来订阅 如果您必须在以后某个时间取消订阅活动,请选择“活动” 在代码中插入一个点

考虑这种方法:

private Action destroyDelegate;

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

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