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 static void EditorLoadScenePackage(this ScriptableScenePackage scriptableScenePackage, bool askSaveToUser = true, bool removeScene = true)
        {
            if (askSaveToUser)
            {
                EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
            }

            EditorApplication.isPaused  = false;
            EditorApplication.isPlaying = false;

            for (int i = 0; i < scriptableScenePackage.startScenePackages.Length; i++)
            {
                scriptableScenePackage.startScenePackages[i].EditorLoadScenePackage(false, false);
            }

            SceneAsset[] sceneAssets = FindAssetExtension.GetAllInstances <SceneAsset>();

            for (int i = 0; i < scriptableScenePackage.scenes.Length; i++)
            {
                Scene s = EditorSceneManager.GetSceneByName(scriptableScenePackage.scenes[i]);

                if (!s.isLoaded)
                {
                    EditorSceneManager.OpenScene(AssetDatabase.GetAssetPath(Array.Find(sceneAssets, (x) => { return(x.name == scriptableScenePackage.scenes[i]); })), OpenSceneMode.Additive);
                }

                EditorSceneManager.SetActiveScene(EditorSceneManager.GetSceneByName(scriptableScenePackage.scenes[i]));
            }

            for (int i = 0; i < scriptableScenePackage.cheatScenes.Length; i++)
            {
                Scene s = EditorSceneManager.GetSceneByName(scriptableScenePackage.cheatScenes[i]);
                if (!s.isLoaded)
                {
                    EditorSceneManager.OpenScene(AssetDatabase.GetAssetPath(Array.Find(sceneAssets, (x) => { return(x.name == scriptableScenePackage.cheatScenes[i]); })), OpenSceneMode.Additive);
                }
            }

            for (int i = 0; i < scriptableScenePackage.endScenePackages.Length; i++)
            {
                scriptableScenePackage.endScenePackages[i].EditorLoadScenePackage(false, false);
            }

            if (removeScene)
            {
                for (int i = EditorSceneManager.sceneCount - 1; i >= 0; i--)
                {
                    Scene s = EditorSceneManager.GetSceneAt(i);

                    if (ScriptableScenePackage.SceneHasToBeRemoved(scriptableScenePackage, s.name))
                    {
                        EditorSceneManager.CloseScene(s, true);
                    }
                }
            }


            if (!String.IsNullOrEmpty(scriptableScenePackage.activeScene) && EditorSceneManager.GetSceneByName(scriptableScenePackage.activeScene).IsValid())
            {
                EditorSceneManager.SetActiveScene(EditorSceneManager.GetSceneByName(scriptableScenePackage.activeScene));
            }
        }