* 将组件加入到菜单中。

* 添加一个任意形状编辑器
This commit is contained in:
2026-04-07 17:48:48 +08:00
parent 76b891dc26
commit 22ae0d9293
14 changed files with 1203 additions and 55 deletions
+38 -18
View File
@@ -10,21 +10,24 @@ using XericLibrary.Runtime.MacroLibrary;
#if ODIN_INSPECTOR
using Sirenix.OdinInspector;
#endif
namespace XericLibrary
namespace XericLibrary.Runtime.Renderer
{
/// <summary>
/// UI多边形图形图案渲染组件(三角形,菱形,五边形...三十二边形)
/// 支持倒角
/// </summary>
[AddComponentMenu("Xeric Library/UI/UIPatternRenderer", 15)]
public class UIPatternRenderer : XericRendererComponent
{
#region 字段属性
public override string ShaderName => "XericLibrary/UILine/UIPattern";
[Header("多边形设置"), Range(3, 32)] public int sides = 6;
[SerializeField, Tooltip("多边形的大小 (相对于矩形区域的比例 0-1)")]
#if ODIN_INSPECTOR
[ProgressBar("Scalemin", "GetMaxScale")]
[PropertyRange("ScaleMin", "GetMaxScale")]
#else
[Range(0f, 1f)]
#endif
@@ -42,13 +45,14 @@ namespace XericLibrary
private float borderThickness = .1f;
[SerializeField, Tooltip("边框颜色")] private Color borderColor = Color.white;
[SerializeField, Tooltip("边框颜色渐变")] private Color borderColor2 = Color.white;
[SerializeField, Tooltip("填充颜色")] private Color fillColor = Color.gray;
/// <summary>
/// 获取最大缩放(一个参考值)
/// </summary>
public float GetMaxScale => 1 / Mathf.Cos(GetSideRadius);
private float Scalemin => 0.01f;
private float ScaleMin => 0.01f;
/// <summary>
/// 获取多边形的旋转弧度
/// </summary>
@@ -62,6 +66,7 @@ namespace XericLibrary
};
private static readonly int BorderColor1 = Shader.PropertyToID("_BorderColor");
private static readonly int BorderColor2 = Shader.PropertyToID("_BorderColor2");
private static readonly int FillColor1 = Shader.PropertyToID("_FillColor");
private static readonly int Thinkness = Shader.PropertyToID("_Thinkness");
@@ -90,6 +95,18 @@ namespace XericLibrary
}
}
/// <summary>
/// 边框颜色渐变
/// </summary>
public Color BorderColorLinear
{
get => borderColor2;
set
{
borderColor2 = value;
m_Material.SetColor(BorderColor2, borderColor2);
}
}
/// <summary>
/// 填充颜色
/// </summary>
public Color FillColor
@@ -101,6 +118,7 @@ namespace XericLibrary
m_Material.SetColor(FillColor1, fillColor);
}
}
/// <summary>
/// 设置缩放
/// </summary>
@@ -110,17 +128,20 @@ namespace XericLibrary
// 缓存顶点列表以避免每帧分配内存
private readonly List<Vector3> verticesCache = new List<Vector3>();
#endregion
#region 类内类型
public enum AngleSelectMode
{
Angle,
Multiples,
}
#endregion
protected override void OnPopulateMesh(VertexHelper vh)
protected override void OnPopulatePrefabricateVertex(List<UIVertex> vertexList, List<int> indexList)
{
if (vh == null) return;
vh.Clear();
// 获取绘图区域的中心点和尺寸
Rect rect = GetPixelAdjustedRect();
Vector2 center = rect.center;
@@ -154,12 +175,13 @@ namespace XericLibrary
// 此渲染组件的颜色和中心uv
Color32 color32 = this.color;
Vector2 uvCenter = new Vector4(0.5f, 0.5f, 0, 0);
// 没有倒角,使用常规流程
if (currentRounding <= 0f)
{
verticesCache.AddRange(OriginPatternVectorPoints(sides, radius, sideAngle, center));
// 添加中心点
vh.AddVert(center, color32, uvCenter, uvCenter, uvCenter, Vector4.zero);
vertexList.AddVert(center, uvCenter, color32);
float angleStep = 360f / sides;
// 添加外围点
@@ -170,24 +192,23 @@ namespace XericLibrary
XericRendererUtils.GetUVAtRect(verticesCache[i], rect, out var u, out var v);
GetNormalizedAngleByPos(angleStep, i, out var normalizedAngle);
var uv = new Vector4(u, v, 1, normalizedAngle);
vh.AddVert(verticesCache[i], color32, uv, uv, uv, Vector4.zero);
vertexList.AddVert(verticesCache[i], uv, color32);
}
// 三角形顺序:中心点, 当前外点, 下一个外点
for (int i = 1; i < sides; i++)
vh.AddTriangle(0, i, i + 1);
indexList.AddTriangle(0, i, i + 1);
// 连接最后一个点和第一个点以闭合形状
vh.AddTriangle(0, sides, 1);
indexList.AddTriangle(0, sides, 1);
}
// 启用倒角
else
{
verticesCache.AddRange(OriginPatternVectorPoints(sides, radius, sideAngle, center));
// 添加中心点
vh.AddVert(center, color32, uvCenter, uvCenter, uvCenter, Vector4.zero);
vertexList.AddVert(center, uvCenter, color32);
var maxVpCount = sides * roundingTime + 1;
var l = 2 * radius * Mathf.Sin(Mathf.PI / sides);
var lastPos = center;
for (var i = 0; i < sides; i++)
{
Vector2 pCurr = verticesCache[i];
@@ -226,19 +247,18 @@ namespace XericLibrary
MacroCurve.BezierCurve3(p0, p1, p2, p3, jTime, out var pos);
pos.GetUVAtRect(rect, out var u, out var v);
var uv = new Vector4(u, v, 1, 1);
vh.AddVert(pos, this.color, uv, uv, uv, Vector4.zero);
vertexList.AddVert(pos, uv, this.color);
var index = roundingTime * i + j + 1;
var next = index + 1;
if (next >= maxVpCount)
next = (next % maxVpCount) + 1;
vh.AddTriangle(0, index, next);
Debug.Log($"{jTime}|{pos}");
lastPos = pos;
indexList.AddTriangle(0, index, next);
}
}
}
}
/// <summary>
/// 图元基础外围图形顶点
/// </summary>
@@ -286,9 +306,9 @@ namespace XericLibrary
if (sides < 3) sides = 3;
if (scale <= float.Epsilon) scale = float.Epsilon;
SetVerticesDirty();
BorderThickness = borderThickness;
BorderColor = borderColor;
BorderColorLinear = borderColor2;
FillColor = fillColor;
}
#endif