using System.Collections.Generic; using System.Linq; using UnityEngine; public class SortMarkersExample:MonoBehaviour { public float initialY = 0.1f; public float step = 0.02f; public GameObject prefab; public int countMarkers = 100; private void Start() { OnlineMaps.instance.OnChangePosition += SortMarkers; OnlineMaps.instance.OnChangeZoom += SortMarkers; // Generate markers // ---------------- Vector2 tl = OnlineMaps.instance.topLeftPosition; Vector2 br = OnlineMaps.instance.bottomRightPosition; for (int i = 0; i < countMarkers; i++) { float lng = Random.Range(tl.x, br.x); float lat = Random.Range(br.y, tl.y); OnlineMapsControlBase3D.instance.AddMarker3D(lng, lat, prefab); } // ------------------ //Initial Sort SortMarkers(); } private void SortMarkers() { IEnumerable markers = OnlineMapsControlBase3D.instance.markers3D.Where(m => m.instance.activeSelf).OrderByDescending(m => m, new MarkerComparer()); float nextStep = initialY; foreach (OnlineMapsMarker3D marker in markers) { Transform child = marker.instance.transform.GetChild(0); Vector3 position = child.localPosition; position.y = nextStep; child.localPosition = position; nextStep += step; } } internal class MarkerComparer : IComparer { public int Compare(OnlineMapsMarkerBase m1, OnlineMapsMarkerBase m2) { double m1x, m1y, m2x, m2y; m1.GetPosition(out m1x, out m1y); m2.GetPosition(out m2x, out m2y); if (m1y > m2y) return 1; if (m1y == m2y) { if (m1x < m2x) return 1; return 0; } return -1; } } }