пока условно внутри сопрограмма не зацикливается, зависает - PullRequest
0 голосов
/ 15 марта 2019

У меня есть сопрограмма, которую я хочу задержать на 2 секунды. Я использую цикл while, который проверяет разницу между initialTime и now, чтобы проверить, сколько времени прошло:

IEnumerator MyCoroutine(){
    Debug.Log("Before the counter");

    //`Time.time` returns the number of seconds since app launch (i.e., `72.33448`)
    float initialTime = Time.time;
    Debug.Log("initialTime = " + initialTime);
    float now = initialTime;

    while(now - initialTime < 2.0f){
        yield return null;
        now = Time.time;
        Debug.Log("now = " + now);
    }

    Debug.Log("After the counter");

    //...Stuff that happens after delay
}

По какой-то причине, примерно в 1/5 раза я запускаю его, он не будет точно зависать в цикле, но не сможет выполнить всю сопрограмму: в консоли я вижу, что только Debug.Log("now = " + now); выполняется один раз, и Debug.Log("After the counter"); никогда не происходит - я ожидал, что правильное зависание цикла покажет Debug.Log("now = " + now); бесконечно.

Что может быть не так с логикой вокруг этого таймера, которая может вызвать такое поведение?

Редактировать : Я бы предпочел придерживаться норм Unity по использованию StartCoroutine() и StopCoroutine() вместо System.Threading, если это возможно.

1 Ответ

4 голосов
/ 15 марта 2019

Решение довольно простое.

Прежде всего, вам НУЖЕН IEnumerator, как у вас, а не IEnumerable, как было предложено в комментариях.Совсем разные вещи.

Во-вторых, в Unity есть встроенная функция, которая приостанавливает вашу сопрограмму на время, указанное вами.Используйте либо WaitForSeconds(2f) (2 - количество секунд), либо WaitForSecondsRealtime(2f)

WaitForSeconds "ждет" в течение 2 секунд с учетом частоты кадров.

WaitForSecondsRealTIme «ждет» в течение 2 секунд без учета частоты кадров.

IEnumerator MyCoroutine(){
    Debug.Log("Before the counter");

    yield return new WaitForSeconds(2f); 

    Debug.Log("After the counter");

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