启动一个协程。
协程的执行可以在任何时候使用 yield 语句暂停。当使用 yield 语句时,协程会暂停执行并在下一帧自动恢复。有关更多详细信息,请参阅协程文档。
协程在对多帧进行建模时非常有用。StartCoroutine 方法在第一次 yield return 时返回,但是您可以 yield 返回值,这将等待协程执行完成。即使协程在同一帧完成,也不能保证它们以启动的相同顺序结束。
任何类型的 yield,包括 null,都会导致执行在后面的帧恢复,除非协程被停止或已完成。
注意:您可以使用 MonoBehaviour.StopCoroutine 和 MonoBehaviour.StopAllCoroutines 停止协程。当 MonoBehaviour 被销毁或附加了 MonoBehaviour 的 GameObject 被禁用时,协程也会停止。当 MonoBehaviour 被禁用时,协程不会停止。
另请参阅:Coroutine,YieldInstruction
StartCoroutine 的示例
using UnityEngine; using System.Collections;
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 return WaitAndPrint(2.0f); 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; } } }
创建的协程可以启动另一个协程。这两个协程可以通过多种方式一起运行。这包括两个协程并行运行。或者,一个协程可以在继续自身的同时停止另一个协程。下面的示例显示了一个协程在启动另一个协程时暂停。当第二个协程完成时,它会重新启动第一个协程。
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"); } }