static DefinitionReflection GetReflectedValues <T>() where T : ScriptableObject { var settingsType = typeof(T); if (!DefinitionReflectionLookup.TryGetValue(settingsType, out DefinitionReflection settings)) { var fieldList = new List <DefinitionFieldReflection>(); var settingsTypeName = settingsType.FullName; var defaultSettings = ScriptableObject.CreateInstance <T>(); defaultSettings.hideFlags = HideFlags.DontSaveInEditor; try { var fields = settingsType.GetFields(); foreach (var field in fields) { var name = field.Name; var niceName = EditorGUIUtility.TrTextContent(ObjectNames.NicifyVariableName(name)); var settingsName = $"{settingsTypeName}.{name}"; var defaultValue = field.GetValue(defaultSettings); if (defaultValue == null) { if (field.FieldType.IsValueType) { defaultValue = Activator.CreateInstance(field.FieldType); } } fieldList.Add(new DefinitionFieldReflection() { name = name, niceName = niceName, settingsName = settingsName, defaultValue = defaultValue, fieldInfo = field }); } } finally { defaultSettings.hideFlags = HideFlags.None; UnityEngine.Object.DestroyImmediate(defaultSettings); } settings = new DefinitionReflection() { settingsType = settingsType, settingsTypeName = settingsTypeName, reflectedFields = fieldList.ToArray() }; DefinitionReflectionLookup[settingsType] = settings; } return(settings); }
static DefinitionReflection GetReflectedValues <T>() where T : ScriptableObject { var settingsType = typeof(T); if (!DefinitionReflectionLookup.TryGetValue(settingsType, out DefinitionReflection settings)) { var fieldList = new List <DefinitionFieldReflection>(); var settingsTypeName = settingsType.FullName; var defaultSettings = ScriptableObject.CreateInstance <T>(); defaultSettings.hideFlags = HideFlags.DontSaveInEditor; try { var fields = settingsType.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); foreach (var field in fields) { if (field.IsPublic) { var foundAttributes = field.GetCustomAttributes(typeof(NonSerializedAttribute), true); if (foundAttributes != null && foundAttributes.Length > 0) { continue; } } else { var foundAttributes = field.GetCustomAttributes(typeof(SerializeField), true); if (foundAttributes == null || foundAttributes.Length == 0) { continue; } } var name = field.Name; var niceName = EditorGUIUtility.TrTextContent(ObjectNames.NicifyVariableName(name)); var settingsName = $"{settingsTypeName}.{name}"; var defaultValue = field.GetValue(defaultSettings); if (defaultValue == null) { if (field.FieldType.IsValueType) { defaultValue = Activator.CreateInstance(field.FieldType); } } fieldList.Add(new DefinitionFieldReflection() { name = name, niceName = niceName, settingsName = settingsName, defaultValue = defaultValue, fieldInfo = field }); } } finally { defaultSettings.hideFlags = HideFlags.None; UnityEngine.Object.DestroyImmediate(defaultSettings); } settings = new DefinitionReflection() { settingsType = settingsType, settingsTypeName = settingsTypeName, reflectedFields = fieldList.ToArray() }; DefinitionReflectionLookup[settingsType] = settings; } return(settings); }