Запуск корутины.
Выполнение корутины может быть приостановлено в любой точке оператором yield.
Возвращаемое yield значение определяет когда корутина будет возобновлена.
Корутины - прекрасное средство когда моделируется поведение, растянутое на несколько кадров.
Корутины практически не имеют накладных расходов.
Функция StartCoroutine всегда возвращает управление немедленно, однако вы можете получить результат.
Он будет ждать пока корутина не закончит выполнение.
Когда используете JavaScript нет необходимости использовать StartCoroutine - компилятор сделает это для вас.
Когда вы пишете на C#,- вы должны вызывать StartCoroutine.
// In this example we show how to invoke a coroutine and continue executing // the function in parallel.
function 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. And continue execution while it is running // this is the same as WaitAndPrint(2.0) as the compiler does it for you automatically StartCoroutine(WaitAndPrint(2.0)); print ("Before WaitAndPrint Finishes " + Time.time); }
function WaitAndPrint (waitTime : float) { // suspend execution for waitTime seconds yield WaitForSeconds (waitTime); print ("WaitAndPrint "+ Time.time); }
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { void Start() { print("Starting " + Time.time); StartCoroutine(WaitAndPrint(2.0F)); print("Before WaitAndPrint Finishes " + Time.time); } IEnumerator WaitAndPrint(float waitTime) { yield return new WaitForSeconds(waitTime); print("WaitAndPrint " + Time.time); } }
Другой пример:
// In this example we show how to invoke a coroutine and wait until it // is completed function Start() { // - After 0 seconds, prints "Starting 0.0" // - After 2 seconds, prints "WaitAndPrint 2.0" // - After 2 seconds, prints "Done 2.0" print ("Starting " + Time.time); // Start function WaitAndPrint as a coroutine. And wait until it is completed. // the same as yield WaitAndPrint(2.0); yield StartCoroutine(WaitAndPrint(2.0)); print ("Done " + Time.time); }
function WaitAndPrint (waitTime : float) { // suspend execution for waitTime seconds yield WaitForSeconds (waitTime); print ("WaitAndPrint "+ Time.time); }
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { IEnumerator Start() { print("Starting " + Time.time); 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 с указанием конкретного имени метода. Недостаток - строковая версия имеет большие накладные расходы при вызове корутины и может быть передан только один параметр.
// In this example we show how to invoke a coroutine using a string name and stop it
function Start () { StartCoroutine("DoSomething", 2.0); yield WaitForSeconds(1); StopCoroutine("DoSomething"); }
function DoSomething (someParameter : float) { while (true) { print("DoSomething Loop"); // Yield execution of this coroutine and return to the main loop until next frame yield; } }
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; } } }