private static void CreateRoadPrefab3(List<RoadData> roadDataList, GameObject parent, Vector2 worldCenter, Vector2 worldScale) { var mainPrefab = Resources.Load<GameObject>("RoadNetwork_Grass_pf"); string objectId = "RoadEdge" + Guid.NewGuid().ToString(); var mainObject = UnityEngine.Object.Instantiate(mainPrefab, Vector3.zero, Quaternion.identity); mainObject.name = objectId; var roadBuilderNodes = new List<RoadBuilderNode>(); foreach (var roadData in roadDataList) { if (roadData.Info.ContainsKey("natural")) { continue; } if (roadData.Info.ContainsKey("waterway")) { continue; } if (roadData.Info.ContainsKey("highway")) { if (roadData.Info["highway"].Equals("footway")) { if (!roadData.Info.ContainsKey("width")) { // 歩道で 幅設定がない場合は無視. continue; } } } else { continue; } var positions = roadData.ExteriorPositions.Select(pos => { var lat = (pos.NorthLat - worldCenter.y) * worldScale.y; var lon = (pos.EastLon - worldCenter.x) * worldScale.x; return new Vector2((float)lon, (float)lat); }).ToArray(); for (int i = 0; i < positions.Length; i++) { var roadBuilderNode = new RoadBuilderNode() { Id = string.Format("RoadNode_{0}_{1}_{2}", roadData.Id, i, Guid.NewGuid().ToString()), Position = positions[i] }; if (i != 0) { roadBuilderNode.Links.Add(roadBuilderNodes.Count - 1); } if (i != positions.Length - 1) { roadBuilderNode.Links.Add(roadBuilderNodes.Count + 1); } roadBuilderNodes.Add(roadBuilderNode); } } for (int i = 0; i < roadBuilderNodes.Count; i++) { var target = roadBuilderNodes[i]; var findIndex = roadBuilderNodes.FindIndex(o => { if (o.Ref != -1) { return false; } if (o.Position == target.Position) { return true; } return false; }); if (findIndex < i) { roadBuilderNodes[findIndex].Links.AddRange(target.Links); target.Ref = findIndex; } } // Add var roadNetworkNodes = new Dictionary<string, RoadNetworkNode>(); var data = roadBuilderNodes.Where(o => o.Ref == -1).ToList(); for (int i = 0; i < data.Count; i++) { GameObject child = new GameObject(data[i].Id); child.transform.position = new Vector3( data[i].Position.x, data[i].Position.x * 0.00001f + data[i].Position.y * 0.00001f + 0.1f, data[i].Position.y ); child.transform.parent = mainObject.transform; var roadNetworkNode = child.AddComponent<RoadNetworkNode>(); roadNetworkNodes.Add(data[i].Id, roadNetworkNode); } // セット foreach (var key in roadNetworkNodes.Keys) { var roadNetworkNode = roadNetworkNodes[key]; var d = data.Find(o => o.Id.Equals(key)); roadNetworkNode.Details.Roads = new List<RoadNetworkNode>(); foreach (var o in d.Links) { var a = roadBuilderNodes[o]; if (a.Ref == -1) { roadNetworkNode.Details.Roads.Add(roadNetworkNodes[a.Id]); } else { var b = roadBuilderNodes[a.Ref]; roadNetworkNode.Details.Roads.Add(roadNetworkNodes[b.Id]); } } } foreach (var key in roadNetworkNodes.Keys) { var roadNetworkNode = roadNetworkNodes[key]; var d = data.Find(o => o.Id.Equals(key)); roadNetworkNode.Details.Roads = new List<RoadNetworkNode>(); foreach (var o in d.Links) { var a = roadBuilderNodes[o]; if (a.Ref == -1) { roadNetworkNode.Details.Roads.Add(roadNetworkNodes[a.Id]); } else { var b = roadBuilderNodes[a.Ref]; roadNetworkNode.Details.Roads.Add(roadNetworkNodes[b.Id]); } } } { var roadBuilder = mainObject.GetComponent<RoadBuilder>(); roadBuilder.CrossSectionDetails.RoadWidth = 8.0f; roadBuilder.CrossSectionDetails.WithCurb = false; roadBuilder.CreateCollision = false; roadBuilder.MeshPerNode = true; roadBuilder.DropToGround = false; } mainObject.transform.position += Vector3.up * 1.0f; mainObject.transform.parent = parent.transform; }
private static void CreateRoadPrefab2(List<RoadData> roadDataList, GameObject parent, Vector2 worldCenter, Vector2 worldScale) { var roadBuilderNodes = new List<RoadBuilderNode>(); foreach (var roadData in roadDataList) { if (roadData.Info.ContainsKey("natural")) { continue; } if (roadData.Info.ContainsKey("waterway")) { continue; } if (roadData.Info.ContainsKey("highway")) { if (roadData.Info["highway"].Equals("footway")) { if (!roadData.Info.ContainsKey("width")) { // 歩道で 幅設定がない場合は無視. continue; } } } else { continue; } var positions = roadData.ExteriorPositions.Select(pos => { var lat = (pos.NorthLat - worldCenter.y) * worldScale.y; var lon = (pos.EastLon - worldCenter.x) * worldScale.x; return new Vector2((float)lon, (float)lat); }).ToArray(); for (int i = 0; i < positions.Length; i++) { var roadBuilderNode = new RoadBuilderNode() { Id = string.Format("RoadNode_{0}_{1}", roadData.Id, i), Position = positions[i] }; if (i != 0) { roadBuilderNode.Links.Add(roadBuilderNodes.Count - 1); } if (i != positions.Length - 1) { roadBuilderNode.Links.Add(roadBuilderNodes.Count + 1); } roadBuilderNodes.Add(roadBuilderNode); } } for (int i = 0; i < roadBuilderNodes.Count; i++) { var target = roadBuilderNodes[i]; // if (2 < target.Links.Count) // { // continue; // } var findIndex = roadBuilderNodes.FindIndex(o => { if (o.Ref != -1) { return false; } if (o.Position == target.Position) { return true; } // if (o.Links.Count < 3) // { // return Vector2.Distance(o.Position, target.Position) < 5.0f; // } return false; }); if (findIndex < i) { roadBuilderNodes[findIndex].Links.AddRange(target.Links); target.Ref = findIndex; } } string objectId = "RoadEdge"; var mainObject = new GameObject(); mainObject.name = objectId; // Add var roadNetworkNodes = new Dictionary<string, RoadNetworkNode>(); var data = roadBuilderNodes.Where(o => o.Ref == -1).ToList(); for (int i = 0; i < data.Count; i++) { GameObject child = new GameObject(data[i].Id); child.transform.position = new Vector3( data[i].Position.x, data[i].Position.x * 0.00001f + data[i].Position.y * 0.00001f + 0.1f, data[i].Position.y ); child.transform.parent = mainObject.transform; var roadNetworkNode = child.AddComponent<RoadNetworkNode>(); roadNetworkNodes.Add(data[i].Id, roadNetworkNode); } // セット foreach (var key in roadNetworkNodes.Keys) { var roadNetworkNode = roadNetworkNodes[key]; var d = data.Find(o => o.Id.Equals(key)); roadNetworkNode.Details.Roads = new List<RoadNetworkNode>(); foreach (var o in d.Links) { var a = roadBuilderNodes[o]; if (a.Ref == -1) { roadNetworkNode.Details.Roads.Add(roadNetworkNodes[a.Id]); } else { var b = roadBuilderNodes[a.Ref]; roadNetworkNode.Details.Roads.Add(roadNetworkNodes[b.Id]); } } } var mainPrefab = Resources.Load<GameObject>("RoadNetwork_Grass_pf"); foreach (var key in roadNetworkNodes.Keys) { var node = roadNetworkNodes[key]; if (2 < node.Details.Roads.Count) { var pfObject = UnityEngine.Object.Instantiate(mainPrefab, Vector3.zero, Quaternion.identity); pfObject.transform.parent = mainObject.transform; var roadBuilder = pfObject.GetComponent<RoadBuilder>(); roadBuilder.CrossSectionDetails.RoadWidth = 8.0f; var roadData = roadDataList.Find(r => { return node.transform.name.Contains(r.Id); }); roadBuilder.CrossSectionDetails.RoadWidth = GetWidth(roadData); roadBuilder.CrossSectionDetails.WithCurb = false; roadBuilder.CreateCollision = false; roadBuilder.MeshPerNode = false; roadBuilder.DropToGround = false; var centerNode = new GameObject(); centerNode.name = node.transform.name; centerNode.transform.position = node.transform.position + Vector3.up * 0.01f; centerNode.transform.parent = pfObject.transform; var centerNodeRoadNetworkNode = centerNode.AddComponent<RoadNetworkNode>(); for (int r = 0; r < node.Details.Roads.Count; r++) { RoadNetworkNode innerRoad = node.Details.Roads[r]; var copyNode = new GameObject(); copyNode.name = innerRoad.name; copyNode.transform.position = innerRoad.transform.position + Vector3.up * 0.01f; copyNode.transform.parent = pfObject.transform; var copyNodeRoadNetworkNode = copyNode.AddComponent<RoadNetworkNode>(); centerNodeRoadNetworkNode.Details.Roads.Add(copyNodeRoadNetworkNode); copyNodeRoadNetworkNode.Details.Roads.Add(centerNodeRoadNetworkNode); } node.RemoveLinkFrom(); } } foreach (var key in roadNetworkNodes.Keys) { var node = roadNetworkNodes[key]; if (node.Details.Roads.Count == 0) { node.DeleteNode(); } else { var originalCurveList = new List<RoadNetworkNode>(); originalCurveList.Add(node); { var listCount = -1; while (listCount != originalCurveList.Count) { listCount = originalCurveList.Count; foreach (var road in originalCurveList[0].Details.Roads) { if (originalCurveList.IndexOf(road) == -1) { originalCurveList.Insert(0, road); break; } } foreach (var road in originalCurveList[originalCurveList.Count - 1].Details.Roads) { if (originalCurveList.IndexOf(road) == -1) { originalCurveList.Add(road); break; } } } } var pfObject = UnityEngine.Object.Instantiate(mainPrefab, Vector3.zero, Quaternion.identity); pfObject.transform.parent = mainObject.transform; var roadBuilder = pfObject.GetComponent<RoadBuilder>(); roadBuilder.CrossSectionDetails.RoadWidth = 10.0f; var roadData = roadDataList.Find(r => { return node.transform.name.Contains(r.Id); }); roadBuilder.CrossSectionDetails.RoadWidth = GetWidth(roadData); roadBuilder.CrossSectionDetails.WithCurb = false; roadBuilder.CreateCollision = false; roadBuilder.MeshPerNode = false; roadBuilder.DropToGround = false; var copyCurveList = new List<RoadNetworkNode>(); for (int i = 0; i < originalCurveList.Count; i++) { var copyNode = new GameObject(); copyNode.name = originalCurveList[i].transform.name; copyNode.transform.position = originalCurveList[i].transform.position; copyNode.transform.parent = pfObject.transform; var copyNodeRoadNetworkNode = copyNode.AddComponent<RoadNetworkNode>(); copyCurveList.Add(copyNodeRoadNetworkNode); if (0 < i) { copyCurveList[i - 1].Details.Roads.Add(copyNodeRoadNetworkNode); copyNodeRoadNetworkNode.Details.Roads.Add(copyCurveList[i - 1]); } } for (int i = 0; i < originalCurveList.Count; i++) { originalCurveList[i].RemoveLinkFrom(); } } } mainObject.transform.position += Vector3.up * 1.0f; mainObject.transform.parent = parent.transform; }