Создание корутинного блока
Для того чтобы сделать метод корутинным, нужно соблюсти два условия:
- Метод должен возвращать значение
IEnumerator - В методе должна использоваться хотя бы одна
yieldинструкция
Изменим код метода старта таймера так, чтобы блок действия стал корутинным
[Action(English: "Start timer", Russian: "Запустить таймер")]
public IEnumerator StartTimer()
{
int seconds = 0;
// Запускаем бесконечный цикл
while (true)
{
// Производим прерывание и ждем 1 секунду
yield return new WaitForSeconds(1);
// Увеличиваем счетчик секунд на 1
seconds++;
// Выводим количество секунд
Debug.Log(seconds);
}
}
В коде описанном выше будет следующий порядок выполнения кода:
- Создание переменной
seconds int seconds = 0; - Запуск бесконечного цикла
while (true) - Прерывание метода (инструкция
yield), программа выполняет какой-то другой код. Ожидание в течение 1 секундыyield return new WaitForSeconds(1); - Увеличение значения переменной seconds на 1
seconds++; - Вывод в консоль значения переменной seconds
Debug.Log(seconds); - Переход к пункту 3
Подробнее про yield в разделе Использование инструкций yield
После изменения кода и повторной сборки объекта, блок действия внешне будет выглядеть также, как обычные синхронные блоки действия

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

Используйте обычный метод, когда:
- Метод выполняет код, не растянутый во времени
- Метод не ожидает выполнения какого-либо условия или выполнения другого метода
- Другие методы не зависят от времени выполнения обычных функций
Пример: вывести сообщение, переместить объект в точку, мгновенно поменять цвет объекта
Используйте корутинный метод, когда:
- Выполнение метода растянуто во времени
- Внутри метода происходит ожидание какого-то условия или метода
- Внутри метода происходит ожидание выполнения другого корутинного метода
- Метод растянут во времени и выполняется последовательно в цепочке
- Внутри метода используются несколько последовательных операций, растянутых во времени
Пример: плавно переместить объект из точки в точку за какое-то время, плавно поменять цвет объекта за какое-то время, выводить время каждую секунду
Запуск корутинных методов
Для того чтобы запустить корутинный метод, необходимо использовать команду StartCoroutine(IEnumerator method)
public void Start()
{
StartCoroutine(MethodWithLoop());
}
private IEnumerator MethodWithLoop()
{
for(int i = 0; i < 10; i++)
{
Debug.Log(i);
yield return new WaitForSeconds(1f);
}
}