2016-06-10 2 views
-1
void Update() 
    { 
     //if Trigger is occur (like car collided with another car) and tram trigger is not in progress then resume the animation 
     //it means that stopped car should be animate again 
     if (isTriggerOccur && !objTramTriggerDetector.isTramTriggerInProgress)//&& objTramTriggerDetector.oneTimeOnly 
     { 
       Debug.Log("1:- " + triggerObjects.Count); 
       Debug.Log("2:- " + triggerObjects2.Count); 
       StartCoroutine(PlayAnimationOneByOne()); 
       StartCoroutine(PlayAnimationOneByOne2()); 

     } 
    } 

    IEnumerator PlayAnimationOneByOne(){ 


     foreach (var g in triggerObjects) 
     { 
      Debug.Log("t1 :" + g.name, g.gameObject); 
      //Debug.Log("count : " + triggerObjects.Count); 
      if (triggerObjects.IndexOf(g) == 0) 
      { 
       yield return new WaitForSeconds(Random.Range(.2f, .8f)); 
      } 
      g.Speed = 0.05f; 
      yield return new WaitForSeconds(Random.Range(.2f, .8f)); 

     } 
     //triggerObjects.Clear(); 
    } 

    IEnumerator PlayAnimationOneByOne2() 
    { 
     foreach (var g in triggerObjects2) 
     { 
      //Debug.Log(g.name, g.gameObject); 
      //Debug.Log("count : " + triggerObjects2.Count); 
      if (triggerObjects.IndexOf(g) == 0) 
      { 
       yield return new WaitForSeconds(Random.Range(.2f, .8f)); 
      } 

      g.Speed = 0.05f; 
      //triggerObjects2.Remove(g); 
      yield return new WaitForSeconds(Random.Range(.2f, .8f)); 

     } 
     //triggerObjects2.Clear(); 
    } 

    static List<AnimationControlSpeed> triggerObjects = new List<AnimationControlSpeed>(); 
    static List<AnimationControlSpeed> triggerObjects2 = new List<AnimationControlSpeed>(); 

    void OnTriggerEnter(Collider c) 
    { 
     if (c.tag == "Car") 
     { 
      if (c.gameObject.GetComponent<AnimationControlSpeed>().Speed == 0) 
      { 
       if (gameObject.name.Contains("VehicleControl001") || gameObject.name.Contains("VehicleControl002")) 
       { 
        if (!triggerObjects.Contains(gameObject.GetComponent<AnimationControlSpeed>())) 
        { 
         Debug.Log(gameObject.name + " added", gameObject); 
         triggerObjects.Add(gameObject.GetComponent<AnimationControlSpeed>()); 
         //Debug.Log("t1 count : " + triggerObjects.Count); 
        } 
       } 
       else if (gameObject.name.Contains("VehicleControl")) 
       { 
        if (!triggerObjects2.Contains(gameObject.GetComponent<AnimationControlSpeed>())) 
        { 
         //Debug.Log(gameObject.name + " added in t2"); 
         triggerObjects2.Add(gameObject.GetComponent<AnimationControlSpeed>()); 
         //Debug.Log("t2 count : " + triggerObjects2.Count); 
        } 
       } 
       //storing last animation speed 
       lastSpeed = gameObject.GetComponent<AnimationControlSpeed>().Speed; 
       gameObject.GetComponent<AnimationControlSpeed>().Speed = 0; 
       isTriggerOccur = true; 
      } 
     } 
    } 

    void OnTriggerExit(Collider c) 
    { 
     if (c.tag == "Car") 
     { 
      if (c.gameObject.GetComponent<AnimationControlSpeed>().Speed == 0) 
      { 
       isTriggerOccur = false; 
      } 
     } 
    } 

этот простейший код работает нормально, но показывает ошибкуInvalidOperationException: коллекция была изменена; Перечисление

InvalidOperationException: коллекция была изменена; перечисление операция может не выполняться. System.Collections.Generic.List 1+Enumerator[AnimationControlSpeed].VerifyState () (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:778) System.Collections.Generic.List 1 + Перечислитель [AnimationControlSpeed] .MoveNext () (на /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections. Generic/List.cs: 784) CarCollisionDetectionController + c__Iterator0.MoveNext () (в активы/TramCarAnimationCollisionController/CarCollisionDetectionController.cs: 70)

+1

'Коллекция была изменена;' Вы меняете коллекцию внутри 'foreach' оператора – Valentin

+1

Возможный дубликат [Что является лучшим способом изменить список в цикле foreach?] (Http://stackoverflow.com/questions/759966/что-это-на-лучший-путь-к-модификации-а-список-в-Еогеасп-петля) – Valentin

ответ

1

Эта ошибка происходит, если вы делаете изменения в коллекции в то время как вы итерацию с foreach через этот сборник

Такие вещи, как s hown ниже не разрешены, потому что вы меняете информацию о петле во время ее циклизации.

List<string> newList = new List<string>(); 
       newList.Add("1"); 
       newList.Add("2"); 

       foreach (string content in newList) 
       { 
         newList.Add("3"); 
       } 

Вы можете исправить такие вещи, как с помощью for-loop, но будьте осторожны с редактированием вашей коллекции при ее циклическом перемещении. Это на самом деле имеет большой потенциал для возникновения ошибок.

Приветствия.