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, которые мне нужны. Вопрос закрыт.

→ Ссылка