Unity - 协程

在 Unity 中制作游戏时,协程是最有用的工具。让我们考虑下面显示的代码行来了解协程的全部内容。

IEnumerator MyCoroutineMethod() {
   // Your code here…
   
   yield return null;
}

通常,如果您在 Unity(或 C#,真的)中调用一个函数,该函数将从头到尾运行。就您的代码而言,这就是您认为的"正常"行为。但是,有时我们想故意减慢某个函数的速度,或者让它等待超过它运行的一瞬间的时间。协程正是能够做到这一点:协程是一个能够等待计时其进程以及完全暂停它的函数。

让我们考虑一个例子来了解协程的工作原理。假设我们想要制作一个正方形,以 1 秒为间隔在红色和蓝色之间改变颜色。

首先,我们创建一个精灵。接下来,创建一个新脚本,并将其命名为 ColorChanger。在此脚本中,我们获得了对精灵的 Sprite Renderer 的引用。但是,我们将使用不同的方法来获取组件。我们不会像目前所做的那样将组件拖放到插槽中,而是要求代码检测组件本身。

这通过 GetComponent 方法完成,该方法返回它检测到的第一个匹配组件。由于我们每个对象只使用一个 Sprite Renderer,因此我们可以使用此方法每次自动检测并获取对渲染器的引用。

请记住,渲染器负责使精灵在屏幕上实际可见。渲染器具有 color 属性,该属性会影响精灵的全局颜色;这是要修改的值。将 Color 值设为公共将允许我们通过操作系统默认颜色选择程序中的编辑器来选择它们。

private SpriteRenderer sr;

public Color color1;
public Color color2;

void Start () {
   sr = GetComponent<SpriteRenderer>();
   StartCoroutine(ChangeColor());
}

IEnumerator ChangeColor() {
   
   while (true) {
      
      if (sr.color == color1)
         sr.color = color2;
      
      else
         sr.color = color1;
      
      yield return new WaitForSeconds(3);
   }
}

现在,我们将在 while 循环中捕获协程函数。

要在 C# 中创建协程,我们只需创建一个返回 IEnumerator 的方法。它还需要一个 yield return 语句。yield return 语句很特殊;它实际上告诉 Unity 暂停脚本并继续执行下一帧。

有多种方法可用于产生返回;其中之一是创建 WaitForSeconds 类的实例。这会使协程等待一定数量的真实秒数,然后再继续。

让我们编译代码并返回 Unity。我们只需选择交替颜色,然后点击播放。我们的对象现在应该以 3 秒为间隔在两种颜色之间切换。您可以将间隔设为公共变量,并调整颜色变化的频率。

协同程序广泛用于定时方法,就像我们刚才做的那样。各种WaitForX方法都有自己的用途。协同程序还用于运行"旁路"进程,这些进程在游戏同时运行时自行运行。这很有用,例如,当玩家从某一点开始时,加载大型关卡的屏幕外部分。

Coroutines