Exemple #1
0
    public void GenerateFloor()
    {
        var nowFloor = gm.nowFloor > 20 ? 20 : gm.nowFloor;

        nowFloor = gm.nowFloor;
        ClearFloor();
        int mapCount         = 3 + nowFloor;
        int increaseRoomSize = nowFloor / 4;

        increaseRoomSize = 0;
        var minGridSize = 2;

        //그리드에 모든 방이 들어가도록 만듬 (그리드 = 방수 X 더 크게해서 빈 여백 만들어야 함)
        while (minGridSize * minGridSize <= mapCount)
        {
            minGridSize++;
        }

        Debug.Log(mapCount.ToString());
        bool[,] grid = new bool[minGridSize, minGridSize];
        var rooms = new List <Room>();

        //그리드 채우기
        for (int i = 0; i < minGridSize; i++)
        {
            for (int j = 0; j < minGridSize; j++)
            {
                var room = new Room();
                room.coord = new Vector2Int(i, j);
                room.size  = new Vector2Int(Random.Range(4, 6 + 1 + increaseRoomSize), Random.Range(4, 6 + 1 + increaseRoomSize));
                rooms.Add(room);
            }
        }

        //그리드에서 방 개수에 맞을 때 까지 방 줄이기
        while (rooms.Count > mapCount)
        {
            rooms.RemoveAt(Random.Range(0, rooms.Count));
        }

        //방 그리기
        for (int i = 0; i < rooms.Count; i++)
        {
            var xbase = rooms[i].coord.x * 8 + increaseRoomSize + (8 + increaseRoomSize - rooms[i].size.x) / 2;
            var ybase = rooms[i].coord.y * 8 + increaseRoomSize + (8 + increaseRoomSize - rooms[i].size.y) / 2;
            rooms[i].baseCoord = new Vector2Int(xbase, ybase);
            rooms[i].center    = new Vector2Int(xbase + ((rooms[i].size.x) / 2),
                                                ybase + ((rooms[i].size.y) / 2));
            for (int x = xbase; x < xbase + rooms[i].size.x; x++)
            {
                for (int y = ybase; y < ybase + rooms[i].size.y; y++)
                {
                    floor.SetTile(new Vector3Int(x, y, 0), floorTile);
                }
            }
        }

        var startRoomIndex = Random.Range(0, rooms.Count);

        //방 연결하기
        for (int i = 0; i < rooms.Count - 1; i++)
        {
            ConnectRoom(rooms[i].center, rooms[i + 1].center);
        }

        //20%의 방에 길 더 만들어주기
        for (int i = 0; i < (rooms.Count - 1 / 5); i++)
        {
            ConnectRoom(rooms[Random.Range(0, rooms.Count)].center, rooms[Random.Range(0, rooms.Count)].center);
        }

        //벽 생성하기
        wallcol.enabled = false;
        CreateWall();
        wallcol.enabled = true;

        //플레이어 스폰하기
        player.transform.position = new Vector3(rooms[startRoomIndex].center.x, rooms[startRoomIndex].center.y, 0);

        var itemAndMobCount = Mathf.RoundToInt((float)mapCount * 2 / 3);
        //몹 스포너 설치하기 플레이어 스폰지점 제외
        //6층까지는 한방에 몬스터 하나 이후로는 랜덤으로 두마리
        var roomIndexList = new List <int>();

        for (var i = 0; i < rooms.Count; i++)
        {
            roomIndexList.Add(i);
        }
        roomIndexList.RemoveAt(startRoomIndex);
        //shuffle
        for (var i = 0; i < roomIndexList.Count; i++)
        {
            var temp  = roomIndexList[i];
            var rand1 = Random.Range(0, roomIndexList.Count);
            roomIndexList[i]     = roomIndexList[rand1];
            roomIndexList[rand1] = temp;
        }
        //set
        for (int i = 0; i < roomIndexList.Count; i++)
        {
            var nowRoomsCenter = rooms[roomIndexList[i]].center;
            if (i + 1 < roomIndexList.Count && nowFloor > 6 && Random.Range(0, 2) == 1)
            {
                roomIndexList.RemoveAt(roomIndexList.Count - 1);
                var spawner2 = Instantiate(mobSpawner, RandomMove1Block(new Vector3Int(nowRoomsCenter.x, nowRoomsCenter.y, 0)), Quaternion.identity);
                spawner2.transform.SetParent(mobSpawners.transform);
            }
            var spawner = Instantiate(mobSpawner, RandomMove1Block(new Vector3Int(nowRoomsCenter.x, nowRoomsCenter.y, 0)), Quaternion.identity);
            spawner.transform.SetParent(mobSpawners.transform);
        }

        //필수 음식 대 생성
        Item item = new Item(5, 1);

        gm.SpawnItem(rooms[Random.Range(0, rooms.Count)].center, item);
        itemAndMobCount--;
        //4층 마다 필수적으로 무기를 하나 생성한다.
        if (nowFloor % 4 == 0)
        {
            gm.SpawnEquipItemWithFloor(RandomMove1Block(rooms[Random.Range(0, rooms.Count)].center));
            itemAndMobCount--;
        }
        for (int i = 0; i < itemAndMobCount - 1; i++)
        {
            gm.SpawnItemWithFloor(RandomMove1Block(rooms[Random.Range(0, rooms.Count)].center));
        }
        //계단 설치하기 플레이어 스폰지점 제외
        var rand = Random.Range(0, rooms.Count);

        while (startRoomIndex == rand)
        {
            rand = Random.Range(0, rooms.Count);
        }
        var nowRoomsCenter2 = rooms[rand].center;

        Instantiate(stair, (Vector3)RandomMove1Block(new Vector3Int(nowRoomsCenter2.x, nowRoomsCenter2.y, 0)), Quaternion.identity);

        for (int i = 0; i < itemAndMobCount - 1; i++)
        {
            gm.SpawnItemWithFloor(RandomMove1Block(rooms[Random.Range(0, rooms.Count)].center));
        }
        //a스타 맵 갱신
        astar.LoadTile();
    }