Why does it jump every second step in this loop?

I am making an rts game. It is now possible to select several units by clicking on them while holding shift. But I can’t deselect them all at once when I hit the terrain.

	public void DeselectUnits() {
		if (currentlySelectedUnitGroup.Count > 0) {
			for (int i = 0; i < currentlySelectedUnitGroup.Count; i++) {			
				GameObject go = currentlySelectedUnitGroup *as GameObject;*
  •  		RemoveFromCurrentlySelectedUnitGroup(go);*
    
  •  	}		*
    
  •  }		*
    
  • }*
  • public void RemoveUnitFromGroup(GameObject selectedObj) {*
  •   currentlySelectedUnitGroup.Remove(selectedObj);*
    
  •   GameObject selecter = selectedObj.transform.FindChild("Selected").gameObject;//this is a projector*
    
  •   selecter.SetActive(false);*
    
  • }*
    If I select 6 units. Then click the ground, 3 of them gets deselected. If I click once again on the ground, one last will still be selected. But I want them all to be deselected at once.
    Instead of the RemoveUnitFromGroup function I also tried with this:
  • public void RemoveFromCurrentlySelectedUnitGroup(GameObject unit) {*
  •  int i = 0;*
    
  •  while (i < currentlySelectedUnitGroup.Count) {*
    

_ GameObject unitObj = currentlySelectedUnitGroup as GameObject;_
* if(unitObj == unit) {*
* currentlySelectedUnitGroup.RemoveAt(i);*
* unitObj.GetComponent().selected = false;*
* GameObject selecter = unitObj.transform.FindChild(“Selected”).gameObject;*
* selecter.SetActive(false);*
* return;*
* } *
* i++;*
* }*
* return;*
* }*
But the exact same thing happens.
And also, currentlySelectedUnitGroup.Clear(); wont work. It has to be done this way if I also want to turn off the projectors.

2 Answers

2

Reverse your for loop.

for ( int i = list.count - 1; i >= 0; i-- )

No explanation, but better than my solution. +1

–

The problem is that you’re removing your unit from a group (which I guess is generic list) while using this list Count property to control the loop. In the beginning Count is equal to 6, after first loop run it is 5, then 4, and then 3 and loop exits.

The solution is to create new list, initializing it with your currentlySelectedUnitGroup, and then iterate over this new list:

var newList = new List<GameObject>(currentlySelectedUnitGroup);
foreach(var go in newList)
{
    RemoveFromCurrentlySelectedUnitGroup(go);
}