Этот урок посвящен использованию корутин для выполнения кода с задержкой. Корутины полезны для выполнения участков кода через заданный промежуток времени, например, для создания объектов каждые две секунды.
Практическое применение: создание объектов с задержкой
Для демонстрации откроем сцену Basic. В ней есть три объекта и скрипт KarateAdgex, который мы будем модифицировать. Изначально скрипт создает случайные объекты в случайных местах. Мы перепишем его для создания объектов через заданные промежутки времени.
Модификация скрипта: разделение функциональности
В скрипте KarateAdgex метод Start создает пять объектов. Переименуем его в Create и вызовем из Start. Это позволит управлять вызовом Create.
Запуск кода с задержкой: метод Invoke
Для запуска Create с задержкой можно использовать метод Invoke:
Invoke("Create", 2f);
Invoke принимает имя метода (строкой) и время задержки в секундах (тип float). После запуска проекта объекты создаются через две секунды. Несмотря на работоспособность, передача имени метода строкой считается не лучшей практикой. Поэтому лучше использовать корутины.
Использование корутин
Для реализации задержки без Invoke, создадим корутину:
public IEnumerator Create3DObject() {
// ... код ...
yield return new WaitForSeconds(3f);
// ... код ...
}
IEnumerator Create3DObject() — это корутина. yield return new WaitForSeconds(3f) приостанавливает выполнение на три секунды. После паузы выполняется оставшийся код. Для запуска корутины используем StartCoroutine:
StartCoroutine(Create3DObject());
Для работы корутин необходимы следующие using-директивы:
using UnityEngine;
using System.Collections;
Управление запуском корутины
Сейчас корутина запускается в Start. Для запуска по событию (например, нажатию кнопки), можно вызвать StartCoroutine в методе Update, отслеживая нажатие кнопки:
if (Input.GetKeyDown(KeyCode.Y)) {
StartCoroutine(Create3DObject(2f));
}
В этом случае корутина принимает параметр — количество секунд задержки:
public IEnumerator Create3DObject(float seconds) {
yield return new WaitForSeconds(seconds);
// ... код ...
}
Теперь корутина запускается только при нажатии клавиши Y.
Создание объектов с постоянной задержкой
Для создания объектов с постоянной задержкой (каждые две секунды), используем бесконечный цикл в корутине:
public IEnumerator Create3DObject(float seconds) {
while (true) {
// ... код создания объекта ...
yield return new WaitForSeconds(seconds);
}
}
Теперь при нажатии Y, объекты будут создаваться каждые две секунды.
Корутины — мощный инструмент для управления выполнением кода во времени. Они позволяют создавать отложенные действия, выполнять код с периодичностью и управлять сложными асинхронными операциями в Unity.