Для того чтобы сделать метод корутинным, нужно соблюсти два условия:

  1. Метод должен возвращать значение IEnumerator
  2. В методе должна использоваться хотя бы одна 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);
	}    
}
C#

В коде описанном выше будет следующий порядок выполнения кода:

  1. Создание переменной seconds int seconds = 0;
  2. Запуск бесконечного цикла while (true)
  3. Прерывание метода (инструкция yield), программа выполняет какой-то другой код. Ожидание в течение 1 секунды yield return new WaitForSeconds(1);
  4. Увеличение значения переменной seconds на 1 seconds++;
  5. Вывод в консоль значения переменной seconds Debug.Log(seconds);
  6. Переход к пункту 3

Подробнее про yield в разделе Использование инструкций yield

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

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

Используйте обычный метод, когда:

  • Метод выполняет код, не растянутый во времени
  • Метод не ожидает выполнения какого-либо условия или выполнения другого метода
  • Другие методы не зависят от времени выполнения обычных функций

Пример: вывести сообщение, переместить объект в точку, мгновенно поменять цвет объекта


Используйте корутинный метод, когда:

  • Выполнение метода растянуто во времени
  • Внутри метода происходит ожидание какого-то условия или метода
  • Внутри метода происходит ожидание выполнения другого корутинного метода
  • Метод растянут во времени и выполняется последовательно в цепочке
  • Внутри метода используются несколько последовательных операций, растянутых во времени

Пример: плавно переместить объект из точки в точку за какое-то время, плавно поменять цвет объекта за какое-то время, выводить время каждую секунду

Запуск корутинных методовLink to Запуск корутинных методов

Для того чтобы запустить корутинный метод, необходимо использовать команду 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);
	}
}
C#