TextGradient.cs 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using System.Collections.Generic;
  5. namespace GameStartStudio
  6. {
  7. public enum GradientDirection
  8. {
  9. Vertical,
  10. Horizontal,
  11. LeftUpToRightDown,
  12. LeftDownToRightUp
  13. }
  14. [RequireComponent(typeof(Text))]
  15. public class TextGradient : BaseMeshEffect
  16. {
  17. // 每个字符默认的顶点数量
  18. private const int DefaultVertexNumPerFont = 6;
  19. public Color32 startColor = Color.white;
  20. public Color32 endColor = Color.black;
  21. public GradientDirection direction;
  22. private readonly List<UIVertex> _vertexBuffers = new List<UIVertex> ();
  23. // 给顶点着色
  24. private static void ModifyVertexColor(IList<UIVertex> vertexList, int index, Color color)
  25. {
  26. UIVertex uiVertex = vertexList[index];
  27. uiVertex.color = color;
  28. vertexList[index] = uiVertex;
  29. }
  30. public override void ModifyMesh(VertexHelper vh)
  31. {
  32. if (!IsActive())
  33. {
  34. return;
  35. }
  36. vh.GetUIVertexStream(_vertexBuffers);
  37. Debug.Log(_vertexBuffers.Count);
  38. int count = _vertexBuffers.Count;
  39. if (count > 0)
  40. {
  41. for (int i = 0; i < count; i += DefaultVertexNumPerFont)
  42. {
  43. switch (direction)
  44. {
  45. case GradientDirection.Vertical:
  46. ModifyVertexColor(_vertexBuffers, i, startColor);
  47. ModifyVertexColor(_vertexBuffers, i + 1, startColor);
  48. ModifyVertexColor(_vertexBuffers, i + 2, endColor);
  49. ModifyVertexColor(_vertexBuffers, i + 3, endColor);
  50. ModifyVertexColor(_vertexBuffers, i + 4, endColor);
  51. ModifyVertexColor(_vertexBuffers, i + 5, startColor);
  52. break;
  53. case GradientDirection.Horizontal:
  54. ModifyVertexColor(_vertexBuffers, i, startColor);
  55. ModifyVertexColor(_vertexBuffers, i + 1, endColor);
  56. ModifyVertexColor(_vertexBuffers, i + 2, endColor);
  57. ModifyVertexColor(_vertexBuffers, i + 3, endColor);
  58. ModifyVertexColor(_vertexBuffers, i + 4, startColor);
  59. ModifyVertexColor(_vertexBuffers, i + 5, startColor);
  60. break;
  61. case GradientDirection.LeftUpToRightDown:
  62. ModifyVertexColor(_vertexBuffers, i, startColor);
  63. ModifyVertexColor(_vertexBuffers, i + 1, endColor);
  64. ModifyVertexColor(_vertexBuffers, i + 2, startColor);
  65. ModifyVertexColor(_vertexBuffers, i + 3, startColor);
  66. ModifyVertexColor(_vertexBuffers, i + 4, endColor);
  67. ModifyVertexColor(_vertexBuffers, i + 5, startColor);
  68. break;
  69. case GradientDirection.LeftDownToRightUp:
  70. ModifyVertexColor(_vertexBuffers, i, endColor);
  71. ModifyVertexColor(_vertexBuffers, i + 1, startColor);
  72. ModifyVertexColor(_vertexBuffers, i + 2, endColor);
  73. ModifyVertexColor(_vertexBuffers, i + 3, endColor);
  74. ModifyVertexColor(_vertexBuffers, i + 4, startColor);
  75. ModifyVertexColor(_vertexBuffers, i + 5, endColor);
  76. break;
  77. default:
  78. throw new ArgumentOutOfRangeException();
  79. }
  80. }
  81. }
  82. vh.Clear();
  83. vh.AddUIVertexTriangleStream(_vertexBuffers);
  84. }
  85. }
  86. }