【问题标题】:How to find the script that destroys my object?如何找到破坏我的对象的脚本?
【发布时间】:2022-12-11 12:08:49
【问题描述】:

我从事一个物理繁重的项目,其中有很多刚体,代码也很繁重。我有很多脚本,可以创建力量、管理关节等。

由于某种原因,有时会随机销毁某个对象。它就这样消失了。我不知道是哪个脚本导致的。有没有办法找出哪个脚本称为 Ondestroy 之类的。

谢谢你的帮助。

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    在你的 monobehaviour 的 OnDestroy() 方法中放置一个断点并检查调用堆栈。

    要调试您的项目,您可以查看Debugging C# code in Unity。一旦你弄清楚并检查如何攻击统一并在设置的断点处停止执行,你可以使用 Window->Debug->Callstack 查看调用堆栈执行在您的断点处停止并查看导致您的对象破坏的名称。

    【讨论】:

    • 谢谢!我现在知道如何解决这个问题了。
    • 好的,所以我创建了一个脚本:
    • public class OnDestroyTest : MonoBehaviour { void OnDestroy() { Debug.Log($"{name} 刚刚被销毁"); } }
    • 但在“调用堆栈”窗口中,我只有 1 个条目:这是我附加的脚本。这太诡异了。这不像我在其他脚本中使用 Destroy(),但游戏对象似乎是随机销毁的。有时我可以玩游戏而没有任何错误。有时几个游戏对象会消失。任何进一步的调试想法?
    • 我在 Debug.Log() 行中设置断点
    【解决方案2】:

    只需拥有一个组件,例如

    public class DestroyDebug : MonoBehaviour 
    {
        void OnDestroy ()
        { 
            Debug.Log($"{name} was just destroyed");
        }
    }
    

    如果您需要确切的实例和环境,或者在控制台中,您可以在 Debugging your code 处放置一个断点,或者您至少已经可以看到整个堆栈跟踪,其中哪些类和调用恰好导致了该对象的销毁。

    【讨论】:

    • 好的,所以我创建了一个脚本:
    • public class OnDestroyTest : MonoBehaviour { void OnDestroy() { Debug.Log($"{name} 刚刚被销毁"); } }
    • 但在“调用堆栈”窗口中,我只有 1 个条目:这是我附加的脚本。这太诡异了。这不像我在其他脚本中使用 Destroy(),但游戏对象似乎是随机销毁的。有时我可以玩游戏而没有任何错误。有时几个游戏对象会消失。任何进一步的调试想法?
    • 我在 Debug.Log() 行中设置断点
    【解决方案3】:

    如果这对您来说仍然是个问题(或者如果其他人有这个问题),我遇到了同样的问题并找到了解决方案here,即在OnDisable 中检查gameObject.activeInHierarchy,如下所示:

    void OnDisable()
    {
      // If object will destroy in the end of current frame...
      if (gameObject.activeInHierarchy)
      {
        Debug.LogError("Log an error with a stack trace in debug mode");
      }
      // If object just deactivated..
      else
      {
     
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-14
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多