2015-10-24 4 views
4

Я хочу, чтобы понять концепцию coroutine я не знаю, почему код остановка в том, когда он print 1,2,3. В этом коде цикле должен работать в 30 раз и значение печати 1 до 30.C#: Как couroutine остановить цикл

public class NewCore : MonoBehaviour 
{ 
    void Start() 
    { 
     StartCoroutine (MyCoroutine (0.52f)); 
     StartCoroutine (CoroutineKiller (2f)); 
    } 

    IEnumerator MyCoroutine (float delay) 
    { 
     int value = 0; 
     while (value < 30) 
     { 
      yield return new WaitForSeconds (delay);//wait 
      value ++; 
      print (value); 
     } 

     StartCoroutine (MyCoroutine (delay)); 
    } 

    IEnumerator CoroutineKiller (float delay) 
    { 
     yield return new WaitForSeconds (delay); 
     StopAllCoroutines(); 
    } 
} 

ответ

3

Вы печатаете значения от 1 до 30 с задержкой 0,52 сек, но через 2 секунды вы прекратите это делать (вы вызываете StopAllCoroutines). Вот почему вы видите только 1, 2 и 3.

Попробуйте комментировать StartCoroutine (CoroutineKiller (2f)); или дайте ему больше времени, чтобы увидеть, как он контролирует остановку потока.


Сопрограммы похожи на тему - хотя и не на самом деле - но да, в том смысле, что вызов StartCoroutine не блокирует код.

Так что, когда вы делаете это:

void Start() 
{ 
    StartCoroutine (MyCoroutine (0.52f)); 
    StartCoroutine (CoroutineKiller (2f)); 
} 

Это будет на самом деле начать как сопрограмм и выполнить их шаг за шагом, бок о бок, при каждом вызове Update.

Если вы хотите, чтобы выполнить Сопрограммы один за другим, попробуйте следующее:

void Start() 
{ 
    StartCoroutine(F()); 
} 

IEnumerator F() 
{ 
    // by yielding the Coroutine, it will block the execution of 
    // this coroutine (F) until MyCoroutine finishes 
    yield return StartCoroutine(MyCoroutine(1.52f)); 

    // This is no longer doing much, really. 
    yield return StartCoroutine(Killer(2f)); 

    print("done"); 
} 

Вы можете прочитать больше о Execution Order, который также включает в себя информацию о сопрограммам и как система выхода на самом деле работает.

+0

но при запуске() метод 'StartCoroutine (MyCoroutine (0.52f)' выполнение сначала запускается, тогда будет запускаться второй метод 'StartCoroutine (CoroutineKiller (2f))'. Как он автоматически останавливает курок, когда происходят 2 секунды? –

+0

@ cenkisabi Я не знаю, как код знает, когда 2 секунды завершил его, остановит «coroutine», он перескакивает на этот метод «StartCoroutine» (CoroutineKiller (2f)) ' –

+0

@TimAllen См. обновление – SimpleVar

0

Кажется, вы используете StopCoroutine (MyCoroutine()); в CoroutineKiller и останавливает сопрограмму через 2 секунды. (ваш параметр равен 2f. И я думаю, вы использовали его для WaitForSeconds). Таким образом, ваша функция MyCoroutine работает всего за 3 задержки (0,52 + 0,52 + 0,52 = 1,56) и до окончания четвертой задержки вы останавливаете эту сопрограмму, и вы получаете всего 1,2,3 печатных.

Смежные вопросы