List заполняется неправильно и очищается сам по себе
(это описание тестирования проблемы, задаю вопрос с разных форумов Q&A: cyberforum и stackoverflow. Вопрос на киберфоруме (с чего все началось).)
Создаете 3 объекта: button, на котором будет висеть скрипт объявления объекта (wirePref):
public class Test : MonoBehaviour
{
public RectTransform wirePref;
public async void V()
{
RectTransform wire = Instantiate(wirePref, new Vector2(), Quaternion.identity, transform);
wire.anchoredPosition = new Vector2(282.48f, 83.6f);
await Task.Delay(3000);
V1(wire);
await Task.Delay(3000);
}
public void V1(RectTransform wire)
{
List<Collision2D> cols = wire.GetComponent<ScriptCTW>().collisions;
cols.ForEach(col => print(col.collider.name));
wire.GetComponent<ScriptCTW>().basesCollision.ForEach(col => print(col.name));
}
}
и создаем еще 2 объекта под button (button - родитель для этих 2 объектов) с твердым телом и коллайдером:

Они должны располагаться так, чтобы объект
public RectTransform wirePref;
, создавшись, соединял эти 2 объекта и касался их. На созданном объекте должны быть такие же твердое тело (kinematic), коллайдер и его скрипт:
public class ScriptCTW : MonoBehaviour
{
public List<Transform> basesCollision = new List<Transform>();
public List<Collision2D> collisions = new List<Collision2D>();
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.CompareTag("Base"))
{
basesCollision.Add(collision.transform);
collisions.Add(collision);
}
}
}
Итак, нажимаем на button, запускается функция V
public async void V()
. Все. Функция V1 выведет на экран сначала имя последнего объекта 2 раза (так не должно быть)
cols.ForEach(col => print(col.collider.name))
, а затем имена двух объектов (это правильно)
wire.GetComponent<ScriptCTW>().basesCollision.ForEach(col => print(col.name));
Смотрел, что происходит в отладке, когда запускается метод OnCollisionEnter2D. Когда то collisions пустой, когда то нет, но в любом случае при распаковке collisions в методе V1
cols.ForEach(col => print(col.collider.name));
всегда выводит только имя того объекта, с которым столкнулся wirePref в последний раз, и выводит столько раз, сколько объектов, с которыми wirePref столкнулся (пример выше).
Ответы (1 шт):
Только что решил проблему. Когда запускается OnCollisionEnter2D, переменная collision просто присваивает себе новое значение. Я добавлял эту переменную в список, а так как это класс, то в списке эта переменная тоже заменит значение. Сделал класс, хранящий в себе те свойства Collision2D, которые мне нужны. Вопрос закрыт.
