Хочу получить кол-во GameObject'ов из List по тегу (выдает stack overflow)
Пишу ИИ для бота планеты. Существуют планеты с тегом FlatPlanet и VoidPlanet. На каждом висит скрипт:
[SerializeField] internal List<GameObject> collisionPlanetList = new List<GameObject>();
public void AddToCollisionPlanetList(GameObject go)
{
if (collisionPlanetList.Contains(go) == false) collisionPlanetList.Add(go);
}
public int CollisionCount(string tag)
{
int count = collisionPlanetList.FindAll(x => x.CompareTag(tag)).Count;
Debug.Log(gameObject.name + " включает " + count + " планет данного тега");
return count;
}
В другом месте кода, когда к планете близко подлетает другая планета, срабатывает триггер. Планеты как бы видят друг друга и в этот момент вызывается AddToCollisionPlanetList метод у обоих планет. То есть они добавляют друг друга в лист.
Разобрались. Планеты видят друг друга (записывают друг друга в лист) и все хорошо. Теперь проблема. Задача: проверять, если в листе collisionPlanetList объектов с тегом VoidPlanet больше 3 штук, то надо убегать, если меньше - атаковать. Для этого я в другом месте кода запускаю
int count = CollisionCount("VoidPlanet");
if (count > 3) // Убегать
if (count <= 3) // Атаковать
И всё. После 15 секунд игры Unity уходит в себя и этот код вызывает Stack Overflow. Если остановить Play Mode, то продолжается лог в консоли о том, что выполнена аллокация по какому-то адресу памяти. Сначала CollisionCount вызывается от 25 до 37 раз за первые 2 секунды игры (судя по Debug.Log() в этом методе, считаю в консоли сколько сообщений от него). Далее после 8 - 15 секунд игры Unity полностью зависает и ни на что не реагирует, выдавая Stack Overflow.
На чём запускалось:
- HP Pavilion 15 (Unity 2020.3.19f1)
- Macbook Pro 13 (2017) (Unity 2020.2)
- Macbook Air M1 и десктоп на Intel (Unity 2021.2.4f1)
Как я понял что именно метод CollisionCount дает ошибку? Я просто сделал так и она исчезла:
int count = 0;
if (count > 3) // Убегать
if (count <= 3) // Атаковать
Что я делал ещё (эффект тот же):
public int CollisionCount(string tag)
{
int count = 0;
foreach (var item in collisionPlanetList.ToArray())
{
if (item.CompareTag(tag)) count++;
}
Debug.Log(gameObject.name + " включает " + count + " планет данного типа");
return count;
}
Всего 10 планет имеют скрипт, который запускает CollisionCount("VoidPlanet") (он запускается почти каждый раз, когда запускается AddToCollisionPlanetList(). На старте игры он запускается одновременно у всех планет, так как на старте они близко к друг другу и одна планета видит на старте от 1 до 3 планет вокруг). Мне надо что бы все боты могли знать про других ботов поблизости и чтобы я мог их отфильтровать по тегу. Решение CollisionCount(string tag) мне очень нравится, но почему оно не работает? Помогите, проблеме уже 3 месяца