动作回调与for循环冲突

时间:2015-11-19 12:01:06

标签: c# unity3d callback

我有一个奇怪的问题,我需要帮助。

当我打印循环变量i时,它打印i = 3.但是我必须是0,1或2.

这是我的代码:

IEnumerator Start()

{

itemCount = 3;

for (int i = 0; i < itemCount; i++)
{
   StartCoroutine(TextureFromURL(textureURLString[i], (Sprite callback) =>
   {
      print("i = " + i);
      AddItem();
      GameObject.Find("pashaItem(Clone)").GetComponentInChildren<Text>().text = descriptions[u];                    
      GameObject.Find("pashaItem(Clone)").transform.GetChild(1).GetComponent<Image>().sprite = callback;
      GameObject.Find("pashaItem(Clone)").name = "pashaItem" + (u + 1).ToString();
    }));
        }
 }

    IEnumerator TextureFromURL(string url, Action<Sprite> callback)
    {
        Sprite s = new Sprite();
        WWW textureWWW = new WWW(url);
        yield return textureWWW;

        if (!String.IsNullOrEmpty(textureWWW.error))
        {
            print("null ve ya bos");
        }
        else
        {
            Texture2D myTexture = textureWWW.texture;
            s = Sprite.Create(myTexture, new Rect(0, 0, myTexture.width, myTexture.height), new Vector2(0.5f, 0.5f));
        }

        callback(s);
    }

2 个答案:

答案 0 :(得分:1)

问题是无神论的方法。它们引用相同的循环变量i。您可以通过制作“i”的副本来解决它。

我删除了你的代码,制作了一个简单的工作示例。

 void Start()
{
    var itemCount = 3;

    for (int i = 0; i < itemCount; i++)
    {
        var x = i; // Important Line
        StartCoroutine(TextureFromURL(() =>
        {

            print("i = " + x);
        }));
    }
}

IEnumerator TextureFromURL( Action callback)
{
    yield return null;
    callback();
}

答案 1 :(得分:0)

理由是捕获变量的机制是如何工作的。 用两个词 - 首先你的代码使变量'i'变为3并且只在你的代码开始corutine之后。对此问题的决定 - 只需在回调中添加存储'i'值的变量:)

var local_i = i;
print("local_i = " + local_i);

您可以在这里阅读更多内容: http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx