UIGradient.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using UnityEngine.UI;
  6. public class UIGradient : BaseMeshEffect
  7. {
  8. [SerializeField]
  9. private DirType _dir = DirType.Vertical;
  10. [SerializeField]
  11. private BlendType _blend = BlendType.Override;
  12. [SerializeField, Range(-1, 1)]
  13. private float _offset = 0f;
  14. [SerializeField]
  15. private Gradient _gradient = new Gradient() { colorKeys = new GradientColorKey[] { new GradientColorKey(Color.black, 0), new GradientColorKey(Color.white, 1) } };
  16. public override void ModifyMesh(VertexHelper vh)
  17. {
  18. if (!IsActive() || vh.currentVertCount == 0)
  19. {
  20. return;
  21. }
  22. var vertexs = new List<UIVertex>();
  23. vh.GetUIVertexStream(vertexs);
  24. bool isX = true;
  25. switch (_dir)
  26. {
  27. case DirType.Horizontal:
  28. isX = true;
  29. break;
  30. case DirType.Vertical:
  31. isX = false;
  32. break;
  33. default:
  34. break;
  35. }
  36. var inverseLength = GetInverseLength(vertexs, isX, out float min, out float max);
  37. var vertex = new UIVertex();
  38. for (int i = 0; i < vh.currentVertCount; i++)
  39. {
  40. vh.PopulateUIVertex(ref vertex, i);
  41. vertex.color = BlendColor(vertex.color, _gradient.Evaluate((isX ? (vertex.position.x - min) : (vertex.position.y - min)) * inverseLength - _offset), _blend);
  42. vh.SetUIVertex(vertex, i);
  43. }
  44. }
  45. // ÈôisXÊÇfalse£¬ÔòÈÏΪÊÇy
  46. private float GetInverseLength(List<UIVertex> vertexs, bool isX, out float min, out float max)
  47. {
  48. float inverseLength = 0;
  49. min = isX ? vertexs[0].position.x : vertexs[0].position.y;
  50. max = min;
  51. for (int i = 1; i < vertexs.Count; i++)
  52. {
  53. var temp = isX ? vertexs[i].position.x : vertexs[i].position.y;
  54. if (temp > max)
  55. {
  56. max = temp;
  57. }
  58. else if (temp < min)
  59. {
  60. min = temp;
  61. }
  62. }
  63. inverseLength = 1 / (max - min);
  64. return inverseLength;
  65. }
  66. private Color BlendColor(Color originalColor, Color newColor, BlendType blendType)
  67. {
  68. var ret = newColor;
  69. switch (blendType)
  70. {
  71. case BlendType.Override: ret = newColor; break;
  72. case BlendType.Add: ret = originalColor + newColor; break;
  73. case BlendType.Multiply: ret = originalColor * newColor; break;
  74. default: break;
  75. }
  76. return ret;
  77. }
  78. private enum DirType
  79. {
  80. None,
  81. Horizontal,
  82. Vertical,
  83. }
  84. private enum BlendType
  85. {
  86. None,
  87. Override,
  88. Add,
  89. Multiply
  90. }
  91. }