// Use this for initialization void Start() { GameObject crossroadsGO = new GameObject("Crossroads"); GameObject segmentsGO = new GameObject("Road Segments"); GameObject districtsGO = new GameObject("Districts"); System.DateTime t1 = System.DateTime.Now; terrainMap = terrainGenerator.GenerateTerrain(terrainGeneratorSeed, null, this); roadNetwork = new RoadNetwork(); System.DateTime t2 = System.DateTime.Now; for (int i = 0; i < agentsList.Length; i++) { agentsList[i].agent.generator = this; if (agentsList[i].enable) { for (int j = 0; j < agentsList[i].runs; j++) { agentsList[i].agent.agentAction(); } } } System.DateTime t3 = System.DateTime.Now; roadMeshGenerator.generateMesh(crossroadsGO, segmentsGO, roadNetwork, this); districtMeshGenerator.generateMesh(districtsGO, districtsMap, this); System.DateTime t4 = System.DateTime.Now; Debug.Log("Terrain generation time: " + (t2 - t1).ToString()); Debug.Log("Agents processing time: " + (t3 - t2).ToString()); Debug.Log("Meshes time: " + (t4 - t3).ToString()); Debug.Log("Road segments: " + roadNetwork.roadSegments.Count); Debug.Log("Crossroads: " + roadNetwork.crossroads.Count); Debug.Log("Districts: " + districtsMap.Count); Debug.Log("City Center: " + cityCenter.ToString()); Debug.Log("Commercial minimal distance: " + DistrictsHelper.getCommercialDistrictsMinimumDistance(this)); Debug.Log("Most far commercial distance: " + DistrictsHelper.getCommercialDistrictsMaximumDistance(this)); terrainGenerator.terrainObject.transform.localScale *= meshScale; crossroadsGO.transform.localScale *= meshScale; segmentsGO.transform.localScale *= meshScale; districtsGO.transform.localScale *= meshScale; }
public override void agentAction() { List <District> residentialDistricts = new List <District>(); foreach (District district in generator.districtsMap) { if (district.type == DistrictType.RESIDENTIAL) { residentialDistricts.Add(district); } } if (residentialDistricts.Count > 0) { District district = residentialDistricts[(int)Random.Range(0, residentialDistricts.Count - 1)]; int count = district.cells.Count; if (district.cells.Count > maxSize || Random.value >= probability * Mathf.Sqrt(1.0f / count)) { return; } float minimumDistancePre = DistrictsHelper.getCommercialDistrictsMinimumDistance(generator); float maximumDistancePre = DistrictsHelper.getCommercialDistrictsMaximumDistance(generator); district.type = DistrictType.COMMERCIAL; float minimumDistancePost = DistrictsHelper.getCommercialDistrictsMinimumDistance(generator); float maximumDistancePost = DistrictsHelper.getCommercialDistrictsMaximumDistance(generator); // Revert changes in case of bad decision if (minimumDistancePost < minimumDistance) { district.type = DistrictType.RESIDENTIAL; } if (maximumDistancePre < maximumDistancePost) { district.type = DistrictType.RESIDENTIAL; } } }