После компиляции отчищаются все ссылочные типы

Программирование на Юнити.

После компиляции отчищаются все ссылочные типы

Сообщение KoteKotovK 18 июн 2019, 03:39

Доброго времени суток. Вопрос заключается в том, как запомнить ссылочный тип, если его физически нельзя сериализовать заранее? Мне нужно запомнить тип переменной записав этот тип в базу данных, но каждый раз после компиляции все подобные переменные сбрасываются на null. Как я понимаю, когда все скрипты заново компилируются, они назначают стандартные значения этим переменным, а стандартное значения для любых не сериализованых заранее ссылок - null. Это происходит даже с кастомным типом, если не добавлять атрибут [System.Serializable], после каждой компиляции он отчищается. Что же делать в таком случае?
KoteKotovK
UNITрон
 
Сообщения: 267
Зарегистрирован: 20 июн 2014, 06:41

Re: После компиляции отчищаются все ссылочные типы

Сообщение ~AvA~ 18 июн 2019, 08:41

Привет, если бы это была общая проблема, о ней давно знали бы, логично?
То есть, или ты делаешь что-то неправильно, либо столкнулся с каким-то граничным случаем.. может код нам поможет понять, что ты там пытаешься сделать. Какой тип ты там собрался сохранять и вот это вот всё ;-0
Аватара пользователя
~AvA~
UNIверсал
 
Сообщения: 396
Зарегистрирован: 17 фев 2015, 13:09

Re: После компиляции отчищаются все ссылочные типы

Сообщение KoteKotovK 18 июн 2019, 14:22

~AvA~ писал(а):Привет, если бы это была общая проблема, о ней давно знали бы, логично?
То есть, или ты делаешь что-то неправильно, либо столкнулся с каким-то граничным случаем.. может код нам поможет понять, что ты там пытаешься сделать. Какой тип ты там собрался сохранять и вот это вот всё ;-0

Тут разговор не совсем о коде. Я не допускаю каких-то глобальных ошибок, просто любые не сериализованные классы, в моём случае это класс FieldInfo из System.Reflection и, например, класс Type из System, всегда очищаются, ведь они не являются сериализованными классами по своей сути. И ещё, я забыл написать, что всё это я делаю для редактора, довольно странно говорить о компиляции скриптов в игре. И вот, для редактора у меня существует мой кастом инспектор, где я беру данные из нужных мне объектов сцены и пытаюсь их запомнить. Всё что мне нужно, это запомнить FieldInfo и добавить его в мой ScriptableObject для данных редактора, пока что это самый удобный вариант. И вот мы подошли к проблеме. Суть в том, что я могу сохранить саму переменную FieldInfo, ведь это ссылка на поле в C# скрипте, это не ссылка на объект сцены, даже чтобы использовать FieldInfo.GetValue или SetValue, нам нужно указать ссылку на объект. И прекрасно то что всё сохраняется, но до поры до времени. После изменений в скриптах, притом в любых, ведь компилируются все сразу, всё отчищается. Весь массив FieldInfo становится null, ну или даже просто переменная FieldInfo, или переменная Type. Такую же учесть ждет и ваш класс, если вы не пропишите перед его объявлением атрибуту System.Serializable, это решит проблему, но как решить это проблему с другим недоступным для редактирования классами, мне не понятно. Есть вариант запоминать не весь FieldInfo, а только имя поля и имя типа в string (после чего сам тип можем получить через Type.GetType("Имя Типа")), а иначе после компиляции опять потеряем ссылки. Но это вариант выглядит сильно костыльно, но походу иначе никак.
KoteKotovK
UNITрон
 
Сообщения: 267
Зарегистрирован: 20 июн 2014, 06:41

Re: После компиляции отчищаются все ссылочные типы

Сообщение 1max1 18 июн 2019, 14:34

Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: После компиляции отчищаются все ссылочные типы

Сообщение KoteKotovK 18 июн 2019, 15:14

1max1 писал(а):Попробуй через это https://docs.unity3d.com/ScriptReferenc ... eiver.html

Да, я уж подумал это решение, но увы нет. Проблема в том, что переменная FieldInfo является абстрактной, но это полбеды. Если мы назначим переменную FieldInfo через Type.GetField("Имя поля"), после чего возьмем тип этого же FieldInfo (он должен вернуть верхний класс его наследующий) он возвращает какой-то небывалый System.Reflection.MonoField, который вообще нельзя использовать как переменную. Замкнутый круг, даже если я как-то иначе запомню информацию FieldInfo, я не смогу назначить его, ведь он абстрактен, а само поле, тип MonoField, вообще для Unity не существует. Грусть, тоска.
KoteKotovK
UNITрон
 
Сообщения: 267
Зарегистрирован: 20 июн 2014, 06:41

Re: После компиляции отчищаются все ссылочные типы

Сообщение ~AvA~ 18 июн 2019, 17:22

Можешь попробовать рассказать чуть больше о том, что ты пытаешь сделать :)
Может можно обойтись вообще без сохранения FieldInfo, сделай свой класс, в котором будешь хранить данные, который вытащишь с помощью FieldInfo.
Или можно сделать по-другому, ты же вызываешь код, который вытаскивет эту инфу первый раз, вызывай каждый раз когда происходит домен рилоуд (после него все значения переменных теряются).
Можешь сюда глянуть или в update проверять если твоя переменная null, обновить всё (вытащить данные заново), ну или не в update а, каждый раз когда происходит обращение к этим данным..
Аватара пользователя
~AvA~
UNIверсал
 
Сообщения: 396
Зарегистрирован: 17 фев 2015, 13:09

Re: После компиляции отчищаются все ссылочные типы

Сообщение KoteKotovK 19 июн 2019, 06:37

~AvA~ писал(а):Можешь попробовать рассказать чуть больше о том, что ты пытаешь сделать :)
Может можно обойтись вообще без сохранения FieldInfo, сделай свой класс, в котором будешь хранить данные, который вытащишь с помощью FieldInfo.
Или можно сделать по-другому, ты же вызываешь код, который вытаскивет эту инфу первый раз, вызывай каждый раз когда происходит домен рилоуд (после него все значения переменных теряются).
Можешь сюда глянуть или в update проверять если твоя переменная null, обновить всё (вытащить данные заново), ну или не в update а, каждый раз когда происходит обращение к этим данным..

Я хотел сделать отрисовку переменных в совокупности с System.Reflection и кастонмным инспектором, притом что бы вся визуализация настраивалась прямо из окна самого инспектора. Захотел себе int слайдер, поставил галочку что это слайдер, назначил две инт переменные (min, max) и работаешь теперь со слайдером. Зачем System.Reflection? Есть и другие варианты, тот же PropertyField, но проблема в том, что они не видят и не знаю о существовании наследуемых классов, например, мы можем назначить абстрактный класс на какой-нибудь другой, наследующий его класс, и рефлексия достанет из этого типа все переменные, совершенно все, даже те, что идут неявно сверху, вроде больше никто так не может сделать. Основная цель была - уменьши количества используемых классов для игры, но для этого пришлось бы написать новую отрисовку через кастом инспектор или кастом едитор виндов, долго это всё. И вот информация о полях мне нужна была, чтобы помнить как кто отображается, кто просто как обычное поле, кто как слайдер, кто ещё как-то (там много разных функций отрисовки). Сейчас, я уже вернулся к обычным классам, наследую monobehaviour и начинаю плодить сущности, грустно, но пока что так.
KoteKotovK
UNITрон
 
Сообщения: 267
Зарегистрирован: 20 июн 2014, 06:41

Re: После компиляции отчищаются все ссылочные типы

Сообщение jetyb 25 июн 2019, 09:13

Ну в общем-то случае, если мы ссылаемся на абстрактную сборку, то нельзя запомнить все ее FieldInfo, PropertyInfo, т.к. сборка может поменяться, а с ней и ее классы/свойства классов.

Почему бы не хранить адрес свойства как строку, а потом динамически на находить нужные FiledInfo
Например
"MyLibrary.MyClass.MyProperty1.Value1"
"MyLibrary.MyClass2.MyField32[56].value2"
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21


Вернуться в Скрипты

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

Сейчас этот форум просматривают: Google [Bot] и гости: 8