版本: Unity 6 (6000.0)
语言English
  • C#

MonoBehaviour.StartCoroutine

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们会阅读用户提出的每个建议更改,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

切换到手册

声明

public Coroutine StartCoroutine(IEnumerator routine);

描述

启动一个协程。

协程的执行可以在任何时候使用 yield 语句暂停。当使用 yield 语句时,协程会暂停执行并在下一帧自动恢复。有关更多详细信息,请参阅协程文档。

协程在对多帧进行建模时非常有用。StartCoroutine 方法在第一次 yield return 时返回,但是您可以 yield 返回值,这将等待协程执行完成。即使协程在同一帧完成,也不能保证它们以启动的相同顺序结束。

任何类型的 yield,包括 null,都会导致执行在后面的帧恢复,除非协程被停止或已完成。

注意:您可以使用 MonoBehaviour.StopCoroutine 和 MonoBehaviour.StopAllCoroutines 停止协程。当 MonoBehaviour 被销毁或附加了 MonoBehaviour 的 GameObject 被禁用时,协程也会停止。当 MonoBehaviour 被禁用时,协程不会停止。

另请参阅:CoroutineYieldInstruction

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); } }

声明

public Coroutine StartCoroutine(string methodName, object value = null);

描述

启动一个名为 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"); } }