Корутины в Unity. Что это и как использовать?

Что такое корутины?

Coroutine - Это такие же функции, которые вы уже наверняка используете, но они выполняются параллельно основному потоку.

Тут стоит уточнить, параллельно не значит асинхронно. То есть, если вы запихнете свой "тяжелый" код в кучу корутин которые будут работать параллельно, программа работать быстрее не будет.

как работают корутины
Наглядный пример

Зачем же тогда нужны корутины?

Они помогут нам упростить свой код. К примеру, необходимо плавно менять цвет спрайта.

Можно, конечно, делать это в Update, но корутину можно написать так что-бы она, что-то делала раз в пол секунды или в секунду. И для этого не нужно будет проверять каждый раз сколько времени прошло с последнего вызова Update.

Вот пример, который выведет сообщение спустя пол секунды после его запуска.

IEnumerator YourCoroutine() {
     yield return new WaitForSeconds(0.5f);
     Debug.Log("Прошло пол секунды");
}

А если обернуть в цикл? Он будет выполняться каждые пол секунды.

IEnumerator YourCoroutine() {
    while(true){
         yield return new WaitForSeconds(0.5f);
         Debug.Log("Прошло пол секунды");
    }
}

Замените 0.5f на нужное значение для получения нужной задержки.

Кстати для запуска такой функции-корутины в нужном месте необходимо написать:

StartCoroutine("YourCoroutine");

или

StartCoroutine(YourCoroutine());

Yield, что это?

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

1.Продолжить после следующего FixedUpdate

yield return new WaitForFixedUpdate();

2. Продолжить через некоторое время

yield return new WaitForSeconds(0.1f);

3. Продолжить после следующего LateUpdate и рендеринга сцены

yield return new WaitForEndOfFrame();

4. Продолжить после другой корутины:

yield return StartCoroutine(AnotherCoroutine());

5. После текущего Update

yield return null;

6. По завершении скачивания

yield return new WWW(someLink);

7. Завершить корутину

yield return break;

Как завершить корутину?

Иногда корутину нужно завершить преждевременно. Для это есть несколько путей.

  • StopAllCoroutines()
  • StopCoroutine(«YourCoroutine»)
  • Уничтожить родительский GameObject

Делаем выводы

Корутины удобны в некоторых случаях и иногда без них совсем туго, поэтому советую вникнуть в их суть. Часто они помогают облегчить код и сэкономить время. И помните, корутины это не потоки!)

Всем добра!

4.5/5 (2)

Оцените