Страница 1 из 1

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

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

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

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

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

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

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

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

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

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

СообщениеДобавлено: 18 июн 2019, 15:14
KoteKotovK
1max1 писал(а):Попробуй через это https://docs.unity3d.com/ScriptReferenc ... eiver.html

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

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

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

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

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

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

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

СообщениеДобавлено: 25 июн 2019, 09:13
jetyb
Ну в общем-то случае, если мы ссылаемся на абстрактную сборку, то нельзя запомнить все ее FieldInfo, PropertyInfo, т.к. сборка может поменяться, а с ней и ее классы/свойства классов.

Почему бы не хранить адрес свойства как строку, а потом динамически на находить нужные FiledInfo
Например
"MyLibrary.MyClass.MyProperty1.Value1"
"MyLibrary.MyClass2.MyField32[56].value2"