База знаний ЯЮниор
  • C#
    • 🗃️Ссылочные и значимые типы в C# Ключевые слова ref, out, in Что нужно знать новичку
    • 📋Использование констант
    • 🔖Snippet или фрагмент кода
    • 📝Пустые строки
    • 🛡️Инкапсуляция
  • Unity
    • 🚶‍♂️Управление Параметрами Аниматора
    • ⚙️Динамическое изменение объектов
      • 🛠️Создание объектов
      • 🪛Изменение объектов
      • 🪚Добавление и изменение компонентов
      • 🔥Удаление объектов и компонентов
    • 🔊События
      • 🧬Параметризация
      • 🔗Совмещение событий
      • 📡Action и UnityAction
      • 🕹️UnityEvent
    • 🔌Подключение среды разработки к Unity
    • ⌚Корутины
      • 🪄Управление корутинами
      • ⏰Yield Instruction
      • 🕵️‍♂️Как устроены корутины?
  • Git и GitHub
    • 🗃️Git
    • 🗄️GitHub
    • 🖥️GitHub Desktop
Powered by GitBook
On this page
  • Какие yield инструкции уже реализованы в Unity?
  • WaitForEndOfFrame
  • WaitForFixedUpdate
  • WaitForSeconds (float t)
  • WaitForSecondsRealtime (float t)
  • WaitUntil (Func<Bool> func)
  • WaitWhile (Func<Bool> func)
  • null
  • Coroutine
  • break

Was this helpful?

  1. Unity
  2. Корутины

Yield Instruction

Автор: Дмитрий Прокопьев

PreviousУправление корутинамиNextКак устроены корутины?

Last updated 1 year ago

Was this helpful?

YieldInstruction это базовый класс для всех yield инструкций. Если класс наследуется от YieldInstruction, то его можно передать в yield return.

Мы можем самостоятельно реализовать такой класс или воспользоваться уже существующими.

Какие yield инструкции уже реализованы в Unity?

yield return new WaitForEndOfFrame();

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

yield return new WaitForFixedUpdate();

Ожидает следующий вызов FixedUpdate.

(float t)

yield return new WaitForSeconds(1f);

Ожидает пока пройдет t секунд c момента завершения текущего кадра. Время считается с коэффициентом Time.timeScale.

Важно. Так как корутины выполняются в основном цикле обновлений кадров (Update), между вызовами пройдет не точно t секунд. Выполнение корутины продолжится в первом кадре после прохождения t секунд c момента окончания текущего кадра.

(float t)

yield return new WaitForSecondsRealtime(1f);

Ожидает пока пройдет t секунд c момента завершения текущего кадра. Время считается без коэффициентов, поэтому совпадает с реальным. В остальном этот класс работает как WaitForSeconds.

// ждем момента, когда объект перестанет двигаться
yield return new WaitUntil(() => _rigidbody.velocity == Vector3.zero);

Принимает в себя делегат, возвращающий bool, и ожидает момента, когда он вернет true. До этого момента делегат вызывается каждый кадр.

// ждем пока коллайдер не выключят
yield return new WaitWhile(() => _collider.enabled);

Принимает в себя делегат, возвращающий bool, и ожидает момента, когда он вернет false. До этого момента делегат вызывается каждый кадр.

null

yield return null;

Мы можем вернуть null, если хотим продолжить выполнение корутины в следующем кадре без особых условий

Coroutine

Сами корутины тоже могут выступать в роли yield инструкции:

// выполнить новую корутину внутри текущей
yield return StartCoroutine(MoveSmoothly());
// ожидать завершения уже начатой корутины
yield return _coroutine; // поле с запущенной корутиной

Таким образом можно дождаться окончания другой корутины и только потом продолжить выполнить текущую

break

При необходимости выполнение корутины можно завершить вручную:

yield break;

После такой инструкции корутина завершится.

(Func<Bool> func)

(Func<Bool> func)

⌚
⏰
WaitForEndOfFrame
WaitForFixedUpdate
WaitForSeconds
WaitForSecondsRealtime
WaitUntil
WaitWhile