Разбираем корутины в Unity (мидл)
IEnumerators и корутины позволяют начинать выполнение каких-либо действий, продолжать их в течение определенного времени, а затем останавливать. Я использую их постоянно:
- для всплесков визуальных эффектов,
- для интерполяции движения,
- для ожидания загрузки сцены перед получением её объектов.
Описание
Метод StartCoroutine запускает корутину.
Выполнение корутины можно приостановить в любой момент с помощью оператора yield. Когда используется yield, выполнение корутины приостанавливается и автоматически продолжается в следующем кадре. Более подробно см. документацию по корутинам.
Корутины отлично подходят для моделирования поведения, растянутого на несколько кадров. Метод StartCoroutine возвращает управление после первого yield return, однако можно выполнить yield от результата, чтобы дождаться завершения корутины.
⚠ Важно: Нет гарантии, что корутины завершатся в том же порядке, в котором были запущены, даже если они заканчиваются в одном кадре.
Любой yield (включая null) приводит к возобновлению выполнения в одном из следующих кадров, если только корутина не была остановлена или завершена.
Остановка корутин
- Корутины можно остановить с помощью MonoBehaviour.StopCoroutine и MonoBehaviour.StopAllCoroutines.
- Они также прекращаются при уничтожении MonoBehaviour или отключении GameObject, к которому он привязан.
- Однако! Корутину НЕ остановит просто отключение MonoBehaviour.
Пример использования StartCoroutine:
Еще пример
Объявление
Описание
Запускает корутину с указанным именем метода (methodName).
В большинстве случаев предпочтительнее использовать другую версию StartCoroutine (где передается IEnumerator). Однако вызов StartCoroutine с именем метода в виде строки позволяет останавливать конкретную корутину с помощью StopCoroutine, передав то же имя метода.
⚠ Недостатки этого способа:
- Использование строкового имени увеличивает нагрузку на производительность при запуске корутины.
- Можно передать только один параметр.
Созданная корутина может запустить другую корутину. Эти две корутины могут взаимодействовать различными способами:
- Обе корутины могут выполняться параллельно.
- Одна корутина может остановить другую, продолжая выполняться сама.
В приведённом ниже примере одна корутина приостанавливает выполнение, запуская другую. Когда вторая корутина завершается, первая перезапускается.
Еще больше полезного материала по геймдеву в нашем канале: