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; namespace Assets.Scenes.Ride.Scripts { public class RouteController : MonoBehaviour { [SerializeField] AbstractMap _map; [SerializeField] MeshModifier[] MeshModifiers; [SerializeField] Material _material; [SerializeField] [Range(1, 10)] private float UpdateFrequency = 2; private int _counter; GameObject _directionsGO; protected virtual void Awake() { if (_map == null) { _map = FindObjectOfType(); } _map.OnInitialized += CreateRoute; _map.OnUpdated += CreateRoute; } public void Start() { foreach (var modifier in MeshModifiers) { modifier.Initialize(); } StartCoroutine(QueryTimer()); } protected virtual void OnDestroy() { _map.OnInitialized -= CreateRoute; _map.OnUpdated -= CreateRoute; } public IEnumerator QueryTimer() { while (true) { yield return new WaitForSeconds(UpdateFrequency); CreateRoute(); } } void CreateRoute() { var meshData = new MeshData(); var dat = new List(); var mapData = GameManger.MapData; 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.4f; dat.Add(item); } var feat = new VectorFeatureUnity(); feat.Points.Add(dat); foreach (MeshModifier mod in MeshModifiers.Where(x => x.Active)) { mod.Run(feat, meshData, _map.WorldRelativeScale * 8); } CreateGameObject(meshData); } } GameObject CreateGameObject(MeshData data) { if (_directionsGO != null) { _directionsGO.Destroy(); } _directionsGO = new GameObject("MapRoute"); var mesh = _directionsGO.AddComponent().mesh; mesh.subMeshCount = data.Triangles.Count; mesh.SetVertices(data.Vertices); _counter = data.Triangles.Count; for (int i = 0; i < _counter; i++) { var triangle = data.Triangles[i]; mesh.SetTriangles(triangle, i); } _counter = data.UV.Count; for (int i = 0; i < _counter; i++) { var uv = data.UV[i]; mesh.SetUVs(i, uv); } mesh.RecalculateNormals(); _directionsGO.AddComponent().material = _material; return _directionsGO; } } }