using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; [AddComponentMenu("UI/Effects/VerticalColorGradual")] public class VerticalColorGradual:BaseMeshEffect { [SerializeField] private Color32 m_TopColor = Color.white; public Color32 topColor { get { return m_TopColor; } set { m_TopColor = value; this.graphic.SetVerticesDirty(); } } [SerializeField] private Color32 m_BottomColor = Color.black; public Color32 bottomColor { get { return m_BottomColor; } set { m_BottomColor = value; this.graphic.SetVerticesDirty(); } } [Range(-1,1)] [SerializeField] private float m_Center = 0f; public float center { get { return m_Center; } set { m_Center = value; this.graphic.SetVerticesDirty(); } } public override void ModifyMesh(VertexHelper vh) { var vertexList = new List(); vh.GetUIVertexStream(vertexList); int count = vertexList.Count; if(count > 0) { var bottomY = vertexList[0].position.y; var topY = vertexList[0].position.y; for(int i = 1;i < count;i++) { var y = vertexList[i].position.y; if(y > topY) { topY = y; } else if(y < bottomY) { bottomY = y; } } var height = topY - bottomY; for(int i = 0;i < count;i++) { var uiVertex = vertexList[i]; uiVertex.color = Color32.Lerp(bottomColor,topColor,Mathf.Clamp01((uiVertex.position.y - (bottomY + height * center)) / height)); vertexList[i] = uiVertex; } } vh.Clear(); vh.AddUIVertexTriangleStream(vertexList); } }