- Home /
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[i] 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[i] as GameObject;
if(unitObj == unit) {
currentlySelectedUnitGroup.RemoveAt(i);
unitObj.GetComponent<Unit>().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.
Answer by ArkaneX · Nov 13, 2013 at 10:04 PM
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);
}
Answer by mrpmorris · Nov 13, 2013 at 10:14 PM
Reverse your for loop.
for ( int i = list.count - 1; i >= 0; i-- )
Your answer
Follow this Question
Related Questions
getting element i+x from an array, looping through it 1 Answer
Help with for loop and arrays 3 Answers
C#, code stops loop prematurely 1 Answer
Unity adding element to 2D array list 2 Answers
Iterate through Generic Dictionary? 3 Answers