public void StartGenerator(int seed)
        {
            if (!generationComplete)
            {
                Debug.Log("Dungeon Generator:: Can not start generator as previous generator is not yet complete!");
                return;
            }
            Debug.Log("Dungeon Generator:: Starting generation with seed [" + seed + "]");
            DMDebugTimer.Start();
            generationComplete = false;

            //lets check the data first really quick, to make sure we're not missing any rooms or anything...
            //spawn rooms:
            bool hasErrors = CheckGeneratorData();

            if (hasErrors)
            {
                return;
            }


            attempts = 1;
            do
            {
                DestroyAllGeneratedRooms();
                RunGenerator(seed);
                if (generateInUpdate)
                {
                    break;
                }
            } while(regenerateWithDifferentSeed);

            if (!generateInUpdate)
            {
                PostGeneration();
            }
        }
        //Call this to start the generator.
        public void RunGenerator(int seed)
        {
            openSet         = new List <Door>();
            GlobalVoxelGrid = new Dictionary <Vector3, bool>();
            AllRooms        = new List <GameObject>();
            AllDoorsData    = new List <Door>();
            DungeonGraph    = new List <GraphNode>();

            if (regenerateWithDifferentSeed)
            {
                seed = this.randomSeed;
                Debug.Log("Dungeon Generator:: Seed changed to [" + seed + "]");
                attempts++;
                regenerateWithDifferentSeed = false;
            }

            //assign every possible room a unique template ID, used for identifying room types later
            int templateId = 0;

            for (int i = 0; i < generatorSettings.possibleRooms.Count; i++)
            {
                generatorSettings.possibleRooms[i].GetComponent <RoomData>().roomTemplateID = templateId;
                templateId++;
            }
            for (int i = 0; i < generatorSettings.spawnRooms.Count; i++)
            {
                generatorSettings.spawnRooms[i].GetComponent <RoomData>().roomTemplateID = templateId;
                templateId++;
            }
            for (int i = 0; i < generatorSettings.deadendRooms.Count; i++)
            {
                generatorSettings.deadendRooms[i].GetComponent <RoomData>().roomTemplateID = templateId;
                templateId++;
            }



            rand = new System.Random(seed);

            int      ri = rand.Next(0, generatorSettings.spawnRooms.Count); //get a random start room
            RoomData startRoomPrefab           = generatorSettings.spawnRooms[ri].GetComponent <RoomData>();
            RoomData instantiatedDataStartRoom = AddRoom(startRoomPrefab, Vector3.zero, 0f);

            GraphNode firstNode = new GraphNode();

            firstNode.data = instantiatedDataStartRoom;
            instantiatedDataStartRoom.node = firstNode; //cyclic yay
            DungeonGraph.Add(firstNode);


            for (int i = 0; i < instantiatedDataStartRoom.Doors.Count; i++)
            {
                openSet.Add(instantiatedDataStartRoom.Doors[i]);
            }
            if (generateInUpdate)
            {
                return;
            }

            while (openSet.Count > 0)
            {
                GenerateNextRoom();  //this is just isolated so we can tick this in update during testing
            }

            //generation is done, do any dungeon specific postprocessing here
            if (AllRooms.Count < generatorSettings.minRooms)
            {
                regenerateWithDifferentSeed = true;
                this.randomSeed++;
                Debug.Log("Dungeon Generator:: Generation failed to meet min rooms [" + AllRooms.Count + "/" + generatorSettings.minRooms + "] ... trying again with seed++ [ " + this.randomSeed + " ]");
                return;
            }

            Debug.Log("Dungeon Generator:: Generation Complete in [" + DMDebugTimer.Lap() + "ms] and [" + attempts + "] attempts");
            generationComplete = true;
        }
        public void Update()
        {
            if (generateInUpdate)
            {
                _generationTimer -= Time.deltaTime;


                bool hasErrors = CheckGeneratorData();
                if (hasErrors)  //break out here.  Shouldn't ever really generate in update unless debugging though tbh
                {
                    generateInUpdate = false;
                    return;
                }

                if (_generationTimer <= 0f)
                {
                    _generationTimer = generationTimer;

                    if (regenerateWithDifferentSeed)
                    {
                        DestroyAllGeneratedRooms();
                        RunGenerator(randomSeed);
                    }

                    if (openSet.Count > 0)
                    {
                        GenerateNextRoom();  //this is just isolated so we can tick this in update during testing
                    }
                    else
                    {
                        //generation is done, do any dungeon specific postprocessing here
                        if (AllRooms.Count < generatorSettings.minRooms)
                        {
                            regenerateWithDifferentSeed = true;
                            this.randomSeed++;

                            Debug.Log("Dungeon Generator:: Generation failed to meet min rooms [" + AllRooms.Count + "/" + generatorSettings.minRooms + "] ... trying again with seed++ [ " + this.randomSeed + " ]");
                            return;
                        }

                        if (!generationComplete)
                        {
                            Debug.Log("Dungeon Generator:: Generation Complete in [" + DMDebugTimer.Lap() + "ms] and [" + attempts + "] attempts");
                            generationComplete = true;
                            PostGeneration();
                        }
                    }
                }
            }


            if (Input.GetKeyUp(KeyCode.Space))
            {
                //restart?
                Debug.Log("Regenerating the next dungeon");
                randomSeed++;
                //need to destroy all the rooms
                StartGenerator(randomSeed);
            }
        }