Хочу получить кол-во 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.

На чём запускалось:

  1. HP Pavilion 15 (Unity 2020.3.19f1)
  2. Macbook Pro 13 (2017) (Unity 2020.2)
  3. 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 месяца


Ответы (0 шт):