如何使用包含http请求的协同程序?

时间:2016-04-04 08:38:16

标签: unity3d httprequest coroutine yield-return

我有一个团结的场景。它使用http请求获取图像并每两秒显示一次。这些图像的顺序很重要。那么,该计划的步骤:

  1. 使用http请求获取图片
  2. 显示,更新索引计数器
  3. 转到第1步
  4. 我的代码在这里:

      int counter = 0;
      float tempTimeLimit = 0;
    
        void Update()
        {
            if (tempTimeLimit > 1)
            {
                // Decrease timeLimit.
                tempTimeLimit -= Time.deltaTime;
            }
            else
            {
                StartCoroutine(_Refresh());
                tempTimeLimit = timeLimit;
            }    
        }
    
        IEnumerator _Refresh ()
        {
            if (counter < 19)
            {
                counter += 1;
                ......    
                var req = new WWW(url);
    
                yield return req;
    
                byte[] data = req.texture.EncodeToPNG();
                File.WriteAllBytes(Application.dataPath + "/../" + counter + ".png", data);
    
                GetComponent<Renderer>().material.mainTexture = req.texture;
    
            }
        }
    

    我希望我看到19个png文件。但我只看到8-9-10个文件。Unity documentation

      

    这将等到协程执行完毕。

    所以我希望我的代码能够成功运行,但不会。

    编辑

    我将变量定义为标志。我初衷并控制它等待。这个对我有用。

    void Update()
    {
            if (!wait)
            {
                wait = true;
                StartCoroutine(_Refresh());
                counter ++;
            }
    }
    IEnumerator _Refresh ()
    {
        if (counter < 19)
        {
            ..........
            var req = new WWW(url + "?" + qs);
            yield return req;
            if (req != null)
               wait = false;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

从几个角度来看,这是错误的,但最重要的是你无法保证在给定的时间内完成提取图像。尝试这样的事情:

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

    IEnumerator _Refresh ()
    {
        counter = 0;
        while (counter < 19)
        {
            counter += 1;
            ......    
            var req = new WWW(url);

            yield return req;

            byte[] data = req.texture.EncodeToPNG();
            File.WriteAllBytes(Application.dataPath + "/../" + counter + ".png", data);

            GetComponent<Renderer>().material.mainTexture = req.texture;

        }
    }