SmartLabel.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. namespace UnityCommon
  7. {
  8. public class SmartLabel : MonoBehaviour
  9. {
  10. public static SmartLabel GetSmartLabel(Transform tfTarget, SmartLabelItem smartLabelItemSample, SmartLabelHelperBase helper)
  11. {
  12. var sl = tfTarget.gameObject.AddComponentOnlyOne<SmartLabel>();
  13. sl.Init(smartLabelItemSample, helper);
  14. return sl;
  15. }
  16. private List<SmartLabelItem> listItems = new List<SmartLabelItem>();
  17. Dictionary<Transform, SmartLabelItem> dicItems = new Dictionary<Transform, SmartLabelItem>();
  18. private Canvas canvas;
  19. private Vector3 centerP;
  20. string startCharts = "BiaoZhu_";
  21. List<Transform> listTarget;
  22. private void Init(SmartLabelItem smartLabelItemSample, SmartLabelHelperBase helper)
  23. {
  24. listItems.Clear();
  25. GameObject goUI = new GameObject("UI");
  26. goUI.transform.SetParent(transform, false);
  27. canvas = goUI.AddComponent<Canvas>();
  28. goUI.AddComponent<GraphicRaycaster>();
  29. canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  30. centerP = Utility.GetCenterPosition(transform);
  31. var children = transform.GetComponentsInChildren<Transform>();
  32. listTarget = new List<Transform>();
  33. for (int i = 0; i < children.Length; ++i)
  34. {
  35. var child = children[i];
  36. if (child.name.StartsWith(startCharts))
  37. {
  38. listTarget.Add(child);
  39. //var strName = child.name.Substring(startCharts.Length);
  40. //Transform tfTargetItem = child.transform;
  41. //var goItemLabel = Instantiate(smartLabelItemSample.gameObject);
  42. //goItemLabel.transform.SetParent(goUI.transform, false);
  43. //var smartLabelItem = goItemLabel.GetComponent<SmartLabelItem>();
  44. //smartLabelItem.SetLabel(strName, canvas, tfTargetItem, angle += 15 /*centerP*/);
  45. //smartLabelItem.SetHelper(helper);
  46. //listItems.Add(smartLabelItem);
  47. }
  48. }
  49. SortItems();
  50. dicItems.Clear();
  51. float angle = 0;
  52. for (int i = 0; i < listTarget.Count; ++i)
  53. {
  54. var child = listTarget[i];
  55. var strName = child.name.Substring(startCharts.Length);
  56. Transform tfTargetItem = child.transform;
  57. var goItemLabel = Instantiate(smartLabelItemSample.gameObject);
  58. goItemLabel.transform.SetParent(goUI.transform, false);
  59. var smartLabelItem = goItemLabel.GetComponent<SmartLabelItem>();
  60. smartLabelItem.SetLabel(strName, canvas, tfTargetItem, angle/*centerP*/);
  61. angle += 360 / listTarget.Count;
  62. smartLabelItem.SetHelper(helper);
  63. listItems.Add(smartLabelItem);
  64. dicItems[child] = smartLabelItem;
  65. }
  66. }
  67. private void Update()
  68. {
  69. if (listTarget != null)
  70. {
  71. UpdateAngle();
  72. }
  73. }
  74. private void SortItems()
  75. {
  76. listTarget.Sort(delegate (Transform tf1, Transform tf2)
  77. {
  78. var p1 = Utility.WordPosition2UILocalposition(Camera.main, canvas, tf1.position);
  79. var p2 = Utility.WordPosition2UILocalposition(Camera.main, canvas, tf2.position);
  80. var pCenter = Utility.WordPosition2UILocalposition(Camera.main, canvas, centerP);
  81. var sub = Vector3.up.Angle360(p1) - Vector3.up.Angle360(p2);
  82. if (sub > 0)
  83. return 1;
  84. else if (sub < 0)
  85. return -1;
  86. else
  87. {// =0
  88. if (Vector3.Distance(tf1.position, centerP) - Vector3.Distance(tf2.position, centerP) > 0)
  89. return 1;
  90. else
  91. return -1;
  92. }
  93. });
  94. }
  95. private void UpdateAngle()
  96. {
  97. SortItems();
  98. float angle = 0;
  99. for (int i = 0; i < listTarget.Count; ++i)
  100. {
  101. dicItems[listTarget[i]].SetAngle(angle);
  102. //dicItems[listTarget[i]].SetLabel(i.ToString());
  103. angle += 360 / listTarget.Count;
  104. }
  105. }
  106. private void OnDestroy()
  107. {
  108. Destroy(canvas.gameObject);
  109. canvas = null;
  110. }
  111. public void Show()
  112. {
  113. foreach (var item in listItems)
  114. {
  115. item.Show();
  116. }
  117. }
  118. public void Close()
  119. {
  120. foreach (var item in listItems)
  121. {
  122. item.Hide();
  123. }
  124. }
  125. }
  126. }