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

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

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

Сообщение maxim738 02 сен 2016, 23:00

Если кратко - то нужно для 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] Есть какие идеи?
Аватара пользователя
maxim738
UNец
 
Сообщения: 23
Зарегистрирован: 22 апр 2014, 19:06
Skype: maximan_klim

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

Сообщение maxim738 02 сен 2016, 23:48

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

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

Сообщение seaman 03 сен 2016, 00:12

Видимо уже поздно, т.к. проблемы не понял.
Выводим значение переменной
Синтаксис:
Используется 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
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение seaman 03 сен 2016, 00:14

Вот еще нашел набор полезных методов:
https://github.com/lordofduct/spacepupp ... rHelper.cs
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Editor

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

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