Комбинация GUI и GUILayout в редакторе Unity3D
Имею окошко EditorWindow для задания сложного свойства во всплывающем диалоге. Проще говоря храню в строке путь к объекту по иерархии, со ссылкой на компоненты и далее к конкретному свойству. Все это выглядит вроде как Path в WPF, типа такого:
O:+/S:MyScript/V:MyInt - найти в потомках первый объект с MyScript и получить свойство MyInt
O:*{-1,0,1}/V:MyList[0,3,7] - найти в иерархии (родитель, у себя, первый уровень потомков) скрипт такой же как у источника откуда запускается поиск и извлечь у списка MyList значения 0,3,7 элементов.
Звучит сложно, но это для общего представления. Когда щелкают по пути открывается диалоговое окошко где парсится строка и формируются области где отдельно можно указать как искать объект в иерархии, какой компонент выбрать и какое свойство следует извлечь.
Само окно содержит сериализуемые свойства, которые я вывожу при помощи PropertyDrawer при формировании интерфейса. Для удобства интерфейс окна формируется через EditorGUILayout, поскольку диалог получается большой, содержит сворачиваемые области, списки, при выборе из вариантов одни области скрываются, другие показываются. В общем он не статичный, а достаточно динамический. Все стараюсь рисовать максимально компактно.
И тут передо мной встала такая задача: при выборе компонента мне показывает полный путь к нему в системе, но для поиска чаще всего достаточно лишь имени класса. Но не стоит забывать, что могут быть конфликты при совпадении имен в разных namespace. Я решил не мудрить и сделать в окне доп свойство которое через чекбокс позволит пользователю самому указать надо полный путь класса показывать или только название.
Хочется сделать все в одной строке. чекбокс + поле для выбора компонента. Но GUILayout при форматировании сам распределяет позиции полей и выравнивает их относительно некоторых расчитанных им колонок. и получается что между чекбоксом и полем редактирования из за других полей много свободного места. Вот нарисовал в фотошопе как это выглядит
Кто-то знает как комбинировать GUILayout и вывод через GUI по заданным позициям? На сколько я понимаю надо сделать два действия:
- Выделить область в GUILayout для отрисовки элемента
- Определить RECT области внутри отрисовки диалога и туда своими силами вывести в нужном виде свои поля
У EditorGUIUtility есть свойство fieldWidth, которое позволяет узнать ширину области отрисовки диалога, но вот как выделить область чтобы следующие за ней элементы рисовались штатно ниже того места где ты сам отрисовался, а также как узнать Y для Rect в GUI я не знаю.
У меня есть идея как это реализовать, сделать еще одну структуру и для нее реализовать PropertyDrawer, который будет внутри себя рисоваться Через GUI. А дальше уже без всяких заморочек при помощи EditorGUILayout.PropertyField() внутри диалога. Но тут уже скорей спортивный интерес, можно ли встраивать внутри EditorGUILayout свои кастомные поля в OnGUI, или я много хочу?
Ответы (1 шт):
Как подсказал @Yaroslav, можно воспользоваться
BeginHorizontal/EndHorizontal и GUILayout.Width(40) аки GUILayoutOption на чекбокс, вот и всё...
Это работает если выводить чекбокс без метки, с меткой получается немножко странновато, один контрол на другой накладывается
Может еще что-то из опций надо применять?