//Save all Rooms
    void SaveRoomLayouts()
    {
        //Find Prefab in Asset Menu for Creating in scene later
        GameObject lvManagerPrefab = (GameObject)AssetDatabase.LoadAssetAtPath("Assets/Objects/Level Manager.prefab", typeof(GameObject));

        if (lvManagerPrefab == null)
        {
            //Error Finding Asset for level manager
            Debug.LogError("FAILED SAVING: Did not find levelManager prefab. Rename to \"Level Manager.prefab\" and move to \"Assets/Objects/\"");
            return;
        }

        //All the assets found in the Asset database with levelObj label
        List <string> roomsThatExist = new List <string>(AssetDatabase.FindAssets("l:LevelObj", new[] { "Assets/Levels/Level Objects" }));
        //Create an empty List for the Scriptable object that was found
        List <LevelObject> levelObjects = new List <LevelObject>();
        //All the roomNames as a list
        List <string> roomNames = new List <string>();

        //For every asset path found fill the empty list of scriptable objects with the found path
        foreach (string assetPathGUID in roomsThatExist)
        {
            //Asset path as string
            string assetPath = AssetDatabase.GUIDToAssetPath(assetPathGUID);
            //Load assetpath into a levelObject
            LevelObject newLevel = (LevelObject)AssetDatabase.LoadAssetAtPath(assetPath, typeof(LevelObject));
            //if this is null it failed finding it and continue looking through asset paths
            if (newLevel == null)
            {
                continue;
            }
            //Add to list
            levelObjects.Add(newLevel);
            //add the name to the name list
            roomNames.Add(newLevel.name);
        }

        List <LevelObject> toDeleteList = new List <LevelObject>();

        //For every room that is in the scene Save to editor
        foreach (Room room in rooms.Values)
        {
            //If doesn't exist in the already loaded assets create new asset and scriptable object instance
            if (!roomNames.Contains(room.name))
            {
                //Create instance of a new Level
                LevelObject level = (LevelObject)ScriptableObject.CreateInstance(typeof(LevelObject));
                //Set name
                level.thisScene = room.name;

                //Set Editor position
                level.worldEditorX = room.pos.x;
                level.worldEditorY = room.pos.y;

                //Create empty list of connections
                level.doorways = new List <SceneConnector>();

                //For every Door in the room Add to empty connection list
                for (int d = 0; d < room.doors.Count; d++)
                {
                    //If the room doesnt have a connection continue
                    if (room.doors[d].connection != null)
                    {
                        //New Connection
                        SceneConnector newConnction = new SceneConnector();
                        //Set room connection to the connected door name
                        newConnction.connection = rooms[room.doors[d].connection.connection.roomNum].name;
                        //Set side of connection
                        newConnction.side = room.doors[d].doorSide;
                        //Set other side of the connection
                        newConnction.otherConnectionSide = room.doors[d].connection.connection.doorSide;
                        //Add to list
                        level.doorways.Add(newConnction);
                    }
                }

                //Create Asset in the Asset database with room name
                AssetDatabase.CreateAsset(level, "Assets/Levels/Level Objects/" + room.name + ".asset");
                //Label it so it can be found when saving again
                AssetDatabase.SetLabels(level, new[] { "LevelObj" });

                //Create scene and load it behind the editor
                Scene newScene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
                //set Scene Name to room name
                newScene.name = room.name;

                //Instantiate previously found prefab
                GameObject levelManager = Instantiate(lvManagerPrefab);
                //Set the level to the currently saved level
                levelManager.GetComponent <LevelManagerScript>().thisLevel = level;
                //Initiate values for room scene
                levelManager.GetComponent <LevelManagerScript>().CreateRoomSpecs();

                //Save scene to editor
                EditorSceneManager.SaveScene(newScene, "Assets/Levels/Level Scenes/" + room.name + ".unity");

                //Save open scene
                EditorSceneManager.SaveOpenScenes();
            }


            bool roomNotFound = true;
            //For every level that is already saved
            foreach (LevelObject level in levelObjects)
            {
                //  If level doesn't exist continue
                if (level == null)
                {
                    roomNotFound = true;

                    continue;
                }
                //if this room is the same as the level save updated features
                if (room.name == level.name)
                {
                    //Updated Positon
                    level.worldEditorX = room.pos.x;
                    level.worldEditorY = room.pos.y;

                    Scene newScene = EditorSceneManager.OpenScene("Assets/Levels/Level Scenes/" + room.name + ".unity");;
                    LevelManagerScript lvManager = GameObject.Find("Level Manager(Clone)").GetComponent <LevelManagerScript>();
                    lvManager.CreateRoomSpecs();

                    EditorSceneManager.SaveScene(newScene, "Assets/Levels/Level Scenes/" + room.name + ".unity");

                    //Create boolean for deleted
                    bool didntFindDoorInLevel = false;

                    //For every connection in the asset
                    for (int r = 0; r < level.doorways.Count; r++)
                    {
                        //for every door in the room
                        for (int d = 0; d < room.doors.Count; d++)
                        {
                            if (room.doors[d].connection == null)
                            {
                                // didntFindDoorInRoom = true;
                                continue;
                            }

                            if (rooms[room.doors[d].connection.connection.roomNum].name == level.doorways[r].connection)
                            {
                                didntFindDoorInLevel = false;
                                break;
                            }

                            if (rooms[room.doors[d].connection.connection.roomNum].name != level.doorways[r].connection)
                            {
                                didntFindDoorInLevel = true;
                                continue;
                            }
                            didntFindDoorInLevel = false;
                        }

                        //Remove doorway in asset if the connection is gone
                        if (didntFindDoorInLevel)
                        {
                            level.doorways.RemoveAt(r);
                        }
                    }

                    //Add door to scriptable object that doesnt exists yet
                    if (level.doorways.Count < rooms.Count)
                    {
                        //For every door that is in the room
                        foreach (Door oldDoor in room.doors)
                        {
                            //Create bool
                            bool notFound = false;
                            //for every connection in the level
                            foreach (SceneConnector levelObjectConnection in level.doorways)
                            {
                                //if connection already exists break else the room connection wasnt found
                                if (levelObjectConnection.connection == rooms[oldDoor.connection.connection.roomNum].name)
                                {
                                    notFound = false;
                                    break;
                                }
                                else
                                {
                                    notFound = true;
                                }
                            }

                            //not found add connection to asset
                            if (notFound)
                            {
                                //Create new connection
                                SceneConnector newConnction = new SceneConnector();
                                //Set connection to room name
                                newConnction.connection = rooms[oldDoor.connection.connection.roomNum].name;
                                //Set side
                                newConnction.side = oldDoor.doorSide;
                                //set other side
                                newConnction.otherConnectionSide = oldDoor.connection.connection.doorSide;
                                //Add connection to asset
                                level.doorways.Add(newConnction);
                            }
                        }
                    }
                    //Did find the room
                    roomNotFound = false;
                }
                else
                {
                    //Didnt find room add to list
                    roomNotFound = true;
                    toDeleteList.Add(level);
                }
            }
        }

        //Check the rooms to see if they were accidently added to the should remove list
        foreach (Room room in rooms.Values)
        {
            if (toDeleteList.Count >= 1)
            {
                foreach (LevelObject deletable in toDeleteList.ToArray())
                {
                    if (deletable != null && room != null)
                    {
                        //If it exists remove from list
                        if (deletable.name == room.name)
                        {
                            if (!toDeleteList.Remove(deletable))
                            {
                                Debug.Log("Didn't Delete");
                            }
                        }
                    }
                    else
                    {
                        Debug.Log("Didn't Delete");
                    }
                }
            }
        }
        //Delete every room asset and scene in the Asset Database
        foreach (LevelObject delete in toDeleteList)
        {
            if (delete == null)
            {
                continue;
            }
            string deleteName = delete.name;
            AssetDatabase.DeleteAsset("Assets/Levels/Level Objects/" + deleteName + ".asset");
            AssetDatabase.DeleteAsset("Assets/Levels/Level Scenes/" + deleteName + ".unity");
        }
    }
Example #2
0
 private void Awake()
 {
     instance = this;
 }