using UnityEngine; using System.Collections.Generic; using UnityEngine.UI; [AddComponentMenu("UI/Effects/Text Vertical Gradient Color")] [RequireComponent(typeof(Text))] public class TextVerticalGradientThreeColor : BaseMeshEffect { public Color colorTop = Color.red; public Color colorCenter = Color.blue; public Color colorBottom = Color.green; public bool MultiplyTextColor = false; protected TextVerticalGradientThreeColor() { } public static Color32 Multiply(Color32 a, Color32 b) { a.r = (byte) ((a.r * b.r) >> 8); a.g = (byte) ((a.g * b.g) >> 8); a.b = (byte) ((a.b * b.b) >> 8); a.a = (byte) ((a.a * b.a) >> 8); return a; } private void ModifyVertices(VertexHelper vh) { List<UIVertex> verts = new List<UIVertex>(vh.currentVertCount); vh.GetUIVertexStream(verts); vh.Clear(); int step = 6; for (int i = 0; i < verts.Count; i += step) { //6 point var tl = multiplyColor(verts[i + 0], colorTop); var tr = multiplyColor(verts[i + 1], colorTop); var bl = multiplyColor(verts[i + 4], colorBottom); var br = multiplyColor(verts[i + 3], colorBottom); var cl = calcCenterVertex(verts[i + 0], verts[i + 4]); var cr = calcCenterVertex(verts[i + 1], verts[i + 2]); vh.AddVert(tl); vh.AddVert(tr); vh.AddVert(cr); vh.AddVert(cr); vh.AddVert(cl); vh.AddVert(tl); vh.AddVert(cl); vh.AddVert(cr); vh.AddVert(br); vh.AddVert(br); vh.AddVert(bl); vh.AddVert(cl); } for (int i = 0; i < vh.currentVertCount; i += 12) { vh.AddTriangle(i + 0, i + 1, i + 2); vh.AddTriangle(i + 3, i + 4, i + 5); vh.AddTriangle(i + 6, i + 7, i + 8); vh.AddTriangle(i + 9, i + 10, i + 11); } } private UIVertex multiplyColor(UIVertex vertex, Color color) { if (MultiplyTextColor) vertex.color = Multiply(vertex.color, color); else vertex.color = color; return vertex; } private UIVertex calcCenterVertex(UIVertex top, UIVertex bottom) { UIVertex center=new UIVertex(); center.normal = (top.normal + bottom.normal) / 2; center.position = (top.position + bottom.position) / 2; center.tangent = (top.tangent + bottom.tangent) / 2; center.uv0 = (top.uv0 + bottom.uv0) / 2; center.uv1 = (top.uv1 + bottom.uv1) / 2; if (MultiplyTextColor) { //multiply color var color = Color.Lerp(top.color, bottom.color, 0.5f); center.color = Multiply(color, colorCenter); } else { center.color = colorCenter; } return center; } #region implemented abstract members of BaseMeshEffect public override void ModifyMesh(VertexHelper vh) { if (!this.IsActive()) { return; } ModifyVertices(vh); } #endregion }
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; [RequireComponent(typeof(Text))] public class TextVerticalGradientTwoColor : BaseMeshEffect { public Color colorTop = Color.red; public Color colorBottom = Color.green; protected TextVerticalGradientTwoColor() { } private static void setColor(List<UIVertex> verts, int index, Color32 c) { UIVertex vertex = verts[index]; vertex.color = c; verts[index] = vertex; } private void ModifyVertices(List<UIVertex> verts) { for (int i = 0; i < verts.Count; i += 6) { setColor(verts, i + 0, colorTop); setColor(verts, i + 1, colorTop); setColor(verts, i + 2, colorBottom); setColor(verts, i + 3, colorBottom); setColor(verts, i + 4, colorBottom); setColor(verts, i + 5, colorTop); } } #region implemented abstract members of BaseMeshEffect public override void ModifyMesh(VertexHelper vh) { if (!this.IsActive()) { return; } List<UIVertex> verts = new List<UIVertex>(vh.currentVertCount); vh.GetUIVertexStream(verts); ModifyVertices(verts); vh.Clear(); vh.AddUIVertexTriangleStream(verts); } #endregion }