Unity - все зависает при "yield return new WaitForSeconds ();"? - PullRequest
0 голосов
/ 30 мая 2018

Хорошо!весь мой код в этой сцене в одном сценарии и одном объекте менеджера.всего это около 700 строк.поэтому я не могу поставить это здесь.Я тестировал разные вещи:

  • 1) переключение платформы с android на pc / mac
  • 2) тест на предыдущей версии Unity (предыдущий 2017, и текущий на 2018.1)

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

Вот код:

    IEnumerator ShowSigns(int Button1State, int EqualState, int Button2State)
    {

        Debug.Log("ShowSigns");
        if (Button1State == 1)
        {
            OperationOneCorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        else if (Button1State == 2)
        {
            OperationOneIncorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        if (EqualState == 1)
        {
            EqualCorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        else if (EqualState == 2)
        {
            EqualIncorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        if (Button2State == 1)
        {
            OperationTwoCorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        else if (Button2State == 2)
        {
            OperationTwoIncorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }

        Debug.Log("BeforeWaiting");
        yield return new WaitForSeconds(0.3f);

        Debug.Log("AfterWaiting");
        OperationOneCorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        OperationOneIncorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        EqualCorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        EqualIncorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        OperationTwoCorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        OperationTwoIncorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        state = GameState.CreateNewProblem;

        Debug.Log("EndSigns");
    }

Я обнаружил, что он зависает на этом:

        yield return new WaitForSeconds(0.3f);

Очень странно !!!

Это изображение игры.

enter image description here Игра представляет собой простую игру, в которой показано 2 математических фразы, и игрок должен выбрать большее или равное.Логика такова:

  • 1) сделать новые фразы и изменить состояние игры на «ChooseAnswer»
  • 2) игроку нажать одну из 3 кнопок и ответ проверен и набрать идругие вещи меняются, и сопрограмма ShowSigns запускается и заканчивается через 0,3 секунды.и, как вы видите в конце состояния сопрограммы, изменяется на «CreateNewProblem».
  • 3) в обновлении при обнаружении CreateNewProblem, вызов кода для функции NewProblem () для создания новых фраз и в концеэто состояние игры меняется на «ChooseAnswer».

эта логика повторяется снова и снова, пока время не достигнет нуля.переменная «шаг» увеличивается и уменьшается на 1 при любом правильном и неправильном ответе.а переменная level = steps / 10 определяет сложность фраз.

игра работает правильно на% 98 нажимает кнопки On.но обычно он останавливается где-то после шага 20. В 21, 23, 27, 34 ... очень случайно.но всегда после 20 и некоторое время не замерзает, пока не закончится время.и всегда прямо перед возвратом урожая.точно на одной линии.

Я прочитал много вопросов и ответов, но ни один из них не помог.У меня нет цикла while, no while (true), пока я знаю и проверяю свой код, нет бесконечного цикла, на StopAllCoroutines ... ничего.и я застрял на 2 дня.спасибо всем вам за помощь.

ОН, и вот файл кода

1 Ответ

0 голосов
/ 01 июня 2018

Причиной зависания является использование Random.Range для управления циклом while, который находится в коде связанный в вашем вопросе.Один из способов получить случайное число без использования цикла while - сгенерировать их в List, а затем удалить все, которые вы используете.Это должно помешать Random.Range заморозить Unity.

...