using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace UnityCommon { public class SmartLabel : MonoBehaviour { public static SmartLabel GetSmartLabel(Transform tfTarget, SmartLabelItem smartLabelItemSample, SmartLabelHelperBase helper) { var sl = tfTarget.gameObject.AddComponentOnlyOne(); sl.Init(smartLabelItemSample, helper); return sl; } private List listItems = new List(); Dictionary dicItems = new Dictionary(); private Canvas canvas; private Vector3 centerP; string startCharts = "BiaoZhu_"; List listTarget; private void Init(SmartLabelItem smartLabelItemSample, SmartLabelHelperBase helper) { listItems.Clear(); GameObject goUI = new GameObject("UI"); goUI.transform.SetParent(transform, false); canvas = goUI.AddComponent(); goUI.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; centerP = Utility.GetCenterPosition(transform); var children = transform.GetComponentsInChildren(); listTarget = new List(); for (int i = 0; i < children.Length; ++i) { var child = children[i]; if (child.name.StartsWith(startCharts)) { listTarget.Add(child); //var strName = child.name.Substring(startCharts.Length); //Transform tfTargetItem = child.transform; //var goItemLabel = Instantiate(smartLabelItemSample.gameObject); //goItemLabel.transform.SetParent(goUI.transform, false); //var smartLabelItem = goItemLabel.GetComponent(); //smartLabelItem.SetLabel(strName, canvas, tfTargetItem, angle += 15 /*centerP*/); //smartLabelItem.SetHelper(helper); //listItems.Add(smartLabelItem); } } SortItems(); dicItems.Clear(); float angle = 0; for (int i = 0; i < listTarget.Count; ++i) { var child = listTarget[i]; var strName = child.name.Substring(startCharts.Length); Transform tfTargetItem = child.transform; var goItemLabel = Instantiate(smartLabelItemSample.gameObject); goItemLabel.transform.SetParent(goUI.transform, false); var smartLabelItem = goItemLabel.GetComponent(); smartLabelItem.SetLabel(strName, canvas, tfTargetItem, angle/*centerP*/); angle += 360 / listTarget.Count; smartLabelItem.SetHelper(helper); listItems.Add(smartLabelItem); dicItems[child] = smartLabelItem; } } private void Update() { if (listTarget != null) { UpdateAngle(); } } private void SortItems() { listTarget.Sort(delegate (Transform tf1, Transform tf2) { var p1 = Utility.WordPosition2UILocalposition(Camera.main, canvas, tf1.position); var p2 = Utility.WordPosition2UILocalposition(Camera.main, canvas, tf2.position); var pCenter = Utility.WordPosition2UILocalposition(Camera.main, canvas, centerP); var sub = Vector3.up.Angle360(p1) - Vector3.up.Angle360(p2); if (sub > 0) return 1; else if (sub < 0) return -1; else {// =0 if (Vector3.Distance(tf1.position, centerP) - Vector3.Distance(tf2.position, centerP) > 0) return 1; else return -1; } }); } private void UpdateAngle() { SortItems(); float angle = 0; for (int i = 0; i < listTarget.Count; ++i) { dicItems[listTarget[i]].SetAngle(angle); //dicItems[listTarget[i]].SetLabel(i.ToString()); angle += 360 / listTarget.Count; } } private void OnDestroy() { Destroy(canvas.gameObject); canvas = null; } public void Show() { foreach (var item in listItems) { item.Show(); } } public void Close() { foreach (var item in listItems) { item.Hide(); } } } }