启动一个协同程序。
可以使用 yield 语句在任意执行点暂停协同程序的执行。
yield 返回值指定何时恢复该协同程序。
当在多个帧上对行为建模时,协同程序是您的理想选择。
协同程序几乎没有性能开销。
StartCoroutine 函数始终立即返回,但您可以 yield 结果。
这将等待该协同程序执行完毕。无法保证协同程序按其启动顺序结束,
即使它们在同一帧中完成也是如此。
使用 JavaScript 时,没有必要使用 StartCoroutine,编译器会为您执行该操作。
编写 C# 代码时,必须手动调用 StartCoroutine。
using UnityEngine; using System.Collections;
// In this example we show how to invoke a coroutine and continue executing // the function in parallel.
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); } } }
另一个示例:
// In this example we show how to invoke a coroutine and wait until it // is completed
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { IEnumerator 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 return StartCoroutine(WaitAndPrint(2.0F)); print("Done " + Time.time); }
// suspend execution for waitTime seconds 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.
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 execution of this coroutine and return to the main loop until next frame yield return null; } } }
coroutine | 所创建的协同程序的名称。 |
启动一个名为 coroutine
的协同程序。
创建一个协同程序。可以使用任何协同程序名称。 StartCoroutine 函数立即终止,但是,它创建的协同程序仍按预期运行。 创建的协同程序可以启动另一个协同程序。 这两个协同程序能以多种方式一同运行。 例如,两个协同程序可以并行运行。 或者,一个协同程序可以停止另一个协同程序,但自己继续运行。 下面的脚本示例演示一个协同程序在启动另一个协同程序后暂停运行。 当第二个协同程序完成时,重新启动第一个协同程序。
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class ExampleClass : MonoBehaviour { void Start() { StartCoroutine(coroutineA()); }
IEnumerator coroutineA() { // wait for 1 second 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"); } }