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);
        }
示例#2
0
        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);
        }