public override void OnInspectorGUI() { if (this.useDefaultInspector) { this.DrawDefaultInspector(); } else { this.serializedObject.Update(); if (this.script != null) { GUI.enabled = false; EditorGUILayout.PropertyField(this.script); GUI.enabled = true; } // Draw fields HashSet <string> drawnGroups = new HashSet <string>(); foreach (var field in this.fields) { if (this.groupedFields.Contains(field)) { // Draw grouped fields string groupName = (field.GetCustomAttributes(typeof(GroupAttribute), true)[0] as GroupAttribute).Name; if (!drawnGroups.Contains(groupName)) { drawnGroups.Add(groupName); PropertyGrouper grouper = this.GetPropertyGrouperForField(field); if (grouper != null) { grouper.BeginGroup(groupName); this.ValidateAndDrawFields(this.groupedFieldsByGroupName[groupName]); grouper.EndGroup(); } else { this.ValidateAndDrawFields(this.groupedFieldsByGroupName[groupName]); } } } else { // Draw non-grouped field this.ValidateAndDrawField(field); } } this.serializedObject.ApplyModifiedProperties(); } // Draw non-serialized fields foreach (var field in this.nonSerializedFields) { DrawerAttribute drawerAttribute = (DrawerAttribute)field.GetCustomAttributes(typeof(DrawerAttribute), true)[0]; FieldDrawer drawer = FieldDrawerDatabase.GetDrawerForAttribute(drawerAttribute.GetType()); if (drawer != null) { drawer.DrawField(this.target, field); } } // Draw native properties foreach (var property in this.nativeProperties) { DrawerAttribute drawerAttribute = (DrawerAttribute)property.GetCustomAttributes(typeof(DrawerAttribute), true)[0]; NativePropertyDrawer drawer = NativePropertyDrawerDatabase.GetDrawerForAttribute(drawerAttribute.GetType()); if (drawer != null) { drawer.DrawNativeProperty(this.target, property); } } // Draw methods foreach (var method in this.methods) { DrawerAttribute drawerAttribute = (DrawerAttribute)method.GetCustomAttributes(typeof(DrawerAttribute), true)[0]; MethodDrawer methodDrawer = MethodDrawerDatabase.GetDrawerForAttribute(drawerAttribute.GetType()); if (methodDrawer != null) { methodDrawer.DrawMethod(this.target, method); } } }
public override void OnInspectorGUI() { this.serializedObject.Update(); if (this.script != null) { GUI.enabled = false; EditorGUILayout.PropertyField(this.script); GUI.enabled = true; } // Draw fields IEnumerable <FieldInfo> fields = this.target.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) .Where(f => this.serializedObject.FindProperty(f.Name) != null); IEnumerable <FieldInfo> groupedFields = fields.Where(f => f.GetCustomAttributes(typeof(GroupAttribute), true).Length > 0); HashSet <string> groupNames = new HashSet <string>(); foreach (var field in fields) { GroupAttribute[] groupAttributes = (GroupAttribute[])field.GetCustomAttributes(typeof(GroupAttribute), true); if (groupAttributes.Length > 0) { // Draw grouped fields string groupName = groupAttributes[0].Name; if (!groupNames.Contains(groupName)) { groupNames.Add(groupName); IEnumerable <FieldInfo> fieldsInSameGroup = groupedFields .Where(f => (f.GetCustomAttributes(typeof(GroupAttribute), true) as GroupAttribute[])[0].Name == groupName); PropertyGrouper grouper = this.GetGrouperForField(field); if (grouper != null) { grouper.BeginGroup(groupName); this.ValidateAndDrawFields(fieldsInSameGroup); grouper.EndGroup(); } else { this.ValidateAndDrawFields(fieldsInSameGroup); } } } else { // Draw non-grouped field this.ValidateAndDrawField(field); } } // Draw methods IEnumerable <MethodInfo> methods = this.target.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) .Where(m => m.GetCustomAttributes(typeof(DrawerAttribute), true).Length > 0); foreach (var method in methods) { DrawerAttribute drawerAttribute = (DrawerAttribute)method.GetCustomAttributes(typeof(DrawerAttribute), true)[0]; MethodDrawer methodDrawer = MethodDrawerDatabase.GetDrawerForAttribute(drawerAttribute.GetType()); if (methodDrawer != null) { methodDrawer.DrawMethod(this.serializedObject.targetObject, method); } } this.serializedObject.ApplyModifiedProperties(); }