Unity пересоздает объекты, но не обновляет ссылки

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Unity пересоздает объекты, но не обновляет ссылки

Сообщение recstazy 21 июл 2019, 07:52

Здравствуйте.

Беспокоит одна проблема уже давно, но я ее избегал)

Пример:
2 сцены: одна с меню, другая игровая.
Из меню загружаю игровую сцену в single mode, играю, выхожу в меню, захожу снова и ссылки, которые висят в редакторе, все ещё есть, но объекты, к которым они обращаются уже удалены при выгрузки сцены в прошлый раз, соответственно Missing Reference Exception.
Те ссылки, которые кэшируются в Start, пропадают таким же образом, потому что (интересно, почему), Start второй раз не вызвался при второй загрузке сцены.
Может кто-нибудь объясянить, что это за дичь? Не делать же всю сцену неубиваемой и не делать же аддитивной игровую сцену...

Спасибо
recstazy
UNец
 
Сообщения: 6
Зарегистрирован: 16 фев 2019, 17:53

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TheMamont 21 июл 2019, 08:23

Почитай про DontDestroyOnLoad
TheMamont
UNITрон
 
Сообщения: 198
Зарегистрирован: 21 мар 2019, 09:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение recstazy 21 июл 2019, 09:39

Еще раз) не прибегая к неубиваемости (Don't destroy on load) всех объектов в сцене, связанных ссылками редактора (получится костыль, если половина сцены не будет удаляться, который потребует другой костыль определяющий, что уже есть в сцене, а что нет, это называется говнокод).

Почему ссылки в сцене слетают при переинстанциироввнии объектов при повторной загрузке сцены, если в самой сцене указано, на какие объекты ссылки должны указывать?
почему они указывают на объекты, которые были в сцене еще при прошлой загрузке, если сцена была выгружена и загружена снова?
Почему Start не вызыввется второй раз?

P.s. Пример: пропадает ссылка на UI.ViewPort, на который ссылается ScrollView, это нативный ui юнити и он отваливается. Предложите не удалять его при переходе обратно в меню из игровой сцены?
recstazy
UNец
 
Сообщения: 6
Зарегистрирован: 16 фев 2019, 17:53

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TheMamont 21 июл 2019, 10:40

recstazy писал(а):Еще раз) не прибегая к неубиваемости (Don't destroy on load) всех объектов в сцене, связанных ссылками редактора (получится костыль, если половина сцены не будет удаляться, который потребует другой костыль определяющий, что уже есть в сцене, а что нет, это называется говнокод).

Почему ссылки в сцене слетают при переинстанциироввнии объектов при повторной загрузке сцены, если в самой сцене указано, на какие объекты ссылки должны указывать?
почему они указывают на объекты, которые были в сцене еще при прошлой загрузке, если сцена была выгружена и загружена снова?
Почему Start не вызыввется второй раз?

P.s. Пример: пропадает ссылка на UI.ViewPort, на который ссылается ScrollView, это нативный ui юнити и он отваливается. Предложите не удалять его при переходе обратно в меню из игровой сцены?

Попробуй сделать префабы всех своих объектов. А если уже в префабах то попробуй давать ссылки на префабы, а не объекты со сцены.
TheMamont
UNITрон
 
Сообщения: 198
Зарегистрирован: 21 мар 2019, 09:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение recstazy 23 июл 2019, 05:18

Все еще звучит, как костыль) хорошо, спасибо)
recstazy
UNец
 
Сообщения: 6
Зарегистрирован: 16 фев 2019, 17:53

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TheMamont 23 июл 2019, 15:08

recstazy писал(а):Все еще звучит, как костыль) хорошо, спасибо)

Отпишись потом,как оно.
TheMamont
UNITрон
 
Сообщения: 198
Зарегистрирован: 21 мар 2019, 09:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение AngryCat 23 июл 2019, 17:27

recstazy писал(а):Все еще звучит, как костыль) хорошо, спасибо)

то что ты делаешь это костыль. А это адекватный способ.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение recstazy 03 авг 2019, 17:28

В общем, я уже сделал специальный контейнер со ссылками на все объекты, к которым нужны ссылки через редактор. Я сделал, чтобы при передаче ссылки он проверял на null и искал объект поновой через GameObject.Find(), но после перезагрузки сцены, он почему-то думает, что объект всё еще существует (ссылка не null) и не ищет его заново, однако при обращении к полученной "проверенной" моим референс менеджером ссылке (проверка производится прямо при передаче ссылки), я получаю Missing reference exception, ругается что объект удален, а я ссылку к нему дергаю.
Кэширую ссылку через OnEnable, чтобы оно вызывалось во второй раз после перезагрузки сцены.

Бомбит так, что стул прожгло уже.

По поводу костыля:
хорошо, давайте представим, что я пытаюсь делать это через инстанциирование из префаба:
-объект находится в канвасе, это ведь нативный scrollView
-объект, который хочет с ним взаимодействовать - просто в иерархии вне канваса.
-мне что создать префаб, который содержит в себе практически все объекты на сцене, или что?

скрин:
https://drive.google.com/file/d/1NBAK5J ... sp=sharing
recstazy
UNец
 
Сообщения: 6
Зарегистрирован: 16 фев 2019, 17:53

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение recstazy 05 авг 2019, 06:09

Сделал вчера, чтобы ссылки на объекты не ккшировались в классах, а через свойство дёргались из референс менеджера. Заработало. Но утром пришла в голову идея фикс. Есть подозрение, что ссылки Теряются только между объектами, у которых нет общего парента. Надо попробовать все объекты в иерархии повесить на один пустой рут. Как проверю - отпишу)
recstazy
UNец
 
Сообщения: 6
Зарегистрирован: 16 фев 2019, 17:53

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение recstazy 23 авг 2020, 21:09

Дело было давно и я забыл тогда отписать. Ответ был простым: я рукожоп. Мы юзали у себя UniRX и я просто не знал, что надо отписываться от потоков и диспозить их. Объекты в памяти оставались и сборщик их не собирал. Впредь перед тем, как материть юнити, я ищу проблему в своем коде. Простите и спасибо за попытки помочь.
recstazy
UNец
 
Сообщения: 6
Зарегистрирован: 16 фев 2019, 17:53

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Razor89 15 июн 2021, 21:34

Шел 2к21 год, проблема все еще актуальна!
После перезагрузки сцены, а именно использование метода UnloadSceneAsync а следом за ним LoadSceneAsync с параметром additive, ссылки на обьекты чудесным образом пропадают в префабах сцены где они были кешированы вручную(в моем случае визуально их видно, а при попытке доступа к ним редактор пишет фигу), а именно я сделал массив List, напихал туда 10 префабов GameObject*а вручную, ссылки на которые пропадают после перезагрузки сцены. Если попробовать вызвать List.Count, вернет кол-во из массива в памяти сцены который был до перезагрузки самой сцены, то есть оно ссылается на массив в памяти, которого фактический уже не должно быть. Чтоб закрепить: если выдеррнуть из массива List несколько обьектов (сделать Remove) и потом перезагрузить сцену, оно блин вернет кол-во из того же массива в памяти(который по какой то причине не был уничтожен при UnloadSceneAsync втф), а не из массива который должен был создаться заново вместе с перезагрузкой сцены.(допустим если изначально я запихал туда 11 gameobject, то и после перезагрузки оно должно показывать в List.Count = 11 а не 7, которые оставались до перезагрузки сцены, но оно показывает 7 Карл...а визуально их 11 в редакторе, это никакие не static классы, обычный класс MonoBehaviour который висит на UI и который должен пересоздаваться вместе со сценой каждый раз) Оно продолжает ссылаться на уже несуществующий массив в памяти. Полный бред. Соответственно ничего в таких условиях правильно работать не будет. Как с этим бороться я понятия не имею. Кроме тупых костылей, которые будут только мешать в проекте.
ps Ах да, в моем случае это все тоже происходит внутри объекта канваса, то есть в его дочернем обьекте, не знаю, может быть это важно. Еще ошибок никаких не пишет, но если попытаться взять Last обьект из массива, ничего не произойдет.
Версия этого недоразумения 2020.3.11f1 а еще на этой чудесной версии, если изменить скрипт, но не выключить play mode, то получите зависание которое может длится до 5-10 минут, то есть можно сразу ребутать юнити и заново запускать. По крайне мере у меня так происходит, которая самая что ни на есть актуальная версия для 2к21 года LTS. Лучше нее юнитеки еще не предложили ничего в формате LTS и которая по идее не должна так баговать априори.
Как можно такое в продакшн выпускать, с такими косяками в памяти...это ладно еще у меня проект дорелизный, и в случае чего можно релиз перенести, а если это произойдет в проекте где апдейт уже выкатывать надо со дня на день, там вообще чокнуться можно, либо не называйте версию LTS, на нее уже кучу багов на оф форуме отрепортили, такого давно не было в истории юнити. Но, в случае с этим конкретным багом, я подозреваю, что его не фиксили с 2019.
Razor89
UNец
 
Сообщения: 14
Зарегистрирован: 15 июн 2014, 18:08

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Alkos26Rus 16 июн 2021, 00:16

Какие то прям чудеса происходят. Если что то подобное происходит, нужно отбросить возможность именно твоей ошибки, а то многие так пишут, а потом оказывется что сами накосячили. Создай пустой проект и повтори условия этого бага, если баг в наличии, значит проверь то же самое в другой версии юнити, если в другой версии этот баг пропал, то значит проблема в нынешней версии и остается только ждать обновления с фиксом, либо откатываться на старую версию, если есть бэкапы, вродеж логика простая. Можешь добавит промежуточную сцену, может баг пропадет.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Razor89 16 июн 2021, 01:19

Alkos26Rus писал(а):Какие то прям чудеса происходят. Если что то подобное происходит, нужно отбросить возможность именно твоей ошибки, а то многие так пишут, а потом оказывется что сами накосячили. Создай пустой проект и повтори условия этого бага, если баг в наличии, значит проверь то же самое в другой версии юнити, если в другой версии этот баг пропал, то значит проблема в нынешней версии и остается только ждать обновления с фиксом, либо откатываться на старую версию, если есть бэкапы, вродеж логика простая. Можешь добавит промежуточную сцену, может баг пропадет.

Это конечно все интересно, что вы предлагаете. Только если проект уже настроен под определенную версию, может быть сложно откатываться на какую либо другую версию Unity, даже если там этого бага нет. Если мы говорим не о прототипе а о полноценном большом проекте, такими переносами можно месяцами заниматься в случае с масштабным проектом. Кроме обновленного API, как правило еще много других компонентов проекта приходится настраивать под конкретную версию движка. Между версией с LTS и любой другой версией обычно очень много разного. С ваших слов все просто, но на деле это может быть баг который воспроизводится только в конкретном проекте и появляется в проекте только при определенных условиях. И если попробовать воспроизвести в пустом проекте, вполне возможно будет работать. Не всегда логическую цепочку бага можно так вот просто отследить. Особенно когда мы говорим о работе с памятью. И я написал только с той целью, чтобы это прокомментировали люди которые возможно столкнулись с чем то подобным.
Я не думаю, что есть какая то вероятность моей ошибки, и на это есть весомые аргументы. Потому что скрипт с кешированными префабами находится в одной сцене, и я эту сцену выгружаю и загружаю обратно, после этого баг появляется. Ничего другого в проекте не происходит, что могло бы хоть как то повлиять на этот скрипт извне. Перед тем как писать, я 10 раз перепроверил и задебажил все, что мог. Я по пунктам в дебаге знаю, в какой момент ссылка на массив пропадает. И это действительно чудеса, те, кто в них не верил, рано или поздно с ними сталкиваются :))
И вероятно этот баг связан с канвасом и его дочерними объектами, что-то неведомое происходит иногда с объектами которые являются дочерними какому либо канвасу когда их спавнишь динамический, это я замечал и ранее. Воспроизвести трудно зачастую, но иногда что то случается неведомое. Думаю это все из за работы с памятью, так или иначе. Возможно сборщик мусора как то задействован.
Razor89
UNец
 
Сообщения: 14
Зарегистрирован: 15 июн 2014, 18:08

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение DbIMok 16 июн 2021, 13:48

так если вы уверены, все продебажено и понятно, набросайте простой воспроизводящий примерчик, мы тоже на него посмотрим, возможно что-то подскажем. не хотите нам показывать, отправьте его в багтрекер, чтобы вам сказали, что вы делаете не так, либо что это их ошибка и они ее исправят. а вот, так, на словах описать проблему - хз кто виноват, юнити или ваш код.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Razor89 17 июн 2021, 20:54

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

Не получится такой примерчик сделать, как я писал выше, это происходит из за работы с памятью. И чтобы воспроизвести все действия с памятью нужно фактический еще один большой проект делать, у меня нет на это времени. Я попробовал сделать небольшой пример, там все работает, но это не о чем не говорит от слова - совсем. Вы же понимаете, что память на участки делится, и все инструкции распределены на более низком уровне, и четко отследить какое конкретно действие в памяти способствует результату когда кешированная ссылка в юнити теряется и начинает вести на несуществующий массив, чтоб такое воспроизвести в другом проекте и точно отследить саму последовательность действий работы с памятью, нужно выполнить огромное кол-во действий, и это отдельная долгая работа, ну это очень сложно. С моей стороны я сделал все возможное как непосредственный разработчик проекта, и на уровне юнити я знаю в какой момент конкретно в моем проекте ссылки теряются. Так-же зафиксировал, что никаких действий извне не происходит, которые как то влияют на это. Сам факт того, что это происходит зафиксирован. С этим могут не столкнутся подавляющее большинство других разработчиков, потому что скорее всего тут речь идет об определенных условиях, которые в один момент совпадают, что-то происходит, и ссылки теряются на референсы. Вот и все, как я это вижу.
На самом деле у меня нет времени всем этим занматься и что-то тестировать, узнавать. Конкретно в моем случае скорее всего я поменяю реализацию с обычного класса на реализацию со scriptable object, и сделаю все это статичным в памяти насколько возможно, да и все. Но, интересно, вдруг еще у кого то подобное бывало.
Razor89
UNец
 
Сообщения: 14
Зарегистрирован: 15 июн 2014, 18:08

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25