powerfun-unity/Assets/Scenes/Ride/Scripts/RouteController.cs
2021-03-23 16:07:31 +08:00

123 lines
2.5 KiB
C#

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<AbstractMap>();
}
_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<Vector3>();
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<MeshFilter>().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<MeshRenderer>().material = _material;
return _directionsGO;
}
}
}