//~TODO: Remove unnecessary line segments at start and end. private void GenerateCorridorLine(Graph <int> roomGraph) { corridorLineList.Clear(); foreach (var node in roomGraph.NodeList) { foreach (var nextNode in node.GetNeighbors()) { if (MathUtils.NearlyEqual(node.GetWeight(nextNode), 1f)) // Weight 1f is the original default weight in roomGraph. { DungeonRoomData room1 = initialRoomList[node.Context]; DungeonRoomData room2 = initialRoomList[nextNode.Context]; Vector2 start = new Vector2(); Vector2 end = new Vector2(); if (Mathf.Abs(room1.center.x - room2.center.x) < ((room1.width + room2.width) / 2 - 5 * Constants.MapInfo.GridSize)) // Construct vertical line. { float lineX = (room1.center.x + room2.center.x) / 2; start = new Vector2(lineX, room1.center.y); end = new Vector2(lineX, room2.center.y); AddCorridorLine(start, end); } else if (Mathf.Abs(room1.center.y - room2.center.y) < ((room1.height + room2.height) / 2 - 5 * Constants.MapInfo.GridSize)) // Construct horizontal line. { float lineY = (room1.center.y + room2.center.y) / 2; start = new Vector2(room1.center.x, lineY); end = new Vector2(room2.center.x, lineY); AddCorridorLine(start, end); } else // Construct L shape line. { float centerX = room1.center.x + MathUtils.rnd.Next(-1, 2); float centerY = room2.center.y + MathUtils.rnd.Next(-1, 2); // Vertical start = new Vector2(centerX, room1.center.y); end = new Vector2(centerX, centerY); AddCorridorLine(start, end); // Horizontal start = new Vector2(room2.center.x, centerY); AddCorridorLine(start, end); } node.SetWeight(nextNode, 2f); // Weight 2f indicates that this edge is dealt with. nextNode.SetWeight(node, 2f); } } } }
private void ChangeDoorTileGO(int index, DungeonRoomData.Tile doorTile, DungeonRoomData room, int id) { if (index == 12) { index = 0; } else { index = 1; } GameObject doorTileGO = Instantiate(doorTileSO.tilePrefabList[index], doorTile.go.transform.position, Quaternion.identity, doorTile.go.transform.parent); doorTileGO.GetComponent <DungeonDoor>().roomId = room.doorTileList[id].go.GetComponent <DungeonDoor>().roomId; Destroy(room.doorTileList[id].go); room.doorTileList[id].go = doorTileGO; room.doorTileList[id].spriteRenderer = null; room.doorTileList[id].collider2d = doorTileGO.GetComponent <Collider2D>(); }
private void SpawnCorridorTile(Vector2 position, bool isWall, ref GameObject root, DungeonRoomData corridorRoom) { GameObject tileGO; Collider2D collider2d; if (isWall) { tileGO = Instantiate(wallTileHolder, position, Quaternion.identity, root.transform); tileGO.GetComponent <DungeonTile>().roomId = corridorRoom.id; DungeonRoomData.Tile tile = new DungeonRoomData.Tile(tileGO); collider2d = tileGO.AddComponent <BoxCollider2D>(); tile.collider2d = collider2d; corridorRoom.wallTileList.Add(tile); } else { tileGO = Instantiate(floorTileHolder, position, Quaternion.identity, root.transform); tileGO.GetComponent <DungeonTile>().roomId = corridorRoom.id; DungeonRoomData.Tile tile = new DungeonRoomData.Tile(tileGO); collider2d = tileGO.AddComponent <BoxCollider2D>(); tile.collider2d = collider2d; corridorRoom.floorTileList.Add(tile); } }
private void BuildCorridor() { const int corridorWidth = 5; RaycastHit2D[] hit = new RaycastHit2D[1]; RaycastHit2D[][] hit2Ds = new RaycastHit2D[corridorWidth][]; for (int i = 0; i < corridorWidth; i++) { hit2Ds[i] = new RaycastHit2D[1]; } int[] hitNums = new int[corridorWidth]; Vector2[] positions = new Vector2[corridorWidth]; Vector2 hitDirection = Vector2.zero; // Raycast to current position. bool isWall; for (int k = 0; k < corridorLineList.Count; k++) { var line = corridorLineList[k]; GameObject corridorRoot = new GameObject("corridorRoot"); corridorRoot.transform.position = line.Center; corridorRoot.transform.SetParent(corridorHolder.transform); DungeonRoomData corridorRoom = new DungeonRoomData { id = initialRoomList.Count, center = line.Center, width = (int)(line.EndUnified.x - line.StartUnified.x), height = (int)(line.EndUnified.y - line.StartUnified.y), root = corridorRoot }; if (line.IsHorizontal()) { for (float x = line.StartUnified.x - 2f * Constants.MapInfo.GridSize; x < line.EndUnified.x + 2.5f * Constants.MapInfo.GridSize; x += Constants.MapInfo.GridSize) { float[] y = new float[corridorWidth]; y[0] = line.StartUnified.y - 2f * Constants.MapInfo.GridSize; // Wall y[1] = line.StartUnified.y - Constants.MapInfo.GridSize; // Floor y[2] = line.StartUnified.y; // Floor y[3] = line.StartUnified.y + Constants.MapInfo.GridSize; // Floor y[4] = line.StartUnified.y + 2f * Constants.MapInfo.GridSize; // Wall for (int i = 0; i < y.Length; i++) { Vector2 position = new Vector2(x, y[i]); positions[i] = position; int hitNum = Physics2D.RaycastNonAlloc(position, hitDirection, hit); hitNums[i] = hitNum; hit2Ds[i][0] = hit[0]; } if (((x > line.StartUnified.x) || (x < line.EndUnified.x)) && !CheckDoorCondition(ref hitNums, hit2Ds, ref positions, true)) { for (int i = 0; i < y.Length; i++) { bool isXStart = MathUtils.NearlyEqual(x, line.StartUnified.x - 2f * Constants.MapInfo.GridSize); bool isXEnd = MathUtils.NearlyEqual(x, line.EndUnified.x + 2f * Constants.MapInfo.GridSize); if (i == 0 || i == 4 || isXStart || isXEnd) { // If corners. if ((i == 0 && isXStart) || (i == 0 && isXEnd) || (i == 4 && isXStart) || (i == 4 && isXEnd)) { continue; } isWall = true; } else { isWall = false; } if (hitNums[i] == 0) { SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom); } else if (!isWall) { DungeonWall wall = hit2Ds[i][0].collider.GetComponent <DungeonWall>(); if (wall) { initialRoomList[wall.roomId].isClose = false; initialRoomList[wall.roomId].wallTileList.Remove( initialRoomList[wall.roomId].wallTileList.Find(obj => obj.collider2d == hit2Ds[i][0].collider)); Destroy(hit2Ds[i][0].collider.gameObject); SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom); } } } } } } else if (line.IsVertical()) { for (float y = line.StartUnified.y - 2f * Constants.MapInfo.GridSize; y < line.EndUnified.y + 2.5f * Constants.MapInfo.GridSize; y += Constants.MapInfo.GridSize) { float[] x = new float[5]; x[0] = line.StartUnified.x - 2f * Constants.MapInfo.GridSize; // Wall x[1] = line.StartUnified.x - Constants.MapInfo.GridSize; // Floor x[2] = line.StartUnified.x; // Floor x[3] = line.StartUnified.x + Constants.MapInfo.GridSize; // Floor x[4] = line.StartUnified.x + 2f * Constants.MapInfo.GridSize; // Wall for (int i = 0; i < x.Length; i++) { Vector2 position = new Vector2(x[i], y); positions[i] = position; int hitNum = Physics2D.RaycastNonAlloc(position, hitDirection, hit); hitNums[i] = hitNum; hit2Ds[i][0] = hit[0]; } if (((y > line.StartUnified.y) || (y < line.EndUnified.y)) && !CheckDoorCondition(ref hitNums, hit2Ds, ref positions, false)) { for (int i = 0; i < x.Length; i++) { bool isYStart = MathUtils.NearlyEqual(y, line.StartUnified.y - 2f * Constants.MapInfo.GridSize); bool isYEnd = MathUtils.NearlyEqual(y, line.EndUnified.y + 2f * Constants.MapInfo.GridSize); if (i == 0 || i == 4 || isYStart || isYEnd) { // If corners. if ((i == 0 && isYStart) || (i == 0 && isYEnd) || (i == 4 && isYStart) || (i == 4 && isYEnd)) { continue; } isWall = true; } else { isWall = false; } if (hitNums[i] == 0) { SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom); } else if (!isWall) { DungeonWall wall = hit2Ds[i][0].collider.GetComponent <DungeonWall>(); if (wall) { initialRoomList[wall.roomId].isClose = false; initialRoomList[wall.roomId].wallTileList.Remove( initialRoomList[wall.roomId].wallTileList.Find(obj => obj.collider2d == hit2Ds[i][0].collider)); Destroy(hit2Ds[i][0].collider.gameObject); SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom); } } } } } } corridorRoomList.Add(corridorRoom); initialRoomList.Add(corridorRoom); } allRoomList.AddRange(corridorRoomList); }