Пример #1
0
        //初始化值
        private void OnEnable()
        {
            seriObj = base.serializedObject;

            script = seriObj.FindProperty("m_Script");

            //把所有字段们缓存起来
            fields = ReflectionUtility.GetAllFields(this.target, fi => seriObj.FindProperty(fi.Name) != null);

            if (fields.All(fi => fi.GetCustomAttributes(typeof(OLiOYouxiAttribute), true).Length == 0))
            {
                //哈哈哈哈,居然没有用奥利奥特性,那就用unity的把
                useDefaultInspector = true;
            }
            else
            {
                useDefaultInspector = false;

                //来把groupedFields缓存了
                groupedFields = new HashSet <FieldInfo>(fields.Where(fi => fi.GetCustomAttributes(typeof(AGroupAttribute), true).Length > 0));

                //来把groupedFieldsByGroupName缓存了
                groupedFieldsByGroupName = new Dictionary <string, List <FieldInfo> >();
                foreach (FieldInfo groupedField in groupedFields)
                {
                    //拿到组头名字 //第一个
                    string groupName = (groupedField.GetCustomAttributes(typeof(AGroupAttribute), true)[0] as AGroupAttribute).Name;

                    if (groupedFieldsByGroupName.ContainsKey(groupName))
                    {
                        //那就加入这个组
                        groupedFieldsByGroupName[groupName].Add(groupedField);
                    }
                    else
                    {
                        //新建一个组咯
                        groupedFieldsByGroupName[groupName] = new List <FieldInfo>()
                        {
                            groupedField
                        };
                    }
                }

                //来把serializedPropertiesByFieldName缓存了
                serializedPropertiesByFieldName = new Dictionary <string, SerializedProperty>();
                foreach (FieldInfo fieldInfo in fields)
                {
                    serializedPropertiesByFieldName[fieldInfo.Name] = seriObj.FindProperty(fieldInfo.Name);
                }
            }

            //来把nonSerializedFields缓存了
            nonSerializedFields = ReflectionUtility.GetAllFields(this.target,
                                                                 fi => fi.GetCustomAttributes(typeof(ADrawerAttribute), true).Length > 0 &&
                                                                 seriObj.FindProperty(fi.Name) == null
                                                                 );

            //来把nativeProperties缓存了
            nativeProperties = ReflectionUtility.GetAllProperties(this.target,
                                                                  pi => pi.GetCustomAttributes(typeof(ADrawerAttribute), true).Length > 0
                                                                  );

            //来把methods缓存了
            methods = ReflectionUtility.GetAllMethods(this.target,
                                                      mi => mi.GetCustomAttributes(typeof(ADrawerAttribute), true).Length > 0
                                                      );
        }
Пример #2
0
        public override bool CanDrawProperty(SerializedProperty property)
        {
            ShowIfAttribute showIfAttribute = PropertyUtility.GetAttribute <ShowIfAttribute>(property);

            UnityEngine.Object target = PropertyUtility.GetTargetObject(property);

            List <bool> conditionValues = new List <bool>();

            foreach (var condition in showIfAttribute.Conditions)
            {
                FieldInfo conditionField = ReflectionUtility.GetField(target, condition);
                if (conditionField != null &&
                    conditionField.FieldType == typeof(bool))
                {
                    conditionValues.Add((bool)conditionField.GetValue(target));
                }

                MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, condition);
                if (conditionMethod != null &&
                    conditionMethod.ReturnType == typeof(bool) &&
                    conditionMethod.GetParameters().Length == 0)
                {
                    conditionValues.Add((bool)conditionMethod.Invoke(target, null));
                }
            }

            if (conditionValues.Count > 0)
            {
                bool draw;
                if (showIfAttribute.ConditionOperator == ConditionOperator.And)
                {
                    draw = true;
                    foreach (var value in conditionValues)
                    {
                        draw = draw && value;
                    }
                }
                else
                {
                    draw = false;
                    foreach (var value in conditionValues)
                    {
                        draw = draw || value;
                    }
                }

                if (showIfAttribute.Reversed)
                {
                    draw = !draw;
                }

                return(draw);
            }
            else
            {
                string warning = showIfAttribute.GetType().Name + " 作用在一个有效的布尔值字段条件或着一个方法方法名!";
                EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target);

                return(true);
            }
        }
        public override void DrawProperty(SerializedProperty property)
        {
            EnableIfAttribute enableIfAttribute = PropertyUtility.GetAttribute <EnableIfAttribute>(property);

            UnityEngine.Object target = PropertyUtility.GetTargetObject(property);

            List <bool> conditionValues = new List <bool>();

            foreach (var condition in enableIfAttribute.Conditions)
            {
                FieldInfo conditionField = ReflectionUtility.GetField(target, condition);
                if (conditionField != null &&
                    conditionField.FieldType == typeof(bool))
                {
                    conditionValues.Add((bool)conditionField.GetValue(target));
                }

                MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, condition);
                if (conditionMethod != null &&
                    conditionMethod.ReturnType == typeof(bool) &&
                    conditionMethod.GetParameters().Length == 0)
                {
                    conditionValues.Add((bool)conditionMethod.Invoke(target, null));
                }
            }

            if (conditionValues.Count > 0)
            {
                bool enabled;
                if (enableIfAttribute.ConditionOperator == ConditionOperator.And)
                {
                    enabled = true;
                    foreach (var value in conditionValues)
                    {
                        enabled = enabled && value;
                    }
                }
                else
                {
                    enabled = false;
                    foreach (var value in conditionValues)
                    {
                        enabled = enabled || value;
                    }
                }

                if (enableIfAttribute.Reversed)
                {
                    enabled = !enabled;
                }

                GUI.enabled = enabled;
                EditorDrawUtility.DrawPropertyField(property);
                GUI.enabled = true;
            }
            else
            {
                string warning = enableIfAttribute.GetType().Name + " 作用在一个有效的布尔值字段条件或着一个方法方法名!!";
                EditorDrawUtility.DrawHelpBox(warning, MessageType.Warning, context: target);
            }
        }
Пример #4
0
        /// <summary>
        /// 返回这个序列化属性的所有特性
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="property"></param>
        /// <returns></returns>
        static public T[] GetAttributes <T>(SerializedProperty property) where T : Attribute
        {
            FieldInfo fieldInfo = ReflectionUtility.GetField(GetTargetObject(property), property.name);

            return((T[])fieldInfo.GetCustomAttributes(typeof(T), true));
        }