【问题标题】:GameObject is destroyed by which scriptGameObject被哪个脚本销毁
【发布时间】:2019-12-29 07:08:24
【问题描述】:

我试图找出我的游戏对象被我游戏中的哪个脚本破坏了。 到目前为止,我尝试打印堆栈,但没有提到破坏游戏对象的脚本的详细信息 代码: Debug.Log(UnityEngine.StackTraceUtility.ExtractStackTrace())

【问题讨论】:

  • 可能无法报告谁调用了 Destroy(obj) 不仅针对 GameObject,而且对于继承自 UnityEngine.Object 的任何东西(组件、纹理等)。由于 Object.Destroy 调用内部引擎 GC 系统(其中这个 obj 只是一个参数),Unity 不愿意与提供任何类型的 api 混淆。因此,我们唯一的方法可能只是明智的猜测和实验方法。
  • 建议:在您的代码库中找到Destroy 调用的所有 个实例,并将它们替换为MyTrackedDestroy,这将是您自己的Object.Destroy 调用方法。这将使您能够跟踪所有/大多数 Destroy 调用并在需要时记录它们。
  • 如果你有一台电脑,转到你的脚本文件夹并执行find "Destroy" *.cs,在 mac 或 linux 上执行 grep "Destroy" *.cs,它将显示所有带有 Destroy 的脚本,或者,在 Visual Studio 中搜索它所有文件。

标签: c# unity3d gameobject


【解决方案1】:

Destroy 实际上并没有立即“销毁”它传递的对象,它会将对象添加到对象列表中,以便 Unity 在帧的 end 处销毁。 这是 OnDestroy 被调用的时候,这就是为什么你在调用 Destroy 时看不到堆栈(如果你真的会看到一个堆栈,我很漂亮确保本机代码会调用它)。

所以这应该是它的结束......对吗?

嗯,不完全是。如果您检查Order of Execution for Event Functions,那么在OnDestroyOnDisable 之前调用了一个事件函数。

幸运的是,这个函数不仅被更早地调用了,而且(至少当我上次在 Unity 2018.4 在编辑器的播放模式下测试它时)OnDisable 实际上是由Destroy 调用的,所以如果你得到堆在那里,你应该希望能够确定谁在破坏你的单一行为。

【讨论】:

  • 谢谢。这是一个救生员。
  • 悲伤。在 2020.3 中,OnDisable 从 Unity 代码中被无堆栈调用,如 OnDestroy,所以这似乎不再起作用了?
猜你喜欢
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多