Если утверждение внутри Coroutine, как это работает? - PullRequest
0 голосов
/ 03 июля 2019
  1. в этом примере эта сопрограмма будет продолжать работать без остановки или нет?
  2. сколько раз будет напечатано "test-1"?

Code-1:

bool a = true; 
bool b = true;

public IEnumerator ExampleCoroutine(){
    while (a){
        if(b){
            Debug.Log("test-1");
            yield return new WaitForSeconds(1f);
            Debug.Log("test-2");
         }
         Debug.Log("test-3");
         yield break;
     }
}

1 Ответ

4 голосов
/ 04 июля 2019

Итак, вот что происходит:

Я собираюсь разбить код в вашем посте по одной строке за раз:

  1. while (a){
    • Если a ложно, сопрограмма немедленно выходит (переход к 9), и больше ничего не происходит, в противном случае продолжайте
  2. if(b){
    • , если bложь, перейти к 7, в противном случае продолжить
  3. Debug.Log("test-1");
    • вывести «test-1» на консоль
  4. yield return new WaitForSeconds(1f);
    • Здесь мы создаем объект, который при его возврате в систему Unity, которая обрабатывает сопрограммы (т. Е. StartCoroutine()), выполнение этой функции будет приостановлено и возвращено позднее.В этом случае через 1 секунду (где это значение изменяется текущим Time.timeScale).Когда выполнение возобновится, перейдите к следующему шагу:
  5. Debug.Log("test-2");
    • вывести «test-2» на консоль
  6. Debug.Log("test-3");
    • вывести «test-3» на консоль
  7. yield return break;
    • Здесь мы говорим базовой системе Unity обоим:(1) приостановить выполнение этой функции (yield) и (2), чтобы не возобновить ее позднее (break).Не переходите к шагу 8.
  8. } //end while(a)
    • Благодаря шагу 7 мы никогда не возвращаемся к условному оператору while и никогда не выполняем никаких дополнительных действий.
  9. } //end function
    • Функция завершается

Поэтому для ответа на ваш вопрос «test-1» будет напечатанровно один раз ... если оба значения a и b верны.

...