protected virtual void OnEnable() { if (serializedObject == null) { return; } this.script = this.serializedObject.FindProperty("m_Script"); // Cache serialized fields. this.fields = PropertyUtility.GetAllFields(this.target, f => this.serializedObject.FindProperty(f.Name) != null); // Check if there are any "specific" attributes. // Cache all group attributes. this.groupedFields = new HashSet <FieldInfo>(this.fields.Where(f => f.GetCustomAttributes(typeof(GroupAttribute), true).Length > 0)); // Cache grouped fields by group name this.cachedGroupFields = new Dictionary <string, List <FieldInfo> >(); foreach (FieldInfo groupedField in this.groupedFields) { // Get attribute group name. string groupName = (groupedField.GetCustomAttributes(typeof(GroupAttribute), true)[0] as GroupAttribute).Name; GroupAttribute attr = groupedField.GetCustomAttributes(typeof(GroupAttribute), true)[0] as GroupAttribute; if (this.cachedGroupFields.ContainsKey(groupName)) { this.cachedGroupFields[groupName].Add(groupedField); } else { this.cachedGroupFields[groupName] = new List <FieldInfo>() { groupedField }; } // Cache if expanded. if (!this.groupExpanded.ContainsKey(groupName)) { this.groupExpanded[groupName] = attr.Expanded; } } // Cache serialized properties by field name this.serializedPropertiesByFieldName = new Dictionary <string, SerializedProperty>(); foreach (var field in this.fields) { this.serializedPropertiesByFieldName[field.Name] = this.serializedObject.FindProperty(field.Name); } }