using Core; using System.Collections.Generic; using UnityEngine; public class MarkerDrawer : MonoBehaviour { public GameObject prefab; [SerializeField] private int Reach = 17; private OnlineMapsControlBase control; private Drawer newDrawe; private void Start() { control = OnlineMapsControlBase.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 = new OnlineMapsMarker(); marker.SetPosition(lng, lat); OnlineMapsMarkerManager.instance.Add(marker); 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 OnlineMapsControlBase control; private GameObject prefab; public Drawer(OnlineMapsControlBase control, GameObject _prefab) { this.control = control; prefab = _prefab; control.OnDrawMarkers += OnDrawMarkers; control.OnMapZoom += OnZoom; } public override void Dispose() { control.OnDrawMarkers -= OnDrawMarkers; control.OnMapZoom -= OnZoom; control = null; } private void OnZoom() { foreach (var marker in OnlineMapsMarkerManager.instance.items) { double px, py; marker.GetPosition(out px, out py); GameObject markerInstance = marker["instance"] as GameObject; var sp = markerInstance.GetComponent(); Vector3 bootomLeft = MapHelper.CastFromGeoCoordinatesToWorld(px, py, control); double nlng, nlat; float dist = Mathf.Sqrt(2 * (2 * 17) * (2 * 17)) / 1000; OnlineMapsUtils.GetCoordinateInDistance(px, py, dist, 45, out nlng, out nlat); Vector3 topRight = MapHelper.CastFromGeoCoordinatesToWorld(nlng, nlat, control); Vector3 newSize = topRight - bootomLeft; var rescale = markerInstance.transform.localScale; rescale.x = newSize.x * rescale.x / sp.bounds.size.x; rescale.y = newSize.y * rescale.y / sp.bounds.size.y; markerInstance.transform.localScale = rescale; } } 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 (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); markerInstance.transform.localScale = Vector3.one; var sp = markerInstance.GetComponent(); Vector3 bootomLeft = CastFromGeoCoordinatesToWorld(px, py, control); double nlng, nlat; float dist = Mathf.Sqrt(2 * (2 * 17) * (2 * 17)) / 1000; OnlineMapsUtils.GetCoordinateInDistance(px, py, dist, 45, out nlng, out nlat); Vector3 topRight = CastFromGeoCoordinatesToWorld(nlng, nlat, control); Vector3 newSize = topRight - bootomLeft; var rescale = markerInstance.transform.localScale; rescale.x = newSize.x * rescale.x / sp.bounds.size.x; rescale.y = newSize.y * rescale.y / sp.bounds.size.y; markerInstance.transform.localScale = rescale; } Vector2 screenPosition = control.GetScreenPosition(px, py); Transform markerTransform = markerInstance.transform; Vector3 point; point = Camera.main.ScreenToWorldPoint(new Vector3(screenPosition.x, screenPosition.y, 0)); markerTransform.position = new Vector3(point.x, point.y, markerTransform.position.z); } private Vector2 CastFromGeoCoordinatesToWorld(double lng, double lat, OnlineMapsControlBase control) { Vector2 worldCoordinates = Vector2.zero; Vector2 screenPosition = control.GetScreenPosition(lng, lat); Vector3 point; point = Camera.main.ScreenToWorldPoint(new Vector3(screenPosition.x, screenPosition.y, 0)); worldCoordinates = new Vector2(point.x, point.y); return worldCoordinates; } } }