示例#1
0
    private bool spawnFailed = true;                                        //if true when generation is 'finished', the level will be generated again

    //main method to generate the map
    void Start()
    {
        while (spawnFailed)           //while loop used until a generation meets all criteria (main one being that every room is actually connected!)
        {
            try{
                spawnFailed = false;    //will be set to true in fatal circumstances (no direct line between rooms, coridoors unable to generate etc)
                SubLevel rootLevel = new SubLevel(levelWidth / 2f, levelHeight / 2f, levelWidth, levelHeight, minRoomSize, true, 0);
                SplitLevel(rootLevel);  //recursive method to split the map into appropriately sized sections
                rootLevel.CreateRoom(); //recursive method to create rooms in the sections
                rootLevel.FindPairs();  //recursive method to find pairs of rooms
                rooms  = new List <Room> ();
                groups = new List <RoomGroup> ();
                coridoorControllers = new List <CoridoorController> ();
                GetRooms(rootLevel);           //returns all rooms
                SpawnRooms();                  //spawns in rooms (including generating stats)
                GroupRooms();                  //groups rooms together
                SpawnCoridoorsWithinGroups();  //spawns coridoors within each group
                SpawnCoridoorsBetweenGroups(); //connects each group with a coridoor
            } catch {
                spawnFailed = true;
            }
            if (spawnFailed)               //Resetting, before trying again

            {
                for (int i = 0; i < roomList.childCount; i++)
                {
                    Destroy(roomList.GetChild(i).gameObject);
                }
                for (int i = 0; i < coridoorList.childCount; i++)
                {
                    Destroy(coridoorList.GetChild(i).gameObject);
                }
                while (roomList.childCount > 0)
                {
                    roomList.GetChild(0).parent = null;
                }
                while (coridoorList.childCount > 0)
                {
                    coridoorList.GetChild(0).parent = null;
                }
                tileController.ResetTiles(levelWidth, levelHeight);
            }
        }

        BuildCoridoors(); //builds the physical aspect of the coridoors;
        BuildRooms();     //builds the physical aspect of the rooms
        BuildNavMesh();   //builds a navmesh, used for AI movement
    }