unity3d 协程

示例

首先,必须了解,游戏引擎(例如Unity)在“基于框架”的范例上工作。

在每一帧中执行代码。

其中包括Unity自己的代码以及您的代码。

在考虑框架时,一定要了解,绝对不能保证框架何时发生。他们不会定期跳动。帧之间的间隙可以是例如0.02632,然后是0.021167,然后是0.029778,依此类推。在该示例中,它们全都是“大约” 1/50秒,但它们都是不同的。而且在任何时候,您可能需要花费更长或更短的时间才能获得帧。并且您的代码可以在框架内的任何时间执行。

牢记这一点,您可能会问:如何在Unity中的代码中访问这些框架?

很简单,您可以使用Update()呼叫,也可以使用协程。(实际上,它们是完全相同的东西:它们允许代码在每个帧中运行。)

协程的目的是:

您可以运行一些代码,然后“停止并等待”直到以后的某个帧

您可以等待到下一帧,可以等待许多帧,或者可以等待未来几秒钟的大约时间。

例如,您可以等待“大约一秒钟”,这意味着它将等待大约一秒钟,然后从现在开始大约一秒钟将您的代码放在某个帧中。(实际上,在该框架内,代码可以在任何时间运行。)要重复:它不会精确到一秒钟。准确的计时在游戏引擎中毫无意义。

在协程内部:

要等待一帧:

// 做点什么
yield return null;  // 等到下一帧
// 做点什么

等待三帧:

// 做点什么
yield return null;  // 等到从现在开始三帧
yield return null;
yield return null;
// 做点什么

等待大约半秒钟:

// 做点什么
yield return new WaitForSeconds (0.5f); // 等待约0.5秒钟的画面
// 做点什么

每帧都要做一些事情:

while (true)
{
    // 做点什么
    yield return null;  // 等到下一帧
}

该示例实际上与将某些内容简单地放入Unity的“ Update”调用中完全相同:“执行某项操作”中的代码每帧运行一次。

示例

将股票代码附加到GameObject。当该游戏对象处于活动状态时,刻度线将运行。请注意,当游戏对象变为非活动状态时,脚本会仔细停止协程。这通常是正确设计协程用法的重要方面。

using UnityEngine;
using System.Collections;

public class Ticker:MonoBehaviour {

    void OnEnable()
    {
        StartCoroutine(TickEverySecond());
    }

    void OnDisable()
    {
        StopAllCoroutines();
    }

    IEnumerator TickEverySecond()
    {
        var wait = new WaitForSeconds(1f); // 谨记:它仅是近似的
        while(true)
        {
            Debug.Log("Tick");
            yield return wait;  // 等待一帧,大约从现在开始1秒钟
        }
    }
}