private void InitializeDefaults()
        {
            SceneManagerAssetPath = AssetDatabase.GetAssetPath(SerializedManager.targetObject);

            bool wasCreated = false;

            AssetFilter assetFilter = AssetDatabaseExtensions.
                                      FindOrCreateSubScriptableObject <AssetFilter>(SceneManagerAssetPath, "SceneFilter", out wasCreated);

            if (wasCreated)
            {
                assetFilter.IncludeIfNoMatch = true;
            }

            SerializedSceneFilter = new SerializedObject(assetFilter);

            SceneHunter sceneHunter = AssetDatabaseExtensions.
                                      GetFirstSubAssetOf <SceneHunter>(SceneManagerAssetPath);

            if (sceneHunter == null)
            {
                sceneHunter = AssetDatabaseExtensions.
                              CreateSubScriptableObject <UnitySceneHunter>(SceneManagerAssetPath, "SceneHunter");
            }

            ScenePopulator = new SerializedObject(sceneHunter);

            SceneNodes = AssetDatabaseExtensions.
                         FindOrCreateSubScriptableObject <SceneNodeCollection>(SceneManagerAssetPath, "SceneNodes", out wasCreated);

            if (wasCreated)
            {
                SceneNodes.SceneManager = TargetManager;
            }

            SceneNodes.PopulateSceneInfos();

            SceneNodesObject = new SerializedObject(SceneNodes);
            SceneNodesProp   = SceneNodesObject.FindProperty("sceneNodes");

            if (AssetDatabaseExtensions.GetSubAssetsOfType <SceneVariableContainer>(TargetManager).Count() == 0)
            {
                TargetManager.SceneVariables.name = "ManagerVariables";
                AssetDatabase.AddObjectToAsset(TargetManager.SceneVariables, TargetManager);
                AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(TargetManager));
            }
            SerializedManager.ApplyModifiedProperties();

            ScenesProp       = SerializedManager.FindProperty("scenes");
            EntrySceneIdProp = SerializedManager.FindProperty("entrySceneId");
            AnyScenesProp    = SerializedManager.FindProperty("anyScene");

            UseOnPlayProp = SerializedManager.FindProperty("useOnPlay");
            GoToOnPlay    = SerializedManager.FindProperty("goToOnPlay");

            SerializedVariables = new SerializedSceneVariableCollection(TargetManager.SceneVariables);
        }
        internal void DeleteSceneNode(int sceneId, bool addToExclusionFilter)
        {
            SceneModel model = TargetManager.scenes.Find((x) => x.SceneId == sceneId);

            if (sceneId == TargetManager.AnyScene.SceneId)
            {
                return;
            }

            if (model == null)
            {
                return;
            }

            Undo.SetCurrentGroupName("Delete Scene Node");
            int undoGroup = Undo.GetCurrentGroup();

            Undo.RegisterCompleteObjectUndo(SceneNodesObject.targetObject, "Scene Nodes");

            SerializedProperty scenesProperty = ScenesProp;

            for (int i = scenesProperty.arraySize - 1; i >= 0; i--)
            {
                SerializedSceneModel serializedScene = GetSerializedSceneModel(i);

                serializedScene.DeleteTransitionsInvolving(sceneId);

                if (serializedScene.SceneIdProp.intValue == sceneId)
                {
                    scenesProperty.DeleteArrayElementAtIndex(i);
                }
            }

            SerializedManager.ApplyModifiedProperties();

            for (int i = 0; i < SceneNodesProp.arraySize; i++)
            {
                if (GetSceneNodeIdProperty(i).intValue == sceneId)
                {
                    SceneNodesProp.DeleteArrayElementAtIndex(i);
                    break;
                }
            }

            SceneNodesObject.ApplyModifiedProperties();

            if (addToExclusionFilter)
            {
                SerializedProperty exclusion = SerializedSceneFilter.FindProperty("FilesToExclude");
                SerializedProperty newEntry  = exclusion.AddArrayElement();
                newEntry.stringValue = model.SceneAssetPath;
                SerializedSceneFilter.ApplyModifiedProperties();
            }

            Undo.CollapseUndoOperations(undoGroup);
        }
        public void ReplaceScenePopulator(System.Type scenePopulatorType)
        {
            if (!scenePopulatorType.IsSubclassOf(typeof(SceneHunter)))
            {
                return;
            }

            Undo.SetCurrentGroupName("Scene Populator Change");
            int undoGroup = Undo.GetCurrentGroup();

            Undo.DestroyObjectImmediate(ScenePopulator.targetObject);

            ScenePopulator = new SerializedObject(AssetDatabaseExtensions.
                                                  FindOrCreateSubScriptableObject <SceneHunter>(TargetManager,
                                                                                                scenePopulatorType, "SceneHunter"));

            Undo.RegisterCreatedObjectUndo(ScenePopulator.targetObject, "Scene Populator Creation");

            Undo.CollapseUndoOperations(undoGroup);
            AssetDatabase.ImportAsset(SceneManagerAssetPath);
            SerializedManager.ApplyModifiedProperties();
            SerializedManager.Update();
        }