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

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

[Action(English: "Start timer", Russian: "Запустить таймер")]  
public void StartTimer()  
{  
    int seconds = 0;  
  
    // Запускаем бесконечный цикл  
    while (true)  
    {        
        // Ждем 1 секунду  
        Thread.Sleep(1000);  
  
        // Увеличиваем счетчик секунд на 1  
        seconds++;  
  
        // Выводим количество секунд  
        Debug.Log(seconds);  
    }
}
C#

Запустим выполнение блока "запустить таймер" при старте сцены

В коде блока "запустить таймер" существует бесконечный цикл. Поскольку исполнение обычных методов происходит последовательно и непрерывно, выполнение программы полностью “зависнет” в этом бесконечном цикле вплоть до закрытия программы

Почему программа "зависает"?

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

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

Корутинные методы позволяют решать задачи, где необходимо прервать выполнение функции и разблокировать выполнение других методов, а после некоторого времени вернуться к выполнению

Использование корутинных методов позволяет разблокировать выполнение остального кода до того, как завершиться выполнение текущего корутинного метода

Корутинный метод может вернуться к выполнению своего кода после прерывания