リストをループで回している中で、そのリストの要素を削除する場合は、ループを逆順で回しましょう。
NG
for (int i = 0; i < enemyList.Count; i++) {
if (!enemyList[i].IsAlive) {
enemyList.RemoveAt(i);
}
}
OK
for (int i = enemyList.Count - 1; i >= 0; i--) {
if (!enemyList[i].IsAlive) {
enemyList.RemoveAt(i);
}
}
なぜ逆順にしなければならないのか?を示したものが以下の図になります。NG側では、要素C
を削除した際に後ろにある要素が一つ前に詰められる影響で、要素D
が正しく処理されない問題が発生しています。
ちなみに、リストの要素を削除したいけどループ中に処理する必要はない時にはRemoveAll
が便利です。
enemyList.RemoveAll(enemy => !enemy.IsAlive);
#参考リンク