using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using static UI.UILineRenderer; // 允许LineCapType直接访问
// 确保在UI命名空间内
namespace UI
{
///
/// UILineRenderer 是一个用于在UI中绘制自定义线条的Graphic组件。
/// 它支持设置线条宽度、渐变颜色以及不同类型的线头(方形或圆形)。
/// 同时支持线段之间的斜切连接,以确保转角平滑。
///
[RequireComponent(typeof(CanvasRenderer))]
public class UILineRenderer : Graphic
{
///
/// 存储构成线条的顶点列表。
///
public List points = new List();
///
/// 线的宽度。
///
[SerializeField] private float lineWidth = 5f;
///
/// 获取或设置线的宽度。
/// 设置新值时,如果宽度发生改变,将触发UI网格的重新绘制。
///
public float LineWidth
{
get => lineWidth;
set
{
// 仅当值发生显著变化时才更新,以避免不必要的重绘。
// Mathf.Abs(lineWidth - value) > float.Epsilon 是一个更健壮的浮点数比较方式。
if (Mathf.Abs(lineWidth - value) > float.Epsilon)
{
lineWidth = value;
SetVerticesDirty(); // 标记UI网格需要重新生成。
}
}
}
///
/// 用于线条的渐变颜色。
///
public Gradient lineGradient = new Gradient();
///
/// 定义线条两端的线头类型。
///
public enum LineCapType
{
///
/// 无线头。
///
None,
///
/// 方形线头。
///
Square,
///
/// 圆形线头。
///
Round
}
///
/// 线的起始端线头类型。
///
public LineCapType startCap = LineCapType.None;
///
/// 线的结束端线头类型。
///
public LineCapType endCap = LineCapType.None;
///
/// 获取用于UI渲染的相机。
/// 如果Canvas的渲染模式是Screen Space - Overlay,则返回null,此时不需要相机。
///
/// 用于UI渲染的Camera实例,或在Overlay模式下返回null。
private Camera GetCanvasRenderCamera()
{
Canvas _canvas = GetComponentInParent