IEnumerators должны быть объявлены в области видимости класса, а не в области функций, а затем запущены с помощью StartCoroutine ()
* 1003 Е.Г. *
public class ExampleClass : MonoBehaviour
{
// In this example we show how to invoke a coroutine and
// continue executing the function in parallel.
private IEnumerator coroutine;
void Start()
{
// - After 0 seconds, prints "Starting 0.0"
// - After 0 seconds, prints "Before WaitAndPrint Finishes 0.0"
// - After 2 seconds, prints "WaitAndPrint 2.0"
print("Starting " + Time.time);
// Start function WaitAndPrint as a coroutine.
coroutine = WaitAndPrint(2.0f);
StartCoroutine(coroutine);
print("Before WaitAndPrint Finishes " + Time.time);
}
// every 2 seconds perform the print()
private IEnumerator WaitAndPrint(float waitTime)
{
while (true)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
}
Источник: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html
Обратите внимание, что IEnumerator определен в классе, а не внутри функции Update ().
Вы также должны быть осторожны, когда запускаете свои сопрограммы, так как вы можете очень легко запускать несколько сопрограмм одновременно, что здесь не идеально (например, вы можете иметь 3 или 4 сопрограммы, пытающихся загрузить уровень). все в одно и то же время, что приведет к загрузке уровня 3 или 4 раза, что вызовет огромную задержку для игрока вместе с потенциальными нежелательными побочными эффектами)
Справка: IEnumerators - это не то же самое, что сопрограммы, сопрограммы - это функция Unity, позволяющая выполнять код параллельно (но не многопоточно), и для работы они используют функцию IEnumerators (C #).
IEnumerators - это функция C #, которая имеет много возможностей помимо сопрограмм, в первую очередь она используется для перебора пользовательских контейнеров (массивов, списков и т. Д.)
Будьте осторожны с вашей терминологией, поскольку это две очень разные (хотя и связанные) вещи.