//初始化值 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 ); }
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); } }
/// <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)); }