public override void OnInspectorGUI()
        {
            ScriptableScenePackage scenePackage = (ScriptableScenePackage)target;

            Undo.RecordObject(scenePackage, "ScenePackage");
            EditorGUI.BeginChangeCheck();
            {
                SceneAsset[] scenes = FindAssetExtension.GetAllInstances <SceneAsset>();

                string[] sceneNames = new string[scenes.Length];
                for (int i = 0; i < scenes.Length; i++)
                {
                    sceneNames[i] = scenes[i].name;
                }

                sceneNames = sceneNames.OrderBy(x => x).ToArray();

                int currentIndex = 0;

                for (int i = 0; i < scenes.Length; i++)
                {
                    if (sceneNames[i] == scenePackage.activeScene)
                    {
                        currentIndex = i;
                        break;
                    }
                }

                scenePackage.activeScene = sceneNames[EditorGUILayout.Popup("Active Scene", currentIndex, sceneNames)];
                GUILayout.Space(10);

                EditorGUILayout.BeginVertical("box");
                {
                    scenePackage.startScenePackages = (ScriptableScenePackage[])AutoClassInspectorExtension.GenericField("Start Scene package", scenePackage.startScenePackages, typeof(ScriptableScenePackage[]));
                }
                EditorGUILayout.EndVertical();

                GUILayout.Space(10);

                DisplayArray("Scenes", ref scenePackage.scenes, sceneNames);
                GUILayout.Space(5);
                DisplayArray("Cheat Scenes", ref scenePackage.cheatScenes, sceneNames);

                GUILayout.Space(10);

                EditorGUILayout.BeginVertical("box");
                {
                    scenePackage.endScenePackages = (ScriptableScenePackage[])AutoClassInspectorExtension.GenericField("End Scene package", scenePackage.endScenePackages, typeof(ScriptableScenePackage[]));
                }
                EditorGUILayout.EndVertical();

                DisplayArray("Optional Scenes", ref scenePackage.optionalScenes, sceneNames);

                GUILayout.Space(20);
                scenePackage.folderName = EditorGUILayout.TextField("Folder Name", scenePackage.folderName);
                scenePackage.showOnGUI  = EditorGUILayout.Toggle("Show on GUI", scenePackage.showOnGUI);
                scenePackage.participateToOptimization = EditorGUILayout.Toggle("Participate to optimization", scenePackage.participateToOptimization);
            }
            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(scenePackage);
            }

            GUILayout.Space(20);
            if (GUILayout.Button("Load it"))
            {
                EditorScenePackageExtension.EditorLoadScenePackage(scenePackage);
            }
        }
        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");
            }
        }