PrimitiveShapeRadar.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using UnityEngine;
  3. using System.Collections;
  4. using UnityEngine.UI;
  5. namespace Devdog.SciFiDesign.UI
  6. {
  7. [RequireComponent(typeof(RectTransform))]
  8. public class PrimitiveShapeRadar : Graphic
  9. {
  10. [System.Serializable]
  11. public class Element
  12. {
  13. public string name;
  14. public Color vertexColor = Color.white;
  15. [SerializeField]
  16. private float _statValue = 1f;
  17. public float statValue
  18. {
  19. get { return _statValue; }
  20. set { _statValue = value; }
  21. }
  22. /// <summary>
  23. /// Used for interpolation
  24. /// </summary>
  25. public float aimValue { get; set; }
  26. public float startValue { get; set; }
  27. public float animOffset { get; set; }
  28. }
  29. public Element[] elements = new Element[0];
  30. public float scaleFactor = 1f;
  31. public Color centerColor = Color.white;
  32. public AnimationCurve animationCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f);
  33. public float animateSpeed = 1f;
  34. private IEnumerator _valuesCoroutine;
  35. public void AnimateInValues()
  36. {
  37. if (_valuesCoroutine != null)
  38. {
  39. StopCoroutine(_valuesCoroutine);
  40. }
  41. if (gameObject.activeInHierarchy)
  42. {
  43. _valuesCoroutine = _AnimateInValues();
  44. StartCoroutine(_valuesCoroutine);
  45. }
  46. else
  47. {
  48. foreach (var element in elements)
  49. {
  50. element.statValue = element.startValue;
  51. }
  52. }
  53. }
  54. private IEnumerator _AnimateInValues()
  55. {
  56. float offset = 0f;
  57. foreach (var element in elements)
  58. {
  59. element.animOffset = UnityEngine.Random.value;
  60. element.startValue = element.statValue;
  61. offset = Mathf.Max(offset, element.animOffset);
  62. }
  63. float timer = 0f;
  64. while (timer < (1f + offset))
  65. {
  66. timer += Time.deltaTime*animateSpeed;
  67. var curvedTime = animationCurve.Evaluate(timer);
  68. foreach (var element in elements)
  69. {
  70. element.statValue = Mathf.Lerp(element.startValue, element.aimValue, curvedTime);
  71. }
  72. UpdateElements();
  73. yield return null;
  74. }
  75. }
  76. public void UpdateElements()
  77. {
  78. UpdateGeometry();
  79. }
  80. protected override void OnPopulateMesh(VertexHelper vh)
  81. {
  82. var r = GetPixelAdjustedRect();
  83. vh.Clear();
  84. // Center point
  85. vh.AddVert(new Vector3(r.x + r.width / 2f, r.y + r.height / 2f, 0f), centerColor, Vector2.zero);
  86. for (int i = 0; i < elements.Length; i++)
  87. {
  88. float val = ((float)i / elements.Length) * Mathf.PI * 2;
  89. var x = Mathf.Cos(val) * elements[i].statValue * scaleFactor;
  90. var y = Mathf.Sin(val) * elements[i].statValue * scaleFactor;
  91. vh.AddVert(new Vector3(x * r.x, y * r.y), elements[i].vertexColor * color, Vector2.zero);
  92. }
  93. for (int i = 1; i < elements.Length; i++)
  94. {
  95. vh.AddTriangle(i, i + 1, 0); // Both edges + center element.
  96. }
  97. vh.AddTriangle(elements.Length, 1, 0); // Both edges + center element.
  98. }
  99. }
  100. }