| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- 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<SmartLabel>();
- sl.Init(smartLabelItemSample, helper);
- return sl;
- }
- private List<SmartLabelItem> listItems = new List<SmartLabelItem>();
- Dictionary<Transform, SmartLabelItem> dicItems = new Dictionary<Transform, SmartLabelItem>();
- private Canvas canvas;
- private Vector3 centerP;
- string startCharts = "BiaoZhu_";
- List<Transform> listTarget;
- private void Init(SmartLabelItem smartLabelItemSample, SmartLabelHelperBase helper)
- {
- listItems.Clear();
- GameObject goUI = new GameObject("UI");
- goUI.transform.SetParent(transform, false);
- canvas = goUI.AddComponent<Canvas>();
- goUI.AddComponent<GraphicRaycaster>();
- canvas.renderMode = RenderMode.ScreenSpaceOverlay;
- centerP = Utility.GetCenterPosition(transform);
- var children = transform.GetComponentsInChildren<Transform>();
- listTarget = new List<Transform>();
- 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>();
- //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>();
- 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();
- }
- }
- }
- }
|