using Mapbox.Unity.Map; using Mapbox.Unity.MeshGeneration.Data; using Mapbox.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace Assets.Scenes.Ride.Scripts { public class InitMiniMapProvider : MonoBehaviour { [SerializeField] AbstractMap _map; [SerializeField] Camera _minicamera; [SerializeField] GameObject _player; CyclingController cyclingCotroller; public PlayerController playerController; GameObject _mipMapRoute; void Start() { cyclingCotroller = FindObjectOfType(); //playerController = FindObjectOfType(); if (cyclingCotroller != null) { var mapdata = cyclingCotroller.GetMapData(); //初始化map //var point = cyclingCotroller.GetCenterCoordinate(); if (_map != null && mapdata !=null) { _map.OnInitialized += _map_OnInitialized; _map.OnUpdated += _map_OnUpdated; _map.Initialize(new Vector2d(mapdata.Center[0], mapdata.Center[1]), 12); var bbox = mapdata.Bbox; var targetbounds = new Vector2dBounds(new Vector2d(bbox[1], bbox[0]), new Vector2d(bbox[3], bbox[2])); var screenBounds = GetScreenBounds(); var z = SetZoomToFitBounds(targetbounds, screenBounds); } } } private void Update() { if (playerController != null) { var tr=transform.parent.Find("SingleUI/Panel/Image"); _player.transform.localPosition = _map.GeoToWorldPosition(playerController.Currentlatlong); ((RectTransform)tr.transform).position = _minicamera.WorldToScreenPoint(_player.transform.localPosition); //((RectTransform)tr).localPosition = _minicamera.WorldToViewportPoint(_player.transform.localPosition); } } private bool init = false; private void _map_OnInitialized() { init = true; var visualizer = _map.MapVisualizer; visualizer.OnMapVisualizerStateChanged += (s) => { if (s == ModuleState.Finished) { } }; } #region Camera 自适应 /// /// https://github.com/mapbox/mapbox-unity-sdk/issues/1580 /// /// 路线的边界 /// 小地图边界 private int SetZoomToFitBounds(Vector2dBounds targetBounds, Vector2dBounds screenBounds) { var targetLonDelta = targetBounds.East - targetBounds.West; var targetLatDelta = targetBounds.North - targetBounds.South; var screenLonDelta = screenBounds.East - screenBounds.West; var screenLatDelta = screenBounds.North - screenBounds.South; var zoomLatMultiplier = screenLatDelta / targetLatDelta; var zoomLonMultiplier = screenLonDelta / targetLonDelta; var latZoom = Math.Log(zoomLatMultiplier, 2); var lonZoom = Math.Log(zoomLonMultiplier, 2); var zoom = (float)(_map.Zoom + Math.Min(latZoom, lonZoom)); _map.SetZoom((float)Math.Floor(zoom)); _map.UpdateMap(); return (int)Math.Floor(zoom); } private Vector2dBounds GetScreenBounds() { var screenWidth = UnityEngine.Screen.width; var screenHeight = UnityEngine.Screen.height; var sw_world = _minicamera.ViewportToWorldPoint(new Vector3(0.25f, 0.1f, 160)); var sw = _map.WorldToGeoPosition(sw_world); var ne_world = _minicamera.ViewportToWorldPoint(new Vector3(0.75f, 0.9f, 90)); var ne = _map.WorldToGeoPosition(ne_world); return new Vector2dBounds(new Vector2d(sw.x, sw.y), new Vector2d(ne.x, ne.y)); } #endregion #region 创建小地图路线 private void _map_OnUpdated() { CreateMiniRoute(); } void CreateMiniRoute() { var meshData = new MeshData(); var dat = new List(); var mapData = cyclingCotroller.GetMapData(); if (mapData != null) { var count = mapData.List.Count; var interval = Math.Max(Math.Ceiling(count / 100D),1f); for (int i = 0; i < mapData.List.Count; i++) { if(i% interval == 0) { var point = mapData.List[i].Point; Vector3 item = _map.GeoToWorldPosition(new Vector2d(point[0], point[1])); item.y += 1f; dat.Add(item); } } var feat = new VectorFeatureUnity(); feat.Points.Add(dat); CreateLineRender(feat);//创建小地图路线 } } //创建小地图路线 void CreateLineRender(VectorFeatureUnity feat) { if (_mipMapRoute != null) { _mipMapRoute.Destroy(); } _mipMapRoute = new GameObject("MiniMapRoute"); _mipMapRoute.transform.parent = transform; var lineRender = _mipMapRoute.AddComponent(); lineRender.material = Instantiate(Resources.Load("UI/Material/1")); var dat = feat.Points[0]; lineRender.endColor = Color.white; lineRender.startColor = Color.white; //设置宽度 lineRender.startWidth = 10f; lineRender.endWidth = 10f; lineRender.positionCount = dat.Count; lineRender.SetPositions(feat.Points[0].ToArray()); lineRender.numCornerVertices = 20; lineRender.numCapVertices = 20; lineRender.loop = false; _mipMapRoute.layer = 9; } #endregion } }