using UnityEngine; using System.Collections.Generic; using System.Linq; using Mapbox.Unity.Map; using Mapbox.Utils; using System.Collections; using Mapbox.Unity.MeshGeneration.Modifiers; using Mapbox.Unity.MeshGeneration.Data; using Mapbox.Unity.Utilities; namespace Assets.Scenes.Ride.Scripts { public class RouteController : MonoBehaviour { [SerializeField] AbstractMap _map; [SerializeField] MeshModifier SnapModifier; [SerializeField] Material _material; [SerializeField] [Range(1, 10)] private float UpdateFrequency = 2; private int _counter; GameObject _directionsGO; GameObject _mipMapRoute; CyclingController cyclingCotroller; protected virtual void Awake() { if (_map == null) { _map = FindObjectOfType(); } _map.OnInitialized += CreateRoute; _map.OnUpdated += CreateRoute; } public void Start() { cyclingCotroller = transform.parent.GetComponent(); StartCoroutine(QueryTimer()); //CreateRoute(); } protected virtual void OnDestroy() { _map.OnInitialized -= CreateRoute; _map.OnUpdated -= CreateRoute; } public IEnumerator QueryTimer() { while (true) { yield return new WaitForSeconds(UpdateFrequency); CreateRoute(); } } void CreateRoute() { UnityTile tile; bool foundTile = _map.MapVisualizer.ActiveTiles.TryGetValue(Conversions.LatitudeLongitudeToTileId(_map.CenterLatitudeLongitude.x, _map.CenterLatitudeLongitude.y, (int)_map.Zoom), out tile); if (foundTile) { var meshData = new MeshData(); var dat = new List(); var mapData = cyclingCotroller.GetMapData(); if (mapData != null) { foreach (var mapDataItem in mapData.List) { var point = mapDataItem.Point; Vector3 item = _map.GeoToWorldPosition(new Vector2d(point[0], point[1])); item.y += 0.3f; dat.Add(item); } var feat = new VectorFeatureUnity(); feat.Points.Add(dat); //处理海拔高度的问题 SnapModifier.Run(feat, meshData, tile); CreatMapRoute(feat);//创建路线 CreateMiniMapRoute(feat);//创建小地图路线 } } } void CreatMapRoute(VectorFeatureUnity feat) { if (_directionsGO != null) { _directionsGO.Destroy(); } _directionsGO = new GameObject("MapRoute"); var lineRender = _directionsGO.AddComponent(); lineRender.material = new Material(Shader.Find("Sprites/Default")); var dat = feat.Points[0]; ColorUtility.TryParseHtmlString("#FF2742", out Color c); lineRender.endColor = c; lineRender.startColor = c; //设置宽度 lineRender.SetWidth(0.5f, 0.5f); lineRender.SetVertexCount(dat.Count); lineRender.SetPositions(feat.Points[0].ToArray()); //lineRender.numCapVertices = 90; float alpha = 1.0f; //Gradient gradient = new Gradient(); //gradient.SetKeys( // new GradientColorKey[] { new GradientColorKey(Color.green, 0.0f), new GradientColorKey(Color.red, 1.0f) }, // new GradientAlphaKey[] { new GradientAlphaKey(alpha, 0.0f), new GradientAlphaKey(alpha, 1.0f) } //); //lineRender.colorGradient = gradient; lineRender.numCornerVertices = 90; } void CreateMiniMapRoute(VectorFeatureUnity feat) { if (_mipMapRoute != null) { _mipMapRoute.Destroy(); } _mipMapRoute = new GameObject("MiniMapRoute"); var lineRender = _mipMapRoute.AddComponent(); lineRender.material = new Material(Shader.Find("Sprites/Default")); var dat = feat.Points[0]; lineRender.endColor = Color.white; lineRender.startColor = Color.white; //设置宽度 lineRender.SetWidth(3f, 3f); lineRender.SetVertexCount(dat.Count); lineRender.SetPositions(feat.Points[0].ToArray()); //lineRender.numCapVertices = 90; float alpha = 1.0f; //Gradient gradient = new Gradient(); //gradient.SetKeys( // new GradientColorKey[] { new GradientColorKey(Color.green, 0.0f), new GradientColorKey(Color.red, 1.0f) }, // new GradientAlphaKey[] { new GradientAlphaKey(alpha, 0.0f), new GradientAlphaKey(alpha, 1.0f) } //); //lineRender.colorGradient = gradient; lineRender.numCornerVertices = 90; _mipMapRoute.layer = 9; } } }