← Назад к вопросам

Что такое Сoroutines?

1.3 Junior🔥 243 комментариев
#C# и ООП#Unity Core#Асинхронность и многопоточность

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Корoutines (Корутины) в Unity

Корутины — это специальный механизм в Unity для реализации неблокирующих асинхронных операций и действий, разнесённых по времени. Они позволяют выполнять код в несколько этапов, с возможностью приостановки и продолжения, без необходимости блокировать основной поток игры. Это достигается через использование конструкции yield, которая временно "возвращает управление" движку Unity, а затем продолжает выполнение с того же места при следующем обновлении или после заданной паузы.

Ключевые особенности и отличие от обычных методов

  • Не являются потоками: Корутины работают в основном потоке Unity (потоке выполнения), но их выполнение может быть разбито на части. Они не создают отдельные потоки (Thread), поэтому не требуют сложных механизмов синхронизации.
  • Работают через yield: Ключевое слово yield определяет точку приостановки. После yield корутина "ждёт" выполнения определённого условия, прежде чем продолжить.
  • Запуск и управление: Для запуска используется StartCoroutine(), а для остановки — StopCoroutine() или StopAllCoroutines().

Основные сценарии использования

  • Таймеры и задержки: Выполнение действий с заданным интервалом.
  • Постепенное выполнение задач: Например, постепенное загрузка уровня, анимация UI-элементов или движение объекта по пути с паузами.
  • Ожидание условий: Ожидание завершения другой операции (например, загрузки ресурса), нажатия кнопки или достижения определённого состояния игры.
  • Создание циклов с паузой: Бесконечные или длительные процессы, которые не должны блокировать основной цикл Update.

Примеры использования с кодом

1. Простая задержка (Wait for seconds)

using UnityEngine;
using System.Collections;

public class ExampleCoroutine : MonoBehaviour
{
    void Start()
    {
        // Запуск корутины
        StartCoroutine(MyFirstCoroutine());
    }

    IEnumerator MyFirstCoroutine()
    {
        Debug.Log("Корутина началась: " + Time.time);
        
        // Приостановка выполнения на 2 секунды
        yield return new WaitForSeconds(2f);
        
        Debug.Log("Корутина продолжается после 2 секунд: " + Time.time);
        
        // Другая задержка
        yield return new WaitForSeconds(1f);
        Debug.Log("Завершено: " + Time.time);
    }
}

2. Ожидание завершения другой корутинной операции

IEnumerator ComplexSequence()
{
    Debug.Log("Шаг 1: Запуск анимации");
    yield return StartCoroutine(PlayAnimation()); // Ждём завершения PlayAnimation
    
    Debug.Log("Шаг 2: Анимация завершена, теперь загружаем данные");
    yield return StartCoroutine(LoadDataAsync());
    
    Debug.Log("Шаг 3: Все операции завершены");
}

IEnumerator PlayAnimation()
{
    // ... код анимации ...
    yield return new WaitForSeconds(3f);
}

3. Бесконечный цикл с регулируемой частотой (вместо Update)

IEnumerator PeriodicCheck()
{
    while (true) // Бесконечный цикл, но не блокирующий
    {
        PerformHealthCheck();
        // Проверяем каждые 0.5 секунды, не используя Update
        yield return new WaitForSeconds(0.5f);
    }
}

Важные внутренние детали и ограничения

  • Корутины не выполняются, если объект отключен (enabled = false): Если MonoBehaviour, запустивший корутину, становится неактивным, выполнение корутины приостанавливается.
  • Они зависят от жизненного цикла объекта: При уничтожении объекта (Destroy(gameObject)) все его корутины автоматически прекращаются.
  • Не работают в режиме Edit Mode: Корутины активны только во время выполнения игры (Play Mode).
  • Использование WaitForEndOfFrame: Для операций, которые должны выполниться после завершения рендера текущего кадра.

Сравнение с асинхронными операциями (async/await)

С внедрением .NET 4.x в Unity появилась возможность использовать современные конструкции async/await. Они более универсальны и интегрированы с языком, но корутины часто более удобны для типичных игровых задач, связанных с временными интервалами и зависимостью от жизненного цикла Unity-объектов. Однако для истинно асинхронных операций (например, сетевых запросов без блокировки потока) async/await может быть более эффективным выбором.

В итоге, корутины — это мощный и удобный инструмент в арсенале Unity-разработчика для управления временем и последовательностью действий, позволяющий создавать сложное поведение без усложнения архитектуры и без риска блокировки основного потока выполнения игры. Их правильное использование значительно упрощает реализацию постепенных процессов, ожиданий и временных событий.

Что такое Сoroutines? | PrepBro