思路和纵向渐变一样,区别只在于纵向渐变是取顶点距离最底部距离/总渐变高度参与插值计算,而横向渐变则是取顶点距离最左侧距离/总渐变宽度参与插值计算
代码:
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;
[AddComponentMenu("UI/Effect/HorizontalGradient")] [RequireComponent(typeof(UnityEngine.UI.Text))] public class HorizontalGradient : BaseMeshEffect { ? ? public Color32 leftColor = new Color32(255, 255, 255, 255); ? ? public Color32 rightColor = new Color32(0, 0, 0, 255); ? ? public override void ModifyMesh(VertexHelper vh) ? ? { ? ? ? ? if (!IsActive() || vh.currentVertCount < 4) ? ? ? ? { ? ? ? ? ? ? return; ? ? ? ? } ? ? ? ? List<UIVertex> vertexList = new List<UIVertex>(); ? ? ? ? vh.GetUIVertexStream(vertexList); ? ? ? ? //遍历所有顶点 计算出总的渐变宽度 ? ? ? ? float fMaxPosX = vertexList[0].position.x; ? ? ? ? float fMinPosX = vertexList[0].position.x; ? ? ? ? for (int index = 0; index < vertexList.Count; index++) ? ? ? ? { ? ? ? ? ? ? if (vertexList[index].position.x < fMinPosX) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? fMinPosX = vertexList[index].position.x; ? ? ? ? ? ? } ? ? ? ? ? ? else if (vertexList[index].position.x > fMaxPosX) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? fMaxPosX = vertexList[index].position.x; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? float fWidth = fMaxPosX - fMinPosX; ? ? ? ? int nWordCount = vh.currentVertCount / 4; ? ? ? ? UIVertex vertex = new UIVertex(); ? ? ? ? for (int index = 0; index < nWordCount; index++) ? ? ? ? { ? ? ? ? ? ? for (int pIndex = 0; pIndex < 4; pIndex++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int nVerterIndex = index * 4 + pIndex; ? ? ? ? ? ? ? ? vh.PopulateUIVertex(ref vertex, nVerterIndex); ? ? ? ? ? ? ? ? vertex.color = Color32.Lerp(leftColor, rightColor, (vertex.position.x - fMinPosX) / fWidth); ? ? ? ? ? ? ? ? vh.SetUIVertex(vertex, nVerterIndex); ? ? ? ? ? ? } ? ? ? ? } ? ? } } ?
|