Tanoda
Gradient.cs
Go to the documentation of this file.
1
3
4using System.Collections.Generic;
5
7{
8 [AddComponentMenu("UI/Effects/Extensions/Gradient")]
9 public class Gradient : BaseMeshEffect
10 {
11 [SerializeField]
12 private GradientMode _gradientMode = GradientMode.Global;
13 [SerializeField]
14 private GradientDir _gradientDir = GradientDir.Vertical;
15 [SerializeField]
16 private bool _overwriteAllColor = false;
17 [SerializeField]
18 private Color _vertex1 = Color.white;
19 [SerializeField]
20 private Color _vertex2 = Color.black;
21 private Graphic targetGraphic;
22
23 #region Properties
24 public GradientMode GradientMode { get { return _gradientMode; } set { _gradientMode = value; graphic.SetVerticesDirty(); } }
25 public GradientDir GradientDir { get { return _gradientDir; } set { _gradientDir = value; graphic.SetVerticesDirty(); } }
26 public bool OverwriteAllColor { get { return _overwriteAllColor; } set { _overwriteAllColor = value; graphic.SetVerticesDirty(); } }
27 public Color Vertex1 { get { return _vertex1; } set { _vertex1 = value; graphic.SetAllDirty(); } }
28 public Color Vertex2 { get { return _vertex2; } set { _vertex2 = value; graphic.SetAllDirty(); } }
29 #endregion
30
31 protected override void Awake()
32 {
33 targetGraphic = GetComponent<Graphic>();
34 }
35
36 public override void ModifyMesh(VertexHelper vh)
37 {
38 int count = vh.currentVertCount;
39 if (!IsActive() || count == 0)
40 {
41 return;
42 }
43 var vertexList = new List<UIVertex>();
44 vh.GetUIVertexStream(vertexList);
45 UIVertex uiVertex = new UIVertex();
46 if (_gradientMode == GradientMode.Global)
47 {
48 if (_gradientDir == GradientDir.DiagonalLeftToRight || _gradientDir == GradientDir.DiagonalRightToLeft)
49 {
50#if UNITY_EDITOR
51 Debug.LogWarning("Diagonal dir is not supported in Global mode");
52#endif
53 _gradientDir = GradientDir.Vertical;
54 }
55 float bottomY = _gradientDir == GradientDir.Vertical ? vertexList[vertexList.Count - 1].position.y : vertexList[vertexList.Count - 1].position.x;
56 float topY = _gradientDir == GradientDir.Vertical ? vertexList[0].position.y : vertexList[0].position.x;
57
58 float uiElementHeight = topY - bottomY;
59
60 for (int i = 0; i < count; i++)
61 {
62 vh.PopulateUIVertex(ref uiVertex, i);
63 if (!_overwriteAllColor && uiVertex.color != targetGraphic.color)
64 continue;
65 uiVertex.color *= Color.Lerp(_vertex2, _vertex1, ((_gradientDir == GradientDir.Vertical ? uiVertex.position.y : uiVertex.position.x) - bottomY) / uiElementHeight);
66 vh.SetUIVertex(uiVertex, i);
67 }
68 }
69 else
70 {
71 for (int i = 0; i < count; i++)
72 {
73 vh.PopulateUIVertex(ref uiVertex, i);
74 if (!_overwriteAllColor && !CompareCarefully(uiVertex.color, targetGraphic.color))
75 continue;
76 switch (_gradientDir)
77 {
78 case GradientDir.Vertical:
79 uiVertex.color *= (i % 4 == 0 || (i - 1) % 4 == 0) ? _vertex1 : _vertex2;
80 break;
81 case GradientDir.Horizontal:
82 uiVertex.color *= (i % 4 == 0 || (i - 3) % 4 == 0) ? _vertex1 : _vertex2;
83 break;
84 case GradientDir.DiagonalLeftToRight:
85 uiVertex.color *= (i % 4 == 0) ? _vertex1 : ((i - 2) % 4 == 0 ? _vertex2 : Color.Lerp(_vertex2, _vertex1, 0.5f));
86 break;
87 case GradientDir.DiagonalRightToLeft:
88 uiVertex.color *= ((i - 1) % 4 == 0) ? _vertex1 : ((i - 3) % 4 == 0 ? _vertex2 : Color.Lerp(_vertex2, _vertex1, 0.5f));
89 break;
90
91 }
92 vh.SetUIVertex(uiVertex, i);
93 }
94 }
95 }
96 private bool CompareCarefully(Color col1, Color col2)
97 {
98 if (Mathf.Abs(col1.r - col2.r) < 0.003f && Mathf.Abs(col1.g - col2.g) < 0.003f && Mathf.Abs(col1.b - col2.b) < 0.003f && Mathf.Abs(col1.a - col2.a) < 0.003f)
99 return true;
100 return false;
101 }
102 }
103
104 public enum GradientMode
105 {
106 Global,
107 Local
108 }
109
110 public enum GradientDir
111 {
112 Vertical,
116 //Free
117 }
118 //enum color mode Additive, Multiply, Overwrite
119}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
UnityEngine.Color Color
Definition: TestScript.cs:32
override void ModifyMesh(VertexHelper vh)
Definition: Gradient.cs:36
Credit Erdener Gonenc - @PixelEnvision.