在Unity中,GameObject可以被销毁。
这是场景:
- 实例化 GameObjectA 和 GameObjectB
- 向 GameObjectA 添加脚本(此脚本可以保存另一个 GameObject 的引用)
- 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/