Search Unity

[Solved] Remove object from a list ?

Discussion in 'Scripting' started by skyLark9, Aug 30, 2019.

  1. skyLark9

    skyLark9

    Joined:
    May 2, 2018
    Posts:
    135
    Hi
    Mr problem is that when object with tag get inside player collider and get destroyed it should remove from the list. instead it gives me a error. Here is my script

    Code (CSharp):
    1.  
    2.  
    3.     public List<GameObject> enemiesInRange = new List<GameObject>();
    4.     public int hox;
    5.  
    6.     int SortByDistanceToMe(GameObject a, GameObject b)
    7.     {
    8.         float squaredRangeA = (a.transform.position - transform.position).sqrMagnitude;
    9.         float squaredRangeB = (b.transform.position - transform.position).sqrMagnitude;
    10.         return squaredRangeA.CompareTo(squaredRangeB);
    11.     }
    12.  
    13.     // Update is called once per frame
    14.     void Update()
    15.     {
    16.  
    17.         enemiesInRange.Sort(SortByDistanceToMe);
    18.  
    19.         hox = enemiesInRange.Count;
    20.         if (hox == 1)
    21.         {
    22.             enemiesInRange[0].GetComponent<enemypath>().enemy_checker = true;
    23.  
    24.         }
    25.  
    26.         if (hox == 2)
    27.         {
    28.             enemiesInRange[0].GetComponent<enemypath>().enemy_checker = true;
    29.             enemiesInRange[1].GetComponent<enemypath>().enemy_checker = true;
    30.         }
    31.         if (hox == 3)
    32.         {
    33.             enemiesInRange[0].GetComponent<enemypath>().enemy_checker = true;
    34.             enemiesInRange[1].GetComponent<enemypath>().enemy_checker = true;
    35.             enemiesInRange[2].GetComponent<enemypath>().enemy_checker = true;
    36.         }
    37.  
    38.             foreach (GameObject v in enemiesInRange) // error : Collection was modified; enumeration operation may not execute.
    39.             {
    40.                 if (v.GetComponent<dead>().hp <= 0)
    41.                 {
    42.                     enemiesInRange.Remove(v);
    43.                 }
    44.             }
    45.        
    46.    
    47.  
    48.     }
    49.  
    50.  
    51.     void OnTriggerEnter(Collider other)
    52.     {
    53.         if (other.CompareTag("enemy") && hox < 3)
    54.         { // list have three enemies
    55.             enemiesInRange.Add(other.attachedRigidbody.gameObject);
    56.         }
    57.     }
    58.  
    59.     void OnTriggerStay(Collider otherb)
    60.     {
    61.  
    62.     }
    63.  
    64.     void OnTriggerExit(Collider other)
    65.     {
    66.         if (other.CompareTag("enemy"))
    67.         {
    68.             enemiesInRange.Remove(other.attachedRigidbody.gameObject);
    69.             other.GetComponent<enemypath>().enemy_checker = false;
    70.         }
    71.     }
    72.  
    73.  
     
  2. Munchy2007

    Munchy2007

    Joined:
    Jun 16, 2013
    Posts:
    1,735
    You can't modify a list while iterating it with foreach.

    You can do it like this instead...

    Code (CSharp):
    1.  
    2.         for int(n = enemiesInRange.Count -1; n >= 0; n--)
    3.         {
    4.             var enemy = enemiesInRange[n];
    5.             if (enemy.GetComponent<dead>().hp <= 0)
    6.             {
    7.                 enemiesInRange.Remove(enemy);
    8.             }
    9.         }
     
    skyLark9 likes this.
  3. skyLark9

    skyLark9

    Joined:
    May 2, 2018
    Posts:
    135
    You did it :)
    Thank you so much Munchy.
     
    Munchy2007 likes this.