При каких условиях Unity может удалить объект / обнулить указатель?

#c# #unity3d

#c# #unity3d

Вопрос:

Недавно я получаю (по-видимому, случайные) исключения MissingReferenceExceptions и NullReferenceExceptions. Мне удалось сузить его до двух пропавших переменных (плюс любые другие ссылки на их содержимое).

Я дважды проверил все строки, которые ссылаются на эти переменные, ни одна из них ничего не удаляет или не обнуляет. Я также проверил места, куда экранируются значения, но это не должно иметь большого значения, поскольку c # собирает мусор (в любом случае, они тоже ничего не удаляют). Кстати, эти объекты создаются с помощью new , и они не являются ни GameObjects, ни MonoBehaviours (но один из них представляет собой список, содержащий MonoBehaviours ). На них не ссылаются переменные экземпляра MonoBehaviours, которые также уничтожаются. Конечно, на них все еще ссылаются другие переменные экземпляра, в противном случае исключение не могло быть выдано.

Хорошо, я не вставляю свои 3000 строк кода. Кроме того, я не спрашиваю, где ошибка, а скорее как ее искать: при каких условиях unity удаляет объекты / нулевые ссылки на них?

 NullReferenceException: Object reference not set to an instance of an object
        Level.WipeMoveable (Boolean keepAvailable) (at Assets/scripts/Level.cs:220)
        Level.HandleRightClick (UnityEngine.GameObject clicked) (at Assets/scripts/Level.cs:184)
        Selectable.OnClick (Int32 button) (at Assets/scripts/Selectable.cs:35)
        Clickable.ButtonReleased (Int32 button) (at Assets/scripts/Clickable.cs:35)
        Clickable.OnMouseOver () (at Assets/scripts/Clickable.cs:56)
  

Ожидаемый результат — это объекты и ссылки, оставшиеся нетронутыми, фактический результат — NullReferenceExceptions и MissingReferenceExceptions (иногда; большую часть времени я получаю ожидаемый результат)

Комментарии:

1. очевидные ответы: либо он никогда не был установлен, либо он был уничтожен. или в случае щелчка может случиться так, что событие onclick никогда не проверялось, чтобы ничего не произошло

2. Он был установлен, я проверил это, и он был уничтожен / обнулен. Я спрашиваю, как я могу найти место, где он был уничтожен. И вопрос в том, что это смехотворно долго, потому что иначе мне не разрешили бы его опубликовать

3. Вы могли бы добавить к нему ondestroy, чтобы увидеть, когда он будет вызван, но не можете помочь без кода и возможностей воспроизведения, только вы можете видеть свой код, поэтому без представления о том, что это за вещь и что вы могли бы с ней сделать .. может быть, она уничтожается и остается поверх вещей, которые обрамляютпопробуйте получить к нему доступ, кто знает..

4. сделал это и получил единственную строку трассировки стека, содержащую только финализацию. (пока не удалось снова уничтожить MonoBehaviour)

5. Привет. Unity уничтожит UnityEngine. Объект в следующих случаях: 1) Destroy /DestroyImmediate вызывается непосредственно для этого объекта. 2) Это компонент GO, и GO был уничтожен. 3) Родительский GO был уничтожен 4) Была загружена другая сцена (не вызывающая привыкания).