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

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

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

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

Может кто подскажет как правильно получать ссылку на значение?

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

СообщениеДобавлено: 05 авг 2014, 02:28
Neodrop
SerializedObject other = new SerializedObject(что там где находится) и далее, как вы и написали выше.

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

СообщениеДобавлено: 05 авг 2014, 07:59
KingPeas
Neodrop писал(а):SerializedObject other = new SerializedObject(что там где находится) и далее, как вы и написали выше.

Чего то я недопонимаю. Что означает фраза "что там где находится"?
Попробую объяснить на примере.
Есть сериализуемый объект S. Он имеет два свойства A и В. Когда я в компоненте С объявляю переменную с типом S, то при отрисовке через PropertyDrawer объекта S в ссылке property.serializedObject я имею ссылку, на сколько я понимаю, на саму компоненту С. При этом свойства A и В внутри PropertyDrawer имеют property.propertyPath равными S.A и S.B соответственно. И выходит я не могу из свойства В получить прямую ссылку на А без манипуляций с property.propertyPath. А еще сложнее если создается массив объектов S.
Такое чувство что придется через регулярные выражения писать свой парсер который будет искать свойство от targetObject по указанному пути.

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

СообщениеДобавлено: 06 авг 2014, 07:13
KingPeas
сделал через парсинг строки 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;
        }