【问题标题】:Destroy(gameObject) only works once when subscribed to an eventDestroy(gameObject) 仅在订阅事件时有效
【发布时间】:2018-05-27 11:44:16
【问题描述】:

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

public static event Action OnChangeScene;

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

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

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

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

【问题讨论】:

    标签: unity3d events delegates


    【解决方案1】:

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

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

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

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

    考虑这种方法:

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

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2023-03-25
      • 2023-03-19
      • 2022-01-08
      相关资源
      最近更新 更多