Не могу разобраться как получить список объектов в коллайдере. Нюанс в том, что несколько объектов появляются одновременно и ОнТриггерИнтео регистрирует только один объект... ОнТриггерСтэй тоже как то не туда...
Используй вместо коллайдера что-то из overlap (сфера, коробка), например Можно создать массив и в него будут вноситься объекты нужного тебе типа
Спасибо всем за участие, но всё оказалось намного проще. Кое что упустил в механике движка.
private void OnTriggerStay2D(Collider2D collision)
{
if (collision)
{
if (!goList.Contains(collision.gameObject))
{
goList.Add(collision.gameObject);
}
}
}
OnTriggerStay2D каждый кадр кидает в collision все объекты внутри. Их просто надо было выловить по-одному... )
Ваше решение тоже имеет право на жизнь, однако, не совсем оптимально. Вы ведь сами дошли уже до того, что методы коллайдера вызываются для каждого другого коллайдера.
Так почему бы вам тогда не добавлять в ваш лист объект при 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
}
}
Использую WPF и паттерн MVVMХочу передать из одной viewmodel в другую значения(допустим текст)
Подскажите пожалуйста как записать данные в объект класса в формы DataGridViewМне нужно считать все строки с формы для дальнейшей сериализации
Имеется базовый класс для формы и собственно форма, которая его наследует:
Подскажите, пожалуйста, как посчитать количество итераций цикла do while с помощью Roslyn? Нужен семантический анализатор, который бы определял...