Unity Text三重渐变色

[AddComponentMenu ("UI/Effects/ThreeColorGradient")]
[RequireComponent(typeof(Text))]
public class ThreeColorGradient : BaseMeshEffect
{
	public Color colorTop = Color.white;
	public Color colorCenter = Color.grey;
	public Color colorBottom = Color.black;
	public bool MultiplyTextColor = false;

	protected ThreeColorGradient()
	{}
	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
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值