Unity如何使被引用的GameObject实例销毁?

b.b*_*ben 4 c# unity-game-engine

在Unity中,可以销毁GameObject。

这是场景:

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

从这里一切都快乐。我们可以用GameObjectB做任何事情。

  1. 使用GameObject.Destroy 销毁 GameObjectB

在这里,当我们从GameObjectA的脚本访问GameObjectB时,它将为null。

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


问题是他们该怎么做?

如果您仔细考虑一下。

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

我知道Unity对那些对象有其包装层。

但是我不知道它是如何工作的?以及如何在C#中实现它?

Dav*_*ver 5

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

换句话说,从.NET / Mono的内存管理角度来看,它仍然存在。因此,要回答您的问题“如何在C#中实现”,诀窍是覆盖等号。但是,即使Unity自己也对设计选择有第二个想法,所以不要在家中尝试。

  • 您能否举一个示例,说明在您自己的代码中访问方法或属性会出错? (2认同)