コード例 #1
0
        public static void CreateAreaMesh(Utility.PositionSetList areaSet, Action <CreateRoadMeshScripts.MeshSet> action)
        {
            var verticesList  = new List <Vector3>();
            var trianglesList = new List <int>();
            var uvList        = new List <Vector2>();

            while (areaSet.Count != 2)
            {
                var index = verticesList.Count;
                // 最東を選ぶ
                var tri  = areaSet.GetSortedList()[0];
                var next = areaSet.FindByIndex(tri.NextIndex);
                var prev = areaSet.FindByIndex(tri.PrevIndex);
                // 最東から内側のメッシュ生成する
                verticesList.Add(tri.position);
                verticesList.Add(next.position);
                verticesList.Add(prev.position);
                CreateRoadMeshScripts.AddTrianglesList(verticesList, trianglesList, index + 0, index + 1, index + 2, Vector3.up);
                uvList.Add(new Vector2(0, 0));
                uvList.Add(new Vector2(1, 0));
                uvList.Add(new Vector2(1, 1));
                // 選んだ頂点を減らす。
                areaSet.RemoveSortedListFirst();
            }

            CreateRoadMeshScripts.CreateMeshSet(verticesList, trianglesList, uvList, action);
        }
コード例 #2
0
        /// <summary>
        /// 道データから道を表現する。
        /// </summary>
        /// <param name="roadDatas">Road datas.</param>
        /// <param name="parent">親オブジェクト</param>
        /// <param name="worldCenter">Unity の中心座標.</param>
        /// <param name="worldScale">Unity の表現スケール.</param>
        /// <param name="roadType">道の表現(RoadType.LINE or RoadType.MESH).</param>
        public static void CreateNodeMapFromListRoadData(List <RoadDataModel> roadDatas, GameObject parent, Vector2 worldCenter, Vector2 worldScale, RoadType roadType = RoadType.LINE)
        {
            var        transformFindResult = parent.transform.Find("nodeMapRoot");
            GameObject root;

            if (transformFindResult == null)
            {
                root = new GameObject("nodeMapRoot");
            }
            else
            {
                root = transformFindResult.gameObject;
            }

            root.transform.parent = parent.transform;

            if (roadType == RoadType.LINE)
            {
                for (int i = 0; i < roadDatas.Count; i++)
                {
                    var roadData = roadDatas[i];
                    CreateHighwayLine(roadData, root, worldCenter, worldScale);
#if UNITY_EDITOR
                    if (i % 100 == 0)
                    {
                        UnityEditor.EditorUtility.DisplayProgressBar("CreateRoadLineFromListRoadData",
                                                                     string.Format("CreateRoadLineFromListRoadData {0} / {1}", i, roadDatas.Count),
                                                                     (i * 1.0f) / roadDatas.Count);
                    }
#endif
                }
            }
            else
            {
                var meshSets = new List <CreateRoadMeshScripts.MeshSet>();

                for (int i = 0; i < roadDatas.Count; i++)
                {
                    var roadData = roadDatas[i];

                    if (!roadData.InfoList.FullInfoList.ContainsKey("highway"))
                    {
                        continue;
                    }

                    var positions = roadData.Positions.Select(pos =>
                    {
                        var height = 2.0f;
                        return(new Vector3(
                                   (pos.Position.EastLon - worldCenter.x) * worldScale.x,
                                   height,
                                   (pos.Position.NorthLat - worldCenter.y) * worldScale.y
                                   ));
                    }).ToList();
                    CreateRoadMeshScripts.CreateCurve(positions, 6.0f, CreateRoadMeshScripts.CreateAddToMeshSetListCallback(meshSets));
#if UNITY_EDITOR
                    if (i % 100 == 0)
                    {
                        UnityEditor.EditorUtility.DisplayProgressBar("CreateRoadLineFromListRoadData",
                                                                     string.Format("CreateRoadLineFromListRoadData {0} / {1}", i, roadDatas.Count),
                                                                     (i * 1.0f) / roadDatas.Count);
                    }
#endif
                }

                var combinedMesh = CreateRoadMeshScripts.GetCombinedMesh(meshSets);

                for (int i = 0; i < combinedMesh.Count; i++)
                {
                    var  meshSet      = combinedMesh[i];
                    Mesh mesh         = meshSet.CreateMesh();
                    var  obj          = new GameObject("RoadMesh");
                    var  meshFilter   = obj.AddComponent <MeshFilter>();
                    var  meshRenderer = obj.AddComponent <MeshRenderer>();
                    meshFilter.sharedMesh = mesh;
                    // TODO: マテリアルの外部設定.
                    meshRenderer.sharedMaterial = Resources.Load <Material>("TileMaterial");
                    obj.transform.SetParent(root.transform);
                }
            }

#if UNITY_EDITOR
            UnityEditor.EditorUtility.ClearProgressBar();
#endif
        }