public void Generate() { ObjBuilder.tileSize = 10; var floor = ObjBuilder.AddNode("floorRoot", transform); int w = Random.Range(minSize, maxSize); int h = Random.Range(minSize, maxSize); ObjBuilder.AddPlane(floorPrefab, floor, w, h); var wall = ObjBuilder.AddNode("wallRoot", transform); var Nwall = ObjBuilder.AddNode("wall", wall); var gos = ObjBuilder.AddWall(wallPrefab, Nwall, w, 1); var Swall = ObjBuilder.AddNode("wall", wall); Swall.Translate(new Vector3((w + 1) * ObjBuilder.tileSize, 0, h * ObjBuilder.tileSize)); ObjBuilder.AdjFace(Swall, ObjBuilder.FaceToward.S); ObjBuilder.AddWall(wallPrefab, Swall, w, 1); var Ewall = ObjBuilder.AddNode("wall", wall); Ewall.Translate(new Vector3((w + 1) * ObjBuilder.tileSize, 0, -ObjBuilder.tileSize)); ObjBuilder.AdjFace(Ewall, ObjBuilder.FaceToward.W); ObjBuilder.AddWall(wallPrefab, Ewall, h, 1); var Wwall = ObjBuilder.AddNode("wall", wall); Wwall.Translate(ObjBuilder.tileSize, 0, (h) * ObjBuilder.tileSize); ObjBuilder.AdjFace(Wwall, ObjBuilder.FaceToward.E); ObjBuilder.AddWall(wallPrefab, Wwall, h, 1); }
public Vector3Int AddCorridor(Vector3Int pos, int width = 0, int length = 3, FaceToward face = FaceToward.S) { var corridorRoot = ObjBuilder.AddNode("Corridor", dungeonRoot, new Vector3Int((int)(pos.x), (int)(pos.z), (int)(pos.y))); var floorRoot = ObjBuilder.AddNode("Floor", corridorRoot); for (int row = 0; row < length; row++) { for (int col = -width; col <= width; col++) { AddFloor(new Vector3(col, 0, row), floorRoot); } } var wallRoot = ObjBuilder.AddNode("Wall", corridorRoot); for (int i = 0; i < length; i++) { AddWall(wallPrefab, new Vector3Int(-width, 0, i), wallRoot, FaceToward.E); AddWall(wallPrefab, new Vector3Int(width + 1, 0, i), wallRoot, FaceToward.W); } ObjBuilder.AdjFace(corridorRoot, face); switch (face) { case ObjBuilder.FaceToward.S: return(pos + Vector3Int.down * length); case ObjBuilder.FaceToward.N: return(pos + Vector3Int.up * length); case ObjBuilder.FaceToward.E: return(pos + Vector3Int.right * length); case ObjBuilder.FaceToward.W: return(pos + Vector3Int.left * length); } return(pos); }
public void Generator() { grid = new Grid2DInt(mapSize, mapSize); grid.Load(); var border = WaterShed.Run <int>(grid.GetGrid(), Vector2Int.zero, 0, 1); Grid2D <byte> tmpGrid = Grid2D <byte> .Create(grid.Width, grid.Height, 0); Grid2D <int> src = Grid2D <int> .Create(grid.Width, grid.Height, 255); src.data = grid.data; var allfloor = ObjBuilder.AddNode("Floor", transform); var allWall = ObjBuilder.AddNode("Wall", transform); for (int y = 0; y < grid.Height; y++) { for (int x = 0; x < grid.Width; x++) { if (grid[x, y] == 255) { var pos = new Vector3(x, 0, y); var floor = ObjBuilder.AddNode("floor", allfloor, pos); //ObjBuilder.AddObject(floorPack.get(), new Vector3(floorOffset.x, 0, floorOffset.y), floor); var f = ObjBuilder.AddObj(floorPack.get(), Vector3.zero, floor); ObjBuilder.AdjFace2(f.transform, (ObjBuilder.FaceToward)Random.Range(0, 4)); tmpGrid[x, y] = 1; //ToDoAddWall; if (grid.Is(new Vector2Int(x, y) + Vector2Int.up, 0)) { if (border.Is(new Vector2Int(x, y) + Vector2Int.up, 1)) { var wall = ObjBuilder.AddObj(caveWall, pos + new Vector3(0, 0, .5f), allWall.transform); wall.transform.Rotate(new Vector3(0, 180, 0)); tmpGrid[x, y] = 2; } } if (grid.Is(new Vector2Int(x, y) + Vector2Int.down, 0)) { if (border.Is(new Vector2Int(x, y) + Vector2Int.down, 1)) { var wall = ObjBuilder.AddObj(caveWall, pos + new Vector3(0, 0, -.5f), allWall.transform); tmpGrid[x, y] = 3; } } if (grid.Is(new Vector2Int(x, y) + Vector2Int.left, 0)) { if (border.Is(new Vector2Int(x, y) + Vector2Int.left, 1)) { var wall = ObjBuilder.AddObj(caveWall, pos + new Vector3(-.5f, 0, 0), allWall.transform); wall.transform.Rotate(new Vector3(0, 90, 0)); tmpGrid[x, y] = 4; } } if (grid.Is(new Vector2Int(x, y) + Vector2Int.right, 0)) { if (border.Is(new Vector2Int(x, y) + Vector2Int.right, 1)) { var wall = ObjBuilder.AddObj(caveWall, pos + new Vector3(.5f, 0, 0), allWall.transform); wall.transform.Rotate(new Vector3(0, -90, 0)); tmpGrid[x, y] = 5; } } } else { if (grid.Is(new Vector2Int(x, y) + Vector2Int.up, 255) && grid.Is(new Vector2Int(x, y) + Vector2Int.down, 255) && grid.Is(new Vector2Int(x, y) + Vector2Int.left, 255) && grid.Is(new Vector2Int(x, y) + Vector2Int.right, 255)) { var floor = ObjBuilder.AddNode("floor", allfloor, new Vector3(x, 0, y)); ObjBuilder.AddObj(floorPack.get(), new Vector3(floorOffset.x, 0, floorOffset.y), floor); tmpGrid[x, y] = 6; } } } } var renders = allfloor.GetComponentsInChildren <MeshRenderer>(); foreach (var r in renders) { r.gameObject.AddComponent <MeshCollider>().convex = true; if (Random.value < lavaRate) { r.material = material; var l = Instantiate(light, r.transform); l.transform.Translate(new Vector3(-tileSize / 2, 0, tileSize / 2)); } r.material.color = new Color(0.3f, 0.3f, 0.3f, 1); } for (int raw = 0; raw < tmpGrid.Height; raw++) { for (int col = 0; col < tmpGrid.Width; col++) { var pos = new Vector3(col, 0, raw); if (tmpGrid[col, raw] == 6) { ObjBuilder.AddObj(centerCorner, pos, transform); } if (tmpGrid[col, raw] == 1) { if (Random.value < .6f) { var misc = ObjBuilder.AddObj(floorMisc.get(), pos, transform); misc.transform.Translate(new Vector3(Random.Range(-1f, 1f), 0, Random.Range(-1f, 1f)) * tileSize / 2); } } } } }
//public GameObject 墙角死人; //public GameObject 墙上死人; //public GameObject 地上死人; public void AddRoom(DungeonRoom room) { var roomRoot = ObjBuilder.AddNode("Room", dungeonRoot, room.position); var floorRoot = ObjBuilder.AddNode("Floor", roomRoot); for (int row = -room.size.y; row <= room.size.y; row++) { for (int col = -room.size.x; col <= room.size.x; col++) { var floor = AddFloor(new Vector3(col, 0, row), floorRoot); if ((row % 3 == 0) && (col % 2 == 0)) { var light = Instantiate(光源, floor.transform); light.transform.Translate(new Vector3(-tileSize / 2, 0, tileSize / 2)); } else { if (Random.value < 0.3f) { //var dead = Instantiate(地上死人, floor.transform); //dead.transform.Translate(new Vector3(-tileSize / 2, 0.1f, tileSize/ 2)); //dead.transform.Rotate(new Vector3(0, Random.Range(-180, 180), 0)); } } } } //Add Wall var wallRoot = ObjBuilder.AddNode("Wall", roomRoot); var nRoot = ObjBuilder.AddNode("N", wallRoot); nRoot.Translate(new Vector3(-room.size.x * tileSize, 0, -room.size.y * tileSize)); var sRoot = ObjBuilder.AddNode("S", wallRoot); sRoot.Translate(new Vector3(room.size.x * tileSize, 0, (room.size.y + 1) * tileSize)); AdjFace(sRoot, FaceToward.S); var eRoot = ObjBuilder.AddNode("E", wallRoot); eRoot.Translate(new Vector3(-room.size.x * tileSize, 0, room.size.y * tileSize)); AdjFace(eRoot, FaceToward.E); var wRoot = ObjBuilder.AddNode("W", wallRoot); wRoot.Translate(new Vector3((room.size.x + 1) * tileSize, 0, -room.size.y * tileSize)); AdjFace(wRoot, FaceToward.W); AddWall2(wallPrefab, nRoot, room.size.x * 2 + 1, room.size.z); AddWall2(wallPrefab, sRoot, room.size.x * 2 + 1, room.size.z); AddWall2(wallPrefab, eRoot, room.size.y * 2 + 1, room.size.z); AddWall2(wallPrefab, wRoot, room.size.y * 2 + 1, room.size.z); var miscRoot = ObjBuilder.AddNode("Misc", roomRoot); for (int row = 1; row < room.size.y - 1; row++) { for (int col = 1; col < room.size.x - 1; col++) { if (Random.value < 0.1f) { //AddMisc(wallGroundPrefab.get(), new Vector3Int(col, row, 0), floorRoot); } } } }