Как вы можете прочитать здесь , уничтожение объекта происходит после текущего цикла обновления.Таким образом, на самом деле объект все еще существует (и элемент списка преобразования имеет ссылку на него) в тот момент, когда вы пополняете список.Поэтому лучшим решением будет удалить ссылку на элемент из списка на
goChildren.Remove(***obj reference***)
или
goChildren.RemoveAt(***obj index***)
, а затем уничтожить игровой объект.Кроме того, нет смысла удалять и считывать неизмененные изменения, он генерирует множество ненужных модификаций массива за кулисами без причины.(Функции Remove и RemoveAt также копируют смещенную часть после удаленного элемента, что может быть огромной работой, если удаленный элемент находится в начале большого списка.)
Обратите внимание, что добавление огромного количества элементовновый список крайне неоптимален, так как массив за списком перераспределяется и копируется снова и снова.Емкость списка по умолчанию равна 4, и когда размер превышает его, он выделяет новый массив размером 8, а затем копирует содержимое.То же самое происходит с 16, 32, 64 и т. Д., Поэтому, когда вы заполняете список от 0 до 566 элементов,
- выделяет 4
- выделяет 8, копирует
- выделяет 16, копия
- 32, копия
- 64, копия
- 128, копия
- 256, копия
- 512, копия
- 1024, копия
Источник
Вы можете предварительно выделить список с помощью
List<GameObject> goChildren = new List<GameObject>(capacity);
, но этоэто просто начальный прирост производительности, попробуйте использовать
HashSet<T>
, если порядок элементов не важен.Все, что вам нужно, это хорошая функция хеширования, которая в большинстве случаев может быть легко реализована.