Описание
Запускает сопрограмму.
Выполнение сопрограммы можно приостановить в любой момент с помощью оператора yield. Когда используется инструкция yield, сопрограмма приостанавливает выполнение и автоматически возобновляет выполнение в следующем кадре. Дополнительную информацию см. в документации по Coroutines.
Сопрограммы отлично подходят для моделирования поведения в нескольких кадрах. Метод StartCoroutine возвращается при первом возврате yield, однако вы можете вернуть результат, который ожидает завершения выполнения сопрограммы. Нет гарантии, что сопрограммы заканчиваются в том же порядке, в котором они начались, даже если они заканчиваются в одном и том же кадре.
Вывод любого типа, включая null, приводит к тому, что выполнение возвращается в более позднем кадре, если только сопрограмма не остановлена или не завершена.
Примечание. Вы можете остановить сопрограмму с помощью MonoBehaviour.StopCoroutine и MonoBehaviour.StopAllCoroutines. Сопрограммы также останавливаются, когда MonoBehaviour уничтожается или если GameObject, к которому привязано MonoBehaviour, отключен. Сопрограммы не останавливаются при отключении MonoBehaviour.
См. также: Сопрограмма, Инструкция по выходу
Пример StartCoroutine:
using UnityEngine;
using System.Collections;
// В этом примере мы показываем, как вызвать сопрограмму и
// продолжить выполнение функции параллельно.
public class ExampleClass : MonoBehaviour
{
// В этом примере мы показываем, как вызвать сопрограмму и
// продолжить выполнение функции параллельно.
private IEnumerator coroutine;
void Start()
{
// - Через 0 секунд печатает "Начиная 0.0"
// - Через 0 секунд печатает "Before WaitAndPrint Finishes 0.0"
// - Через 2 секунды печатает "WaitAndPrint 2.0"
print("Starting " + Time.time);
// Запускаем функцию WaitAndPrint как сопрограмму.
coroutine = WaitAndPrint(2.0f);
StartCoroutine(coroutine);
print("Before WaitAndPrint Finishes " + Time.time);
}
// каждые 2 секунды выполняем print()
private IEnumerator WaitAndPrint(float waitTime)
{
while (true)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
}
Другой пример:
// В этом примере мы показываем, как вызывать сопрограмму и ждать, пока она
// завершено
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
IEnumerator Start()
{
// - Через 0 секунд печатает "Начиная 0.0"
// - Через 2 секунды печатает "WaitAndPrint 2.0"
// - Через 2 секунды печатает "Готово 2.0"
print("Starting " + Time.time);
// Запускаем функцию WaitAndPrint как сопрограмму. И дождитесь его завершения.
// то же, что и yield return WaitAndPrint(2.0f);
yield return StartCoroutine(WaitAndPrint(2.0f));
print("Done " + Time.time);
}
// приостановить выполнение на секунды ожидания
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
Описание
Запускает сопрограмму с именем methodName
.
В большинстве случаев лучше использовать описанный выше вариант StartCoroutine. Однако StartCoroutine, использующий строковое имя метода, позволяет использовать StopCoroutine с конкретным именем метода. Недостатком является то, что строковая версия имеет более высокие накладные расходы во время выполнения для запуска сопрограммы, и вы можете передать только один параметр.
// В этом примере мы показываем, как вызвать сопрограмму, используя строковое имя, и остановить ее.
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
IEnumerator Start()
{
StartCoroutine("DoSomething", 2.0f);
yield return new WaitForSeconds(1);
StopCoroutine("DoSomething");
}
IEnumerator DoSomething(float someParameter)
{
while (true)
{
print("DoSomething Loop");
// Завершить выполнение этой сопрограммы и вернуться в основной цикл до следующего кадра
yield return null;
}
}
}
Созданная сопрограмма может запустить другую сопрограмму. Эти две сопрограммы могут работать вместе во многих отношениях. Это включает в себя обе сопрограммы, работающие параллельно. В качестве альтернативы одна сопрограмма может остановить другую, в то время как она продолжает свою работу. В приведенном ниже примере показана пауза одной сопрограммы при запуске другой. Когда вторая сопрограмма завершает работу, она перезапускает первую.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
void Start()
{
StartCoroutine(coroutineA());
}
IEnumerator coroutineA()
{
// ждем 1 секунду
Debug.Log("coroutineA created");
yield return new WaitForSeconds(1.0f);
yield return StartCoroutine(coroutineB());
Debug.Log("coroutineA running again");
}
IEnumerator coroutineB()
{
Debug.Log("coroutineB created");
yield return new WaitForSeconds(2.5f);
Debug.Log("coroutineB enables coroutineA to run");
}
}