Unity - Coroutines

在Unity中制作游戏时,协同程序是最有用的工具.让我们考虑下面显示的代码行来理解协程的含义.

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

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

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

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

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

请记住,渲染器负责实际生成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循环中捕获我们的coroutine函数.

要在C#中创建协同程序,我们只需创建一个返回 IEnumerator 的方法.它还需要 yield return 语句.收益率报表是特殊的;它实际上告诉Unity暂停脚本并继续下一帧.

有很多方法可以用来产生回报;其中之一是创建 WaitForSeconds 类的实例.这使得协程在继续之前等待一定量的实际秒数.

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

协程广泛用于定时方法,就像我们刚才那样没有.各种 WaitForX 方法都有各自的用途.当游戏同时运行时,协同程序也用于运行"自己运行"的进程.例如,当玩家从一个点开始加载大屏幕的部分时,这很有用.

Coroutines