using System.Collections; using System.Collections.Generic; using UnityEngine; public class UISortByCamera : MonoBehaviour { private Transform myTransform; private List childs = new List(); public Camera camera; public struct Pair { public Transform target; public float distance; public int index; } private void Awake() { myTransform = GetComponent(); if (camera == null) camera = Camera.main; } // Update is called once per frame void Update () { if (camera == null) return; Vector3 cameraPos = camera.transform.position; Vector3 cameraForward = camera.transform.forward; float near = camera.nearClipPlane; childs.Clear(); for(int i = 0, l = myTransform.childCount; i < l; i++) { Transform target = myTransform.GetChild(i); float distance = Vector3.Dot(target.position - cameraPos, cameraForward); childs.Add(new Pair() { target = target, distance = distance, index = i }); } childs.Sort(SortComparerr); for (int i = 0, l = childs.Count; i < l; i++) { if (childs[i].distance >= near) childs[i].target.SetAsLastSibling(); } } private int SortComparerr(Pair a, Pair b) { if (a.distance > b.distance) return -1; if (a.distance < b.distance) return 1; // List.Sort is unstable // so make stable sort with index return a.index - b.index; } }