实现
public class GradientColorEffect : BaseMeshEffect
{
public enum GradientType
{
Horizontal,
Vertical
}
[SerializeField]
public GradientType typeGradient = GradientType.Horizontal;
[SerializeField]
[Range(-1, 1)]
public float offset = 0;
[SerializeField]
public Color32 colorBegin = Color.white;
[SerializeField]
public Color32 colorEnd = Color.black;
public override void ModifyMesh(VertexHelper helper)
{
if (!IsActive() || helper.currentVertCount == 0) return;
List<UIVertex> vertexs = new List<UIVertex>();
helper.GetUIVertexStream(vertexs);
int count = vertexs.Count;
switch (typeGradient)
{
case GradientType.Horizontal:
{
float xLeft = vertexs[0].position.x;
float xRight = vertexs[0].position.x;
float x;
for (int i = count - 1; i >= 1; --i)
{
x = vertexs[i].position.x;
if (x > xRight)
xRight = x;
else if (x < xLeft)
xLeft = x;
}
float width = 1f / (xRight - xLeft);
UIVertex vertex = new UIVertex();
for (int i = 0; i < helper.currentVertCount; i++)
{
helper.PopulateUIVertex(ref vertex, i);
vertex.color = Color32.Lerp(colorEnd, colorBegin, (vertex.position.x - xLeft) * width - offset);
helper.SetUIVertex(vertex, i);
}
}
break;
case GradientType.Vertical:
{
float yBottom = vertexs[0].position.y;
float yTop = vertexs[0].position.y;
float y;
for (int i = count - 1; i >= 1; --i)
{
y = vertexs[i].position.y;
if (y > yTop)
yTop = y;
else if (y < yBottom)
yBottom = y;
}
float height = 1f / (yTop - yBottom);
UIVertex vertex = new UIVertex();
for (int i = 0; i < helper.currentVertCount; i++)
{
helper.PopulateUIVertex(ref vertex, i);
vertex.color = Color32.Lerp(colorEnd, colorBegin, (vertex.position.y - yBottom) * height - offset);
helper.SetUIVertex(vertex, i);
}
}
break;
}
}
}
效果