Что такое корутины?
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
Делаем выводы
Корутины удобны в некоторых случаях и иногда без них совсем туго, поэтому советую вникнуть в их суть. Часто они помогают облегчить код и сэкономить время. И помните, корутины это не потоки!)
Всем добра!