private void Refresh()
        {
            EditorApplication.playModeStateChanged -= EditorApplication_playModeStateChanged;
            EditorApplication.playModeStateChanged += EditorApplication_playModeStateChanged;

            Undo.undoRedoPerformed -= OnUndoRedo;
            Undo.undoRedoPerformed += OnUndoRedo;

            EditorSceneManager.sceneOpened -= EditorSceneManager_sceneOpened;
            EditorSceneManager.sceneOpened += EditorSceneManager_sceneOpened;

            if (sceneManager == null)
            {
                return;
            }

            if (sceneManager.Transitioner != null)
            {
                sceneManager.Transitioner.OnTransitionCompleted.RemoveListener(OnTransitioned);
                sceneManager.Transitioner.OnTransitionCompleted.AddListener(OnTransitioned);

                sceneManager.Transitioner.OnTransitionStarted.RemoveListener(OnTransitionStarted);
                sceneManager.Transitioner.OnTransitionStarted.AddListener(OnTransitionStarted);
            }

            sceneManager.SceneVariables.OnVariableChanged -= SceneVariables_OnVariableChanged;
            sceneManager.SceneVariables.OnVariableChanged += SceneVariables_OnVariableChanged;

            SerializedSceneManager = new SerializedSceneManager(sceneManager);
            serializedSceneManager.SetActiveScene();

            isInitialized = false;

            if (!EditorApplication.isPlaying)
            {
                sceneManager.SceneVariables.ResetVariables();
            }

            needsRefresh = false;

            OnRefresh.SafeInvoke(this, System.EventArgs.Empty);

            Repaint();
        }