using System.Collections.Generic; using UnityEngine; public class MarkerDrawer : MonoBehaviour { public GameObject prefab; [SerializeField] private int Reach = 17; /// /// Coefficient of scaling of markers for zoom = 20. /// It can be a constant or be pre-calculated depending on your needs. /// private static float coof = 256; private OnlineMapsTileSetControl control; private Drawer newDrawe; private void Start() { control = OnlineMapsTileSetControl.instance; newDrawe = new Drawer(control, prefab); control.markerDrawer = newDrawe; control.OnMapClick += OnClick; } private void OnDisable() { control.OnMapClick -= OnClick; } private void OnClick() { double lng, lat; control.GetCoords(out lng, out lat); DrawRect(lng, lat); } private void DrawRect(double lng, double lat) { double nlng, nlat; float dist = Mathf.Sqrt(2 * (2 * Reach) * (2 * Reach)) / 1000; OnlineMapsUtils.GetCoordinateInDistance(lng, lat, dist / 2, 45, out nlng, out nlat); double blng, blat; OnlineMapsUtils.GetCoordinateInDistance(lng, lat, dist / 2, 225, out blng, out blat); var marker = OnlineMapsMarkerManager.instance.Create(lng, lat); marker.SetPosition(lng, lat); marker.scale = 1 / Mathf.Pow(2, 19 - OnlineMaps.instance.floatZoom); List points = new List(); points.Add(new Vector2((float)blng, (float)blat)); points.Add(new Vector2((float)blng, (float)nlat)); points.Add(new Vector2((float)nlng, (float)nlat)); points.Add(new Vector2((float)nlng, (float)blat)); points.Add(new Vector2((float)blng, (float)blat)); OnlineMapsDrawingElementManager.instance.Add(new OnlineMapsDrawingLine(points)); } public class Drawer : OnlineMapsMarker2DDrawer { private OnlineMapsTileSetControl control; private GameObject prefab; public Drawer(OnlineMapsTileSetControl control, GameObject _prefab) { this.control = control; prefab = _prefab; control.OnDrawMarkers += OnDrawMarkers; // control.OnMapZoom will not work when changing the zoom using the inspector. map.OnChangeZoom += OnZoom; } public override void Dispose() { control.OnDrawMarkers -= OnDrawMarkers; control.OnMapZoom -= OnZoom; control = null; } private void OnZoom() { float scale = 1 / Mathf.Pow(2, 19 - map.floatZoom); foreach (var marker in OnlineMapsMarkerManager.instance.items) { marker.scale = scale; } } private void OnDrawMarkers() { double tlx, tly, brx, bry; map.GetCorners(out tlx, out tly, out brx, out bry); foreach (OnlineMapsMarker marker in OnlineMapsMarkerManager.instance.items) { DrawMarker(marker, tlx, tly, brx, bry); } } private void DrawMarker(OnlineMapsMarker marker, double tlx, double tly, double brx, double bry) { double px, py; marker.GetPosition(out px, out py); GameObject markerInstance = marker["instance"] as GameObject; if (marker.scale < 0.01f || px < tlx || px > brx || py < bry || py > tly) { if (markerInstance != null) { OnlineMapsUtils.Destroy(markerInstance); marker["instance"] = null; } return; } if (markerInstance == null) { marker["instance"] = markerInstance = Instantiate(prefab); markerInstance.transform.SetParent(control.transform); } float scale = coof * marker.scale; markerInstance.transform.localScale = new Vector3(scale, scale, scale); double lng, lat; marker.GetPosition(out lng, out lat); markerInstance.transform.position = control.GetWorldPosition(lng, lat); } } }