2015-11-19 2 views
2

У меня странная проблема, и мне нужна помощь.Обратный вызов действий, противоречащий циклу

Когда я печатаю переменный цикл я, он печатает 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

Проблема заключается в анонимный метод. Они ссылаются на одну и ту же переменную цикла 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

Бывает так, как работает механика захваченных переменных. В двух словах - для первого вашего кода переменная «i» должна быть 3 и только после того, как ваш код запустит corutine. Решение этой проблемы - просто добавить переменную, которая хранит значение «я» внутри обратного вызова :)

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

Смежные вопросы