Unity - 协程


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

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

一般来说,如果您在 Unity(或 C#,实际上)中调用函数,该函数将从头运行到结束。就您的代码而言,这就是您认为的“正常”Behave。然而,有时我们想要故意减慢某个函数的速度,或者让它等待的时间超过它运行的瞬间持续时间。协程正是能够做到这一点:协程是一个能够等待计时其进程以及完全暂停它的函数。

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

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

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

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

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方法都有各自的用途。协程还用于运行“侧面”进程,这些进程在游戏同时运行时自行运行。例如,当玩家从某一点开始时,这对于加载大关卡的屏幕外部分很有用。

协程