public override void OnInspectorGUI()
    {
        PersistentDataSystem persistentData = ((PersistentDataSystem)target);

        persistentData.dataVersion = EditorGUILayout.TextField("DataVersion", persistentData.dataVersion);
        persistentData.autoSave    = EditorGUILayout.Toggle("AutoSave", persistentData.autoSave);

        persistentData.saveMode = (PersistentDataSystem.SaveMode)(EditorGUILayout.EnumPopup("SaveMode", persistentData.saveMode));

        EditorGUILayout.Space();
        PersistentDataSystem.LoadMode persistentDataSystemLoadMode = ((PersistentDataSystem.LoadMode)(serializedObject.FindProperty("loadAwakeMode").enumValueIndex));

        serializedObject.FindProperty("loadAwakeMode").enumValueIndex = (int)(PersistentDataSystem.LoadMode)(EditorGUILayout.EnumPopup("LoadAwakeMode", persistentDataSystemLoadMode));

        if (persistentDataSystemLoadMode == PersistentDataSystem.LoadMode.SPECIFIC_CLASS)
        {
            persistentData.classToLoad = (string[])EditorUtils.GenericField("Class to load", persistentData.classToLoad, typeof(string[]));
        }
        EditorGUILayout.Space();

        if (!persistentData.IsInit)
        {
            persistentData.Init();
        }

        GUILayout.Space(10);

        if (persistentData.savedDataDictionnary != null)
        {
            foreach (List <SavedData> sdList in persistentData.savedDataDictionnary.Values)
            {
                if (sdList != null && sdList.Count > 0)
                {
                    GUILayout.BeginVertical(EditorStyles.textArea);
                    GUILayout.Space(2);
                    GUIStyle option = new GUIStyle();
                    option.alignment = TextAnchor.MiddleCenter;
                    option.fontSize  = 15;
                    option.fontStyle = FontStyle.Bold;
                    GUILayout.Label(sdList[0].GetType().Name, option);
                    GUILayout.Space(5);

                    foreach (SavedData sd in sdList)
                    {
                        sd.DisplayInspector();
                        GUILayout.Space(2);
                    }

                    GUILayout.EndVertical();
                    GUILayout.Space(2);
                }
            }

            if (persistentData.savedDataDictionnary.Count > 0 && GUILayout.Button("Save Data"))
            {
                persistentData.SaveAllData();
                Debug.Log("Data Saved in the Directory : " + persistentData.AutomaticSavedDataDirectoryPath);
            }
        }

        GUILayout.Space(2);
        if (persistentDataSystemLoadMode == PersistentDataSystem.LoadMode.SPECIFIC_CLASS && GUILayout.Button("Load specific class data"))
        {
            persistentData.LoadClass(persistentData.classToLoad);
        }

        GUILayout.Space(2);
        if (GUILayout.Button("Load all saved data"))
        {
            persistentData.LoadAllSavedData();
        }

        GUILayout.Space(2);
        if (GUILayout.Button("Unload saved data"))
        {
            persistentData.UnloadAllSavedData();
        }

        GUILayout.Space(2);
        if (GUILayout.Button("Erase all saved data"))
        {
            persistentData.EraseAllSavedData();
        }

        serializedObject.ApplyModifiedProperties();
    }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            EditorGUI.BeginChangeCheck();
            PersistentDataSystem persistentData = ((PersistentDataSystem)target);

            EditorGUILayout.PropertyField(serializedObject.FindProperty("dataVersion"), true);

            GUILayout.Space(5);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("autoSave"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("saveMode"), true);

            EditorGUILayout.Space();

            EditorGUILayout.PropertyField(serializedObject.FindProperty("awakeLoadMode"), true);


            if (persistentData.awakeLoadMode == PersistentDataSystem.AwakeLoadMode.SPECIFIC_CLASS)
            {
                //FIND ALL SAVEDDATA BY REFLECTION
                List <string> options = new List <string>();

                foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    foreach (Type type in assembly.GetTypes())
                    {
                        if (type.IsSubclassOf(typeof(SavedData)))
                        {
                            options.Add(type.FullName);
                        }
                    }
                }

                foldout = EditorGUILayout.Foldout(foldout, "Class To Load");

                if (foldout)
                {
                    GUILayout.Space(5);
                    GUILayout.BeginVertical();

                    if (GUILayout.Button("Add Element"))
                    {
                        if (persistentData.classToLoad == null)
                        {
                            persistentData.classToLoad = new List <string>();
                        }
                        persistentData.classToLoad.Add("");
                    }

                    if (persistentData.classToLoad != null)
                    {
                        EditorGUI.indentLevel++;
                        for (var i = 0; i < persistentData.classToLoad.Count; i++)
                        {
                            GUILayout.BeginHorizontal();

                            int selectedType = 0;

                            selectedType = options.FindIndex((x) => { return(x.Equals(persistentData.classToLoad[i])); });

                            if (selectedType == -1)
                            {
                                selectedType = 0;
                            }

                            selectedType = EditorGUILayout.Popup("Type", selectedType, options.ToArray());

                            persistentData.classToLoad[i] = options[selectedType];

                            if (GUILayout.Button("X", GUILayout.Width(18)))
                            {
                                persistentData.classToLoad.RemoveAt(i);
                            }

                            GUILayout.EndHorizontal();
                        }
                    }

                    EditorGUI.indentLevel--;
                    GUILayout.EndVertical();
                }

                EditorGUILayout.Space();
            }

            persistentData.Init();

            GUILayout.Space(10);

            if (persistentData.savedDataDictionnary != null)
            {
                foreach (List <SavedData> sdList in persistentData.savedDataDictionnary.Values)
                {
                    if (sdList != null && sdList.Count > 0)
                    {
                        GUILayout.BeginVertical(EditorStyles.textArea);
                        GUILayout.Space(2);
                        GUIStyle option = new GUIStyle();
                        option.alignment = TextAnchor.MiddleCenter;
                        option.fontSize  = 15;
                        option.fontStyle = FontStyle.Bold;
                        GUILayout.Label(sdList[0].GetType().Name, option);
                        GUILayout.Space(5);

                        foreach (SavedData sd in sdList)
                        {
                            AutoClassInspectorExtension.ShowAutoEditorGUI(sd);
                            GUILayout.Space(2);
                        }

                        GUILayout.EndVertical();
                        GUILayout.Space(2);
                    }
                }

                SaveDataEditor();
            }

            GUILayout.Space(10);
            LoadDataEditor();

            GUILayout.Space(10);
            if (GUILayout.Button("Unload saved data"))
            {
                persistentData.UnloadAllSavedData();
            }

            GUILayout.Space(10);

            serializedObject.ApplyModifiedProperties();
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Persisdent Data System");
            }
        }