Version: 6000.3
语言: 中文
使用协程跨帧拆分任务
分析协程

编写和运行协程

协程是一种可以暂停执行并在以后恢复的方法。在 Unity 应用程序中,这意味着协程可以在一帧中开始运行,然后在另一帧中恢复运行,从而允许您将任务分散到多个帧中。

常规的非协程方法在将控制权返回给调用方之前会运行到完成,这在 Unity 运行时意味着它们的作在单个帧更新中完成。在希望方法的工作在多个帧上生效的情况下,例如逐渐淡出效果,可以使用协程。协程对于处理长时间的异步作也很有用,例如等待 HTTP 传输、资产加载或文件 I/O 完成。

重要提示:不要将协程与线程混淆。在协程中运行的同步作仍会在主线程上执行。如果您想减少在主线程上花费的 CPU 时间,避免阻塞协程中的作与在任何其他脚本代码中一样重要。如果您想在 Unity 中使用多线程代码,您的选项是:

编写协程

考虑逐渐降低对象的 alpha(不透明度)值直到它变得不可见的任务。要使淡入淡出效果可见,不透明度必须在一系列帧中降低。如果您尝试编写Fade方法,你可以写如下内容:

void Fade()
{
    Color c = renderer.material.color;
    for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
    {
        c.a = alpha;
        renderer.material.color = c;
    }
}

此方法不是协程,因此它执行其for循环,对象会立即消失,而不是淡出。一种可能的解决方案是将代码添加到Update函数,该函数逐帧执行淡入淡出。但是,使用协程会更方便。

协程是具有 IEnumerator 返回类型和包含在正文中某处的 yield return 语句的方法。这yield return语句是暂停执行的点。前一个Fade方法可以重写为协程,如下所示:

IEnumerator Fade()
{
    Color c = renderer.material.color;
    for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
    {
        c.a = alpha;
        renderer.material.color = c;
        yield return null;
    }
}

此版本的方法执行其for循环,然后在yield return null陈述。它会在下一帧中恢复并执行循环的另一次迭代,依此类推,使渐进的淡入淡出效果可见。循环计数器中的Fade方法在协程的生命周期内保持其正确的值,并且任何变量或参数都会保留在yield语句。

启动和停止协程

要设置协程运行,请使用 StartCoroutine 方法:

void Update()
{
    if (Input.GetKeyDown("f"))
    {
        StartCoroutine(Fade());
    }
}

若要停止协程,请使用 StopCoroutineStopAllCoroutines。如果出现以下情况,协程也会停止:

  • 的值GameObject.activeSelf成为false对于游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
    请参阅术语表
    脚本附加到。
  • MonoBehaviour 脚本会随着调用 Destroy 而销毁。

注意:通过将 enabled 设置为 来禁用 MonoBehaviour 脚本false不会停止协程。

恢复协程

挂起的协程何时恢复执行取决于yield return陈述。一个yield return null在下一帧恢复。Unity 有一组自定义产量指令,可用于在指定时间后、满足指定条件或播放器循环中的特定点恢复。有关更多信息,请参阅 yield 指令参考

在淡入淡出效果示例中,您可能希望淡入淡出效果以比帧速率更低且更一致的速率发生。您可以yield returnWaitForSeconds指令在迭代之间引入固定的时间延迟Fade方法如下:

IEnumerator Fade()
{
    Color c = renderer.material.color;
    for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
    {
        c.a = alpha;
        renderer.material.color = c;
        // Wait for 0.1 seconds before the next iteration
        yield return new WaitForSeconds(.1f);
    }
}

编辑模式下的协程

协程主要是运行时功能。关联的运行时产量指令位于UnityEngine命名空间,并在编辑器的 运行(Editor) 运行模式或独立平台播放器中运行。如果您脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
使用[ExecuteInEditMode][ExecuteAlways]属性,但编辑模式下的更新循环不像播放器循环那样固定和规则。

对于专门设计为在编辑模式下运行的协程,请使用编辑器协程包

测试中的协程

Unity 测试框架 游戏模式测试标有[UnityTest]属性作为协程运行,并允许您从测试中为 Unity 编辑器生成自定义指令。有关更多信息,请参阅编辑器的产量说明

其他资源

使用协程跨帧拆分任务
分析协程