UGUI - 绘制动态曲线

版权声明:http://blog.csdn.net/admin_jhon https://blog.csdn.net/Admin_Jhon/article/details/79482349

前言

等有空再补详细说明,先上代码。看官自行阅读

代码

UICurveData 类,用于存放点数据的基础结构。

public class UICurveData
{
    #region [Fields]
    public List<Vector2> Postion = new List<Vector2>();
    public Color Ccolor;
    public float Thickness = 1;
    #endregion

    #region [PublicTools]
    public void Addpos(float varX, float varY)
    {
        Addpos(new Vector2(varX, varY));
    }
    public void Addpos(Vector2 varV2)
    {
        Postion.Add(varV2);
    }
    #endregion

}

UICurve 负责构建顶点数据,mesh。

public class UICurve : MaskableGraphic
{
    #region [Fields]
    private Dictionary<int, UICurveData> mCurveData = new Dictionary<int, UICurveData>();
    #endregion

    #region [Inherit]
    protected override void OnPopulateMesh(VertexHelper varVerHeler)
    {
        varVerHeler.Clear();

        foreach (var tempKvp in mCurveData)
        {
            var tempUICurveData = tempKvp.Value;
            if (tempUICurveData.Postion.Count < 2)
            {
                continue;
            }
            for (int i = 1; i < tempUICurveData.Postion.Count; i++)
            {
                UIVertex[] verts = new UIVertex[4];

                float x1 = tempUICurveData.Postion[i - 1].x;
                float y1 = tempUICurveData.Postion[i - 1].y;
                float x2 = tempUICurveData.Postion[i].x;
                float y2 = tempUICurveData.Postion[i].y;

                float xd = (y2 - y1) / Mathf.Sqrt(Mathf.Pow(x2 - x1, 2) * Mathf.Pow(y2 - y1, 2)) * tempKvp.Value.Thickness / 2;
                float yd = (x2 - x1) / Mathf.Sqrt(Mathf.Pow(x2 - x1, 2) * Mathf.Pow(y2 - y1, 2)) * tempKvp.Value.Thickness / 2;

                int idx = 0;
                verts[idx].position = new Vector3(tempUICurveData.Postion[i - 1].x - xd, tempUICurveData.Postion[i - 1].y + yd);
                verts[idx].color = tempUICurveData.Ccolor;
                verts[idx].uv0 = Vector2.zero;

                idx++;
                verts[idx].position = new Vector3(tempUICurveData.Postion[i].x - xd, tempUICurveData.Postion[i].y + yd);
                verts[idx].color = tempUICurveData.Ccolor;
                verts[idx].uv0 = Vector2.zero;

                idx++;
                verts[idx].position = new Vector3(tempUICurveData.Postion[i].x + xd, tempUICurveData.Postion[i].y - yd);
                verts[idx].color = tempUICurveData.Ccolor;
                verts[idx].uv0 = Vector2.zero;

                idx++;
                verts[idx].position = new Vector3(tempUICurveData.Postion[i - 1].x + xd, tempUICurveData.Postion[i - 1].y - yd);
                verts[idx].color = tempUICurveData.Ccolor;
                verts[idx].uv0 = Vector2.zero;

                varVerHeler.AddUIVertexQuad(verts);
            }
        }

    }
    #endregion

    #region [PublicTools]
    public void AddCurveData(int varID, UICurveData varCurveData)
    {
        mCurveData.Add(varID, varCurveData);
        SetAllDirty();
    }
    public void Clear()
    {
        mCurveData.Clear();
        SetAllDirty();
    }
    public void RemovePointIDs(params int[] varRemovepoints)
    {
        List<int> tempL = new List<int>();
        tempL.AddRange(varRemovepoints);
        RemovePointIDs(tempL);
    }
    public void RemovePointIDs(List<int> varRemovePoints)
    {
        foreach (var i in varRemovePoints)
        {
            if (!mCurveData.ContainsKey(i)) continue;
            mCurveData.Remove(i);
        }
        SetAllDirty();
    }
    #endregion
}

测试使用

public class TestCurve : MonoBehaviour
{
    void Start()
    {
        var tempCurve = this.gameObject.AddComponent<UICurve>();
        UICurveData tempcd = new UICurveData();
        tempcd.Ccolor = Color.yellow;
        tempcd.Thickness = 2;
        for (int i = 0; i < 360; i++)
        {
            tempcd.Addpos(i * 2,(float)Mathf.Cos(i));
        }
        tempCurve.AddCurveData(1,tempcd);
    }
}

将该脚本挂在 Canvas 上,运行会看到

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Admin_Jhon/article/details/79482349