Объекты в коллайдере 2D

114
07 декабря 2019, 10:00

Не могу разобраться как получить список объектов в коллайдере. Нюанс в том, что несколько объектов появляются одновременно и ОнТриггерИнтео регистрирует только один объект... ОнТриггерСтэй тоже как то не туда...

Answer 1

Используй вместо коллайдера что-то из overlap (сфера, коробка), например Можно создать массив и в него будут вноситься объекты нужного тебе типа

Answer 2

Спасибо всем за участие, но всё оказалось намного проще. Кое что упустил в механике движка.

private void OnTriggerStay2D(Collider2D collision)
{
    if (collision)
    {
        if (!goList.Contains(collision.gameObject))
        {
            goList.Add(collision.gameObject);
        }
    }
}

OnTriggerStay2D каждый кадр кидает в collision все объекты внутри. Их просто надо было выловить по-одному... )

Answer 3

Ваше решение тоже имеет право на жизнь, однако, не совсем оптимально. Вы ведь сами дошли уже до того, что методы коллайдера вызываются для каждого другого коллайдера.

Так почему бы вам тогда не добавлять в ваш лист объект при OnTriggerEnter2D и удалять при OnTriggerExit2D?

При это, если порядок вам не важен, вы можете использовать HashSet<T> вместо List<T>. Это несортированный набор элементов, который не может содержать дубликаты. Условно, при Add(collision.gameObject) он почти ничего не сделает, если объект в нём уже есть.

В то время, как в вашей реализации проверка goList.Contains(collision.gameObject) - приводит к обходу листа с целью поиска этого объекта. Т.е. если у вас 10 объектов и вы хотите добавить новый, то лист сначала проверит все эти десять на соответствие вашему, потом вернёт false и только потом вы добавите новый элемент, либо найдёт его в третьем слоте и вернёт true. Т.е. вы получаете множество проверок на равенство каждый кадр, даже если новых объектов нет.

Я бы предложил вот такой вариант:

HashSet<GameObject> _objInCollider = new HashSet<GameObject>();
void OnTriggerEnter2D(Collider2D collider)
{
    _objInCollider.Add(collider.gameObject);
}
void OnTriggerExit2D(Collider2D collider)
{
    _objInCollider.Remove(collider.gameObject);
}

Однако, из-за того, что HashSet<T> список не сортированный к его элементам нельзя обращаться через индекс, как к листу, а нужно работать со всем множеством через Enumerator, например, используя цикл foreach:

void Do()
{
    foreach(var item in _objInCollider)
    {
        //Сделать что-то с item
    }
}
READ ALSO
Передать из 1 viewmodel значения во вторую

Передать из 1 viewmodel значения во вторую

Использую WPF и паттерн MVVMХочу передать из одной viewmodel в другую значения(допустим текст)

142
Запись данных в объект класса с формы DataGridView

Запись данных в объект класса с формы DataGridView

Подскажите пожалуйста как записать данные в объект класса в формы DataGridViewМне нужно считать все строки с формы для дальнейшей сериализации

125
Конструктор форм не видит базовый класс

Конструктор форм не видит базовый класс

Имеется базовый класс для формы и собственно форма, которая его наследует:

138
Посчитать количество итераций цикла do while

Посчитать количество итераций цикла do while

Подскажите, пожалуйста, как посчитать количество итераций цикла do while с помощью Roslyn? Нужен семантический анализатор, который бы определял...

117