using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; /// /// 特殊3段变色,上段和下段为纯色,中段有渐变效果 /// public class UIGradient3Slice : BaseMeshEffect { public Color topColor = Color.white; public Color bottomColor = Color.black; public float topHeight = 0.225f; public float bottomHeight = 0.225f; public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) return; List vertList = new List(vh.currentVertCount); vh.GetUIVertexStream(vertList); vh.Clear(); // 按每四个顶点为一个四边形 for (int i = 0; i < vertList.Count; i += 6) { // 分解为8个顶点 UIVertex top_0 = vertList[i]; UIVertex top_1 = vertList[i + 1]; UIVertex bottom_0 = vertList[i + 4]; UIVertex bottom_1 = vertList[i + 2]; UIVertex midUp_0 = LerpVertex(bottom_0, top_0, 1f - topHeight); UIVertex midUp_1 = LerpVertex(bottom_1, top_1, 1f - topHeight); UIVertex midDown_0 = LerpVertex(bottom_0, top_0, bottomHeight); UIVertex midDown_1 = LerpVertex(bottom_1, top_1, bottomHeight); top_0.color = topColor; top_1.color = topColor; midUp_0.color = topColor; midUp_1.color = topColor; midDown_0.color = bottomColor; midDown_1.color = bottomColor; bottom_0.color = bottomColor; bottom_1.color = bottomColor; // 重新组装为3个四边形 WriteQuad(vh, top_0, top_1, midUp_0, midUp_1); WriteQuad(vh, midUp_0, midUp_1, midDown_0, midDown_1); WriteQuad(vh, midDown_0, midDown_1, bottom_0, bottom_1); } } public UIVertex LerpVertex(UIVertex a, UIVertex b, float ratio) { UIVertex result = new UIVertex(); result.position = Vector3.Lerp(a.position, b.position, ratio); result.uv0 = Vector3.Lerp(a.uv0, b.uv0, ratio); result.uv1 = Vector3.Lerp(a.uv1, b.uv1, ratio); result.normal = Vector3.Lerp(a.normal, b.normal, ratio); result.tangent = Vector3.Lerp(a.tangent, b.tangent, ratio); return result; } public void WriteQuad(VertexHelper vh, UIVertex top_0, UIVertex top_1, UIVertex bottom_0, UIVertex bottom_1) { int startIndex = vh.currentVertCount; vh.AddVert(top_0); vh.AddVert(top_1); vh.AddVert(bottom_1); vh.AddVert(bottom_0); vh.AddTriangle(startIndex, startIndex + 1, startIndex + 2); vh.AddTriangle(startIndex, startIndex + 3, startIndex + 2); } }