【问题标题】:Should I nullify fields when destroying GameObjects?销毁游戏对象时我应该取消字段吗?
【发布时间】:2018-06-28 12:20:48
【问题描述】:

如果一个字段是通过 Inspector 设置的,我应该在销毁 GameObject 时取消它还是 Unity 会自动这样做?

public class TestClass : MonoBehaviour
{
    public Image Icon;
    public Button CloseButton;

    private void Start()
    {
        Icon.color = Color.black;
        CloseButton.onClick.AddListener( MyButtonListener );
    }

    private void OnDestroy()
    {
        CloseButton.onClick.RemoveListener( MyButtonListener );

        //DO I NEED THIS?
        Icon = null;
        CloseButton = null;
    }

    private void MyButtonListener() { }
}

【问题讨论】:

  • 这两种类型(Image / Button)是否实现IDisposable

标签: c# unity3d memory-management


【解决方案1】:

如果一个字段是通过 Inspector 设置的,我应该在销毁时将其无效吗 GameObject 或 Unity 会自动执行此操作吗?

不,您不必在销毁 Unity 对象之前或之后将其设置为 null。 Unity 的 Object 有一个 == 运算符重载。当 Object 被销毁时,Unity 将该对象标记为 null,但 Object 并不是真正的 null。这是一种实现的机制,以便您检查它是否是nullif(unityObject == null)。当它被标记为null时,再次将其设置为null是没有意义的。

请注意,当您说销毁时,我假设您正在使用 DestroyDestroyImmediate 函数销毁对象。此外,如果您只是像在问题中那样取消订阅某个事件,则无需销毁该对象。您也不需要将其设置为null

【讨论】:

  • 谢谢!是的,我通过调用Destroy 函数来销毁对象。想要确保所有引用都为空,以便 GC 可以正确释放内存。
  • 虽然 Unity 在内部区分未设置的引用和对已销毁对象的引用,但正如程序员所说,它覆盖了 == 运算符,因此从代码的角度来看结果是相同的跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多