using System.Collections.Generic; using UnityEngine; public class DrawComplexPoly:MonoBehaviour { public Material borderMaterial; public float y = 1; public float width = 5; private GameObject polyGO; private List points; private OnlineMapsTileSetControl control; private OnlineMaps map; private LineRenderer lineRenderer; private Vector3 firstPoint; private bool needUpdatePosition; private bool needRedrawLine; private void DrawPoly() { if (polyGO == null) InitGameObject(); Vector3[] localPoints = new Vector3[points.Count]; for (int i = 0; i < points.Count; i++) { OnlineMapsVector2d p = points[i]; localPoints[i] = control.GetWorldPosition(p.x, p.y); } firstPoint = localPoints[0]; for (int i = 0; i < localPoints.Length; i++) localPoints[i] -= firstPoint; lineRenderer.positionCount = localPoints.Length; lineRenderer.SetPositions(localPoints); needUpdatePosition = true; } private void InitGameObject() { polyGO = new GameObject("Poly"); polyGO.transform.SetParent(transform); lineRenderer = polyGO.AddComponent(); lineRenderer.useWorldSpace = false; lineRenderer.startWidth = lineRenderer.endWidth = width; lineRenderer.loop = true; lineRenderer.sharedMaterial = borderMaterial; } private void OnChangePosition() { needUpdatePosition = true; } private void OnChangeZoom() { needRedrawLine = true; } private void OnRequestComplete(OnlineMapsWWW www) { OnlineMapsJSONItem json = OnlineMapsJSON.Parse(www.text); points = new List(); OnlineMapsJSONItem items = json["features/0/geometry/coordinates/0"]; foreach (OnlineMapsJSONItem c in items) { OnlineMapsVector2d p = new OnlineMapsVector2d(c[0].V(), c[1].V()); points.Add(p); } needRedrawLine = true; map.OnChangePosition += OnChangePosition; map.OnChangeZoom += OnChangeZoom; control.OnMeshUpdated += OnMeshUpdated; map.Redraw(); } private void OnMeshUpdated() { if (needRedrawLine) { DrawPoly(); needRedrawLine = false; } if (needUpdatePosition) { polyGO.transform.localPosition = control.GetWorldPosition(points[0]) + new Vector3(0, y, 0); needUpdatePosition = false; } } private void Start() { map = OnlineMaps.instance; control = OnlineMapsTileSetControl.instance; new OnlineMapsWWW("http://umap.openstreetmap.fr/en/datalayer/442532/").OnComplete += OnRequestComplete; } }