如何调试Unity冻结的原因?

时间:2018-05-07 13:55:51

标签: unity3d

我正在与学校伙伴合作开展一个学校项目,但是最近当我运行Unity时,它会冻结,我无法解冻。我已经卸载并重新导入了所有资产,我的组队友也表示他们的Unity没有这个问题。我找不到解决方案。

该项目正在2d完成。我正在测试一些逻辑,而这发生在我身上。我正在做一个健康栏测试,它会自动关闭,并且有一个文本框,然后跟着它包含实际的数字。然后突然第二天,Unity决定退出我,而不是一直跑。

更新

代码:

public static float fillamount = 1f;
public float period = 1f;
public Image image;
private float time;
public float DoesItDecreaseOverTime = -0.1f;

private float tempnum;
// Use this for initialization
void Start () {
}

// Update is called once per frame
void Update () {
    time += Time.deltaTime;

    while (fillamount <100 || fillamount > 0)
    {
        if (time >= period)
        {
            fillamount += DoesItDecreaseOverTime;
            time = 0;
        }
    }

    tempnum = (fillamount * 100);

    image.fillAmount = fillamount;

}
}

2 个答案:

答案 0 :(得分:0)

经过漫长的挫折,我已经找到了如何在单位冻结时进行调试。我当时正在用树木(不是植被,数据结构)做东西,对我来说,很难确定导致堆栈溢出的位置和原因。堆栈溢出冻结了统一性,因此我看不到任何可以帮助我解决问题的调试。但是现在,我找到了解决方案。

解决方案 因此,我尝试使用System.Diagnostics.Debug.WriteLine,您应该在Visual Studio的输出窗口中看到它。但这似乎不适用于统一项目。无论如何,我开始思考,提出了这堂课:

using System;
using System.IO;

public class Logger
{

    public Logger(string logFilePath)
    {
        if(!logFilePath.EndsWith(".log"))
            logFilePath += ".log";
        LogFilePath = logFilePath;
        if(!File.Exists(LogFilePath))
            File.Create(LogFilePath).Close();
        WriteLine("New Session Started");
    }

    public string LogFilePath { get; private set; }

    public void WriteLine(object message)
    {
        using(StreamWriter writer = new StreamWriter(LogFilePath, true))
            writer.WriteLine(DateTime.Now.ToString() + ": " + message.ToString());
    }

}

用法是这样的:

Logger logger = new Logger(@"C:\Users\Soogbad\Desktop\MyLog.log");
logger.WriteLine("Hello World");

这将创建一个日志文件,您可以在其中查看所创建的所有日志。完美的作品!即使团结在冻结。

答案 1 :(得分:-1)

尽量避免更新函数中的循环(除非你完全控制循环),这个函数被称为每个帧,所以如果你在这里执行长任务,你可能会遇到framedrop和冻结。

在您的情况下,用If替换while并恢复条件。

如果你有团结专业版,那么你就有了Profiler,它会告诉你什么脚本/函数花费的时间最多。