Как отладить, почему Unity зависает? - PullRequest
0 голосов
/ 07 мая 2018

Я сотрудничаю со своими школьными товарищами для школьного проекта, но недавно, когда я запускаю 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 голосов
/ 24 августа 2018

После долгих дней разочарования я нашел способ отладки, пока единство замерзает. Я занимался деревьями (не растительностью, структурой данных), и мне было очень трудно определить, где и что вызывает переполнение стека. Переполнение стека замораживает единицу, поэтому я не вижу отладки, которая помогла бы мне решить проблему. Но теперь я нашел решение.

РЕШЕНИЕ Итак, я попытался использовать 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");

Это создает файл журнала, в котором вы можете увидеть все сделанные вами журналы. Работает отлично! Даже когда единство замерзает.

0 голосов
/ 14 мая 2018

Старайтесь избегать циклов в функции обновления (если только вы не полностью управляете циклом), эта функция называется EveryFrame, поэтому если вы выполняете здесь длинные задачи, вы можете столкнуться с кадрированием и зависанием.

В вашем случае замените while на If и отмените условия.

Если у вас есть unity pro, у вас есть Profiler, который скажет вам, какой скрипт / функция занимает больше всего времени процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...