Unity如何在GameObject实例被引用时销毁它?

4
在Unity中,GameObject可以被销毁。
以下是场景:
1. 实例化GameObjectA和GameObjectB 2. 给GameObjectA添加一个脚本(这个脚本可以持有其他GameObject的引用) 3. 在GameObjectA的脚本中找到并持有GameObjectB的引用。
从这里开始一切都很顺利。我们可以对GameObjectB进行任何操作。
4. 通过GameObject.Destroy销毁GameObjectB。
在这里,当我们从GameObjectA的脚本中访问GameObjectB时,它将为空。
因为GameObjectB已经被销毁,所以无法访问任何方法、字段和属性。
问题是他们怎么做到的呢?
如果你仔细想一想,纯C#对象GC不会回收实例,如果有人保留了该实例的引用。
我知道Unity有他们的包装层来处理这些对象。
但我想知道它是如何工作的?如何在C#中实现?

“Referenced” 是什么意思? 你可以这样做: GameObjectB = GameObjectA; 这样它就会继承所有的属性。 - GhAyoub
1
@GhAyoub 对于让你误解我感到抱歉。我已经编辑了描述。 - kitta
1个回答

5
这里有一个微妙之处。在您的示例中,如果您检查GameObject B,它将返回 null。但这是因为Unity已经覆盖了UnityEngine.Object的等号运算符。如果您实际上尝试访问任何GameObject的属性或方法,您将不会得到NullReferenceException;您将从Unity获得异常,说明对象已被销毁。
换句话说,从.NET/Mono内存管理的角度来看,它仍然存在。所以回答您的问题,“如何在C#中实现”,关键是等于号重载。但即使是Unity自己也对这个设计选择产生了怀疑,所以不要在家里尝试。

那些方法和属性怎么样?我们自己手写这些方法,它们如何知道已被销毁。 - kitta
2
你能举个例子,说明在你自己的代码中访问方法或属性会出现错误吗? - David Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接