c# - Unity如何使GameObject实例在被引用时被销毁?

标签 c# unity-game-engine

在Unity中,GameObject可以被销毁。

这是场景:

  1. 实例化 GameObjectA 和 GameObjectB
  2. 向 GameObjectA 添加脚本(此脚本可以保存另一个 GameObject 的引用)
  3. GameObjectA 中的脚本查找并保存 GameObjectB 的引用

从这里开始一切都很开心。我们可以用 GameObjectB 做任何事情。

  • 使用 GameObject.Destroy 销毁 GameObjectB
  • 此处当我们从 GameObjectA 的脚本访问 GameObjectB 时,它将为 null。

    您无法访问任何方法、字段和属性,因为它们已被销毁。

    <小时/>

    问题是他们如何做到这一点?

    如果你仔细想想。

    在纯 C# 对象中,如果有人保留该实例的引用,GC 将不会收集该对象。

    我知道 Unity 有这些对象的包装层。

    但我想知道它是如何工作的?以及如何用C#实现它?

    最佳答案

    这里有一个微妙之处。在您的示例中,如果您选中 GameObject B,它将返回 equals 为 null。但这是因为 Unity 重写了 UnityEngine.Object 的相等运算符。如果您实际上尝试访问 GameObject 的任何属性或方法,您将不会得到 NullReferenceException;你会从 Unity 得到一个异常,表明该对象已被销毁。

    也就是说,从.NET/Mono的内存管理的角度来看,它仍然存在。因此,要回答您的问题“如何在 C# 中实现它”,技巧就是相等覆盖。但即使是 Unity 本身也对这种设计选择进行了重新考虑,所以不要在家尝试。

    关于c# - Unity如何使GameObject实例在被引用时被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51914957/

    相关文章:

    c# - 为什么 POCO 相对于 EF4、nHiberate 是一件好事

    c# - Membus 和简单注入(inject)器 - 通过接口(interface)自动连接命令处理程序

    unity-game-engine - 使用 Jenkins Xcode 插件构建项目时出现异常

    javascript - Unityscript动画参数UCE0001 : ';' expected

    unity-game-engine - Unity 中可以存在这个着色器吗?

    c# - 如何通过 C# 代码隐藏 Canvas (Unity)

    c# - 使用以复杂类型为键的对象引用和字典将复杂类型序列化/反序列化为 Json

    c# - AvalonEdit中如何设置语法高亮?

    C# 排序字母数字列表

    C# System.IO.File.Exists 在 Unity 中不起作用