public void Generate(int _type, float size, int _numberOfSites, float _mainRoadWidth, float _sideRoadWidth) { lStreets = new List <GameObject>(); siteGen = GetComponent <SiteGenerator>(); vBuilder = GetComponent <VoronoiBuilder>(); Ground.transform.localScale = new Vector3(size, 0.01f, size); groundRad = size / 2f; numberOfSites = _numberOfSites; mainRoadWidth = _mainRoadWidth; sideRoadWidth = _sideRoadWidth; type = (GenerationType)_type; List <Vector2> sites = new List <Vector2>(); switch (type) { case GenerationType.Orgnic: sites = siteGen.GenerateRandom(new Vector2(Ground.transform.position.x, Ground.transform.position.z), groundRad, width, height, numberOfSites); break; case GenerationType.Circular: sites = siteGen.GenerateCircular(height, width, groundRad, new Vector2(Ground.transform.position.x, Ground.transform.position.z), 3, numberOfSites); break; case GenerationType.Grid: sites = siteGen.GenerateGrid(new Vector2(Ground.transform.position.x, Ground.transform.position.z), groundRad, 400, 400); break; default: break; } List <Edge> vEdges = vBuilder.GenerateVoronoi(sites, new Vector2(Ground.transform.position.x, Ground.transform.position.z), groundRad); int i = 0; for (i = 0; i < vEdges.Count; i++) { // check to see if the curent edge is entirely out of the worldbound if (CheckWholeEdge(vEdges[i])) { continue; } if (!CheckPositiontoWorldBounds(vEdges[i].start)) { Vector2[] inter = EdgeToCircleIntersection(vEdges[i]); float dis1 = Vector2.Distance(vEdges[i].start, inter[0]); float dis2 = Vector2.Distance(vEdges[i].start, inter[1]); if (dis1 < dis2) { vEdges[i].start = inter[0]; } else { vEdges[i].start = inter[1]; } } if (!CheckPositiontoWorldBounds(vEdges[i].end)) { Vector2[] inter = EdgeToCircleIntersection(vEdges[i]); float dis1 = Vector2.Distance(vEdges[i].start, inter[0]); float dis2 = Vector2.Distance(vEdges[i].start, inter[1]); if (dis1 < dis2) { vEdges[i].end = inter[0]; } else { vEdges[i].end = inter[1]; } } GameObject newMainRoad = Instantiate(mainRoadPF, new Vector3(vEdges[i].start.x, 0.1f, vEdges[i].start.y), Quaternion.identity); newMainRoad.GetComponent <MeshBuilderVoronoi>().GenerateMesh(vEdges[i].start, vEdges[i].end, mainRoadWidth); newMainRoad.transform.rotation = Quaternion.LookRotation(new Vector3(vEdges[i].ndir.x, 0, vEdges[i].ndir.y)); newMainRoad.name = vEdges[i].LR; newMainRoad.GetComponent <AttachPoints>().CreateAttachPoints(Vector3.Distance(vEdges[i].start, vEdges[i].end), 5); Vector2 midPoint = new Vector2((vEdges[i].start.x + vEdges[i].end.x) / 2, (vEdges[i].start.y + vEdges[i].end.y) / 2f); Vector2 rotation = Vector2.Perpendicular(vEdges[i].ndir); GameObject t = Instantiate(turtlePf, new Vector3(midPoint.x, 0.1f, midPoint.y), Quaternion.LookRotation(new Vector3(rotation.x, 0, rotation.y))); TurtleController tc = t.GetComponent <TurtleController>(); tc.streeWidth = sideRoadWidth; tc.startStreet = newMainRoad; if (type == GenerationType.Circular) { float disToMid = Vector2.Distance(midPoint, Ground.transform.position); float p = disToMid * 100 / groundRad; int itt = 0; if (p < 33.3f) { itt = 3; } else if (p < 66.6f) { itt = 2; } else { itt = 1; } tc.Generate(itt); } else { tc.Generate(1); } } }