Затравка. Есть у нас gameObject на сцене. На нем висят какие то компоненты, всё это крутится и работает. Красота.
Есть у нас триггер со скриптом, который отслеживает входящие gameObject и выходящие из зоны триггер коллайдера соответственно по OnTriggerEnter и OnTriggerExit. Пока gameObject в триггерной зоне каждый апдейт с ним чего то происходит. Для этого в скрипте триггерной зоны висит тупо List<GameObject> и простая переборка по итератору.
Всё крутится и работает, красота. Теперь возьмём и сделаем Destroy(gameObject). На сцене его нет. В List<GameObject> триггерной зоны остался один item который равен null. Но не совсем. Все его свойства по прежнему доступны. Если взять от него GetComponent<MyScript>() то он сработает и вернёт null у которого все поля остались на месте и с ними как ни странно можно работать.
С разработчиками связался, они говорят что уничтожение объекта в Unity не эквивалентно уничтожению объекта в С#. Что как бы с одной стороны логично, но порождает определенную проблему отслеживания что гавкнулось, а что всё ещё актуально.
Можно проверить что item==null и не обрабатывать его, не вопрос, но память не резиновая - GC её не освободит, но даже попытка вычистить все null из всех списков тратит ресурсы да и не всегда возможна.
А есть ли возможность подписаться на GameObject.OnDestroy()? Не компонента, а именно GameObject?
Кто нибудь знает законный мануальный способ отследить событие GameObject.OnDestroy()?