Получить из SeriliazedProperty ссылку на другое свойство

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

Получить из SeriliazedProperty ссылку на другое свойство

Сообщение KingPeas 04 авг 2014, 10:15

Собственно вопрос следующий. У меня при отрисовке PropertyDrawer в Editor используется значение из другого свойства этого же объекта. Хочется извлечь из этого второго свойства значение и использовать в работе.
К примеру свойство В доступно для редактирования только тогда когда свойство А установлено в истину.
Синтаксис:
Используется csharp
propB = property.serializedObject.FindProperty("PropA");

но к сожалению такая штука не работает когда свойства находится в сериализуемом объекте а тот является переменной или массивом в Component.

Может кто подскажет как правильно получать ссылку на значение?
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ...
Мой первый плагин PropertyDrawerCollection
Аватара пользователя
KingPeas
UNIт
 
Сообщения: 78
Зарегистрирован: 12 сен 2012, 12:34
Откуда: Новосибирск
Skype: evgeniygurlev
  • Сайт
  • ICQ

Re: Получить из SeriliazedProperty ссылку на другое свойство

Сообщение Neodrop 05 авг 2014, 02:28

SerializedObject other = new SerializedObject(что там где находится) и далее, как вы и написали выше.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Получить из SeriliazedProperty ссылку на другое свойство

Сообщение KingPeas 05 авг 2014, 07:59

Neodrop писал(а):SerializedObject other = new SerializedObject(что там где находится) и далее, как вы и написали выше.

Чего то я недопонимаю. Что означает фраза "что там где находится"?
Попробую объяснить на примере.
Есть сериализуемый объект S. Он имеет два свойства A и В. Когда я в компоненте С объявляю переменную с типом S, то при отрисовке через PropertyDrawer объекта S в ссылке property.serializedObject я имею ссылку, на сколько я понимаю, на саму компоненту С. При этом свойства A и В внутри PropertyDrawer имеют property.propertyPath равными S.A и S.B соответственно. И выходит я не могу из свойства В получить прямую ссылку на А без манипуляций с property.propertyPath. А еще сложнее если создается массив объектов S.
Такое чувство что придется через регулярные выражения писать свой парсер который будет искать свойство от targetObject по указанному пути.
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ...
Мой первый плагин PropertyDrawerCollection
Аватара пользователя
KingPeas
UNIт
 
Сообщения: 78
Зарегистрирован: 12 сен 2012, 12:34
Откуда: Новосибирск
Skype: evgeniygurlev
  • Сайт
  • ICQ

Re: Получить из SeriliazedProperty ссылку на другое свойство

Сообщение KingPeas 06 авг 2014, 07:13

сделал через парсинг строки propertyPath.

Синтаксис:
Используется csharp
/// <summary>
        /// Поиск свойства по имени в родительских объектах начиная снизу цепи иерархии.
        /// </summary>
        /// <param name="property">свойство для которого искомое оказывается на одном уровне, либо свойством родителя от искомого.</param>
        /// <param name="name"> имя искомого свойства.</param>
        /// <returns>найденое свойство или null если свойство не удалось найти.</returns>
        public static SerializedProperty GetPropertyByName(SerializedProperty property, string name)
        {
            SerializedProperty ret = null;
            if (property == null || string.IsNullOrEmpty(name)) return null;
            SerializedObject obj = property.serializedObject;
            string path = property.propertyPath;
            string searchPath = path;
            string[] pathStep = path.Split('.');
            int skipCnt = 0;
            for (int i = pathStep.Length - 1; i >= 0 && ret == null; i--)
            {
                string step = pathStep[i];
                if (step.IndexOf('[') >= 0) skipCnt = 2;
                int idx = searchPath.LastIndexOf(step);
                if (idx > 0)
                {
                    searchPath = searchPath.Substring(0, idx);
                    if (skipCnt > 0)
                    {
                        skipCnt--;
                    }
                    else if (!string.IsNullOrEmpty(searchPath))
                    {
                        ret = obj.FindProperty(searchPath + name);
                    }
                }
            }
            if (ret == null) ret = obj.FindProperty(name);
            return ret;
        }
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ...
Мой первый плагин PropertyDrawerCollection
Аватара пользователя
KingPeas
UNIт
 
Сообщения: 78
Зарегистрирован: 12 сен 2012, 12:34
Откуда: Новосибирск
Skype: evgeniygurlev
  • Сайт
  • ICQ


Вернуться в Editor

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

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