Coroutine(协程)

2022-04-07  本文已影响0人  叫我颜先生
简介

基本API用法以及一些注意事项


常见返回值

常见用法
public class TestAsynDownload : MonoBehaviour {
    void Start () {
        StartCoroutine(Work());
    }

    IEnumerator Work()
    {
        WWW www = WWW("http://www.baidu.com");
        yield return www; // 等待直至异步下载完成,才继续往下执行
        Debug.Log(www.text);
    }
}
public class TestMultipleCoroutine : MonoBehaviour {

    void Start () {
        StartCoroutine(Work()); 
    }

    IEnumerator Work()
    {
        yield return StartCoroutine(Download1());
        yield return StartCoroutine(Download2());
    }

    IEnumerator Download1()
    {
        WWW www = new WWW("http://www.baidu.com");
        yield return www; // 等待直至下载完成
    }

    IEnumerator Download2()
    {
        WWW www = new WWW("http://www.baidu.com");
        yield return www; // 等待直至下载完成
    }
}
public class TestStepToCalculate : MonoBehaviour {

    void Start () {
        StartCoroutine(Calculate(1000));
    }

    IEnumerator Calculate(int times)
    {
        int num = 0; // 用于控制每帧的计算次数
        for (int i = 0; i < times; i++)
        {
            Debug.Log(Mathf.Pow(i, 10)); // 计算i的10次方
            if (++num >= 10)
            {
                num = 0;
                yield return null; // 每帧只计算10次
            }
        }
    }
}
public class TestCriticalSection : MonoBehaviour {

    private bool isDownloading = false; // 是否有某个协程正在下载中

    void Start () {
        StartCoroutine(Download("a"));
        StartCoroutine(Download("b"));
    }

    IEnumerator Download(string path)
    {
        while(isDownloading){
            yield return null; // 下一帧继续检测是否还有其他协程正在下载中
        }
        isDownloading = true; // 可以开始下载,先修改标记

        WWW www = new WWW("http://www.baidu.com");
        yield return www; // 等待直至异步下载完成,才继续往下执行
        Debug.Log(path);

        isDownloading = false; // 完成下载后,修改标记
    }
}

上一篇下一篇

猜你喜欢

热点阅读