예제 #1
0
    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;
    }
예제 #2
0
    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;
    }