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

Отображение SerializedProperty нужного типа в Inspector

СообщениеДобавлено: 02 сен 2016, 23:00
maxim738
Если кратко - то нужно для object(System.Object) переменной (для которой точно известен тип, он точно сериализуем в юнити, например Rect, Vector3, int + свои Serializable классы) создать SerializedProperty(главное - вызвать PropertyDrawer.OnGUI для этого типа), отрисовать в GUI(это-то я знаю как) и применить значение обратно в object.
Как я понял, в лоб это не возможно, тк SerializedProperty закреплён за SerializedObject, да и восстановить без парса исходную переменную из SerializedProperty невозможно. Буду рад, если ошибаюсь. Суть в том ,что пишу систему Event`ов, подобных UnityEvent, но с произвольным кол-вом аргументов в методе. Система завязана на рефлексии. И параметры вызываемого метода сложены в два листа - Object(для юнитевских ссылочных типов) и object(для всех остальных Serializable типах). на самом деле у меня структура сложнее, тк созданы обёртки для того, чтобы юнити хранила мета-данные(написаны сериализуемые обёртки для Type, MethodInfo, object(только для Serializable)) и индексы положения аргумента.
Изображение
И с выводом произвольного кол-ва UnityEngine.Object переменных нужного типа сложностей нет. Причём всё сериализуется посредством юнити, Всё вызывается, методы ищутся и отрисовывается popup аналогично UnityEvent
Изображение
+ возможен вывод родительских методов.
Изображение
В общем максимум, что могу сдлеать для таких типов - это вывод стандартных int, float, bool, string и тп через перебор, а вот, что делать с другими Serializable классами - не знаю. [curved_hands] Есть какие идеи?

Re: Отображение SerializedProperty нужного типа в Inspector

СообщениеДобавлено: 02 сен 2016, 23:48
maxim738
Вообще я вижу такие выходы:
1. Забить на нессылочный тип переменных, принимать только стандартные int, string и тп. Так и сделали юнитехи в UnityEvent
2. Через Activator создавать нужный экземпляр, и через рефлексию отрисовывать все переменные в соответствии с юни-атрибутами (SerializeField,HideInInspector) и тп. Но PropertyDrawers не будут работать, т.е красивые внешние виды сбросятся. Сериализация будет происходить в оболочке над object , где работает UnityJsonUtility.
3. Сделать ссылку на поле нессылочного(какбы, в инспекторе) типа в другом или этом скрипте.
Не знаю, в общем что делать, костыли городить тоже не хочется, но видимо придётся..

Re: Отображение SerializedProperty нужного типа в Inspector

СообщениеДобавлено: 03 сен 2016, 00:12
seaman
Видимо уже поздно, т.к. проблемы не понял.
Выводим значение переменной
Синтаксис:
Используется csharp
var targetObject = property.serializedObject.targetObject;
var targetObjectClassType = targetObject.GetType();
var field = targetObjectClassType.GetField(property.propertyPath);
if (field != null)
{
       var value = field.GetValue(targetObject);
       Debug.Log(value.s);
}

Выводим имя (полное)
Синтаксис:
Используется csharp
Debug.Log(property.propertyPath);

Выводим тип:
Синтаксис:
Используется csharp
using System;
...
Debug.Log(Enum.GetName(property.propertyType));

Тип - любой из этих: http://docs.unity3d.com/ScriptReference ... yType.html

Re: Отображение SerializedProperty нужного типа в Inspector

СообщениеДобавлено: 03 сен 2016, 00:14
seaman
Вот еще нашел набор полезных методов:
https://github.com/lordofduct/spacepupp ... rHelper.cs