Files
JJBB/Assets/Project/Script/GUI/Base/UIGradient3Slice.cs
2024-08-23 15:49:34 +08:00

67 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
/// <summary>
/// 特殊3段变色上段和下段为纯色中段有渐变效果
/// </summary>
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<UIVertex> vertList = new List<UIVertex>(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);
}
}