用UGUI繪制多邊形屬性圖

效果圖

image.png

關(guān)于OnPopulateMesh

當(dāng)一個(gè)UI元素生成頂點(diǎn)數(shù)據(jù)時(shí),會(huì)調(diào)用OnPopulateMesh(VertexHelper vh)函數(shù),我們可以覆寫這個(gè)函數(shù),來(lái)達(dá)到修改頂點(diǎn)數(shù)據(jù)或獲取頂點(diǎn)數(shù)據(jù)。
其中用到的方法:

方法名稱 作用
Clear 清除流中的所有頂點(diǎn)
AddVert 向流中添加單個(gè)頂點(diǎn)
AddTriangle 向緩沖區(qū)添加一個(gè)三角形

思路:

  1. 清空所有頂點(diǎn)信息

  2. 添加4個(gè)頂點(diǎn)(0, 1, 2, 3)


    image.png
  3. 添加三角形 (0, 1, 2), (0, 2, 3), (0, 3, 1)


    image.png

源碼

using UnityEngine;
using UnityEngine.UI;

public class UIPropWidget : Graphic
{
    /// <summary>
    /// 放大倍數(shù)
    /// </summary>
    public int Mul = 100;

    /// <summary>
    /// 旋轉(zhuǎn)值
    /// </summary>
    public float Angle = 0;

    /// <summary>
    /// 頂點(diǎn)值
    /// </summary>
    [Range(0, 1)]
    public float[] Values;

    /// <summary>
    /// 記錄頂點(diǎn)
    /// </summary>
    private Vector2[] m_Verts;

    /// <summary>
    /// 頂點(diǎn)數(shù)
    /// </summary>
    private int m_Length;

    protected override void Awake()
    {
        base.Awake();
        Values = new float[0];
        m_Verts = new Vector2[0];
    }

    private void Update()
    {
        if(Values.Length != m_Length) {
            m_Length = Values.Length;
            m_Verts = new Vector2[m_Length];
        }
        var cur_pos = Vector2.zero;
        var ave_angle = 360 / m_Length;
        
        for (int i = 0; i < m_Length; i++) {
            float scale = 1;
            if (Values.Length >= i) {
                scale = Values[i];
            }
            var radian = (ave_angle * i + Angle) * Mathf.PI / 180;
            var x = Mathf.Sin(radian) * scale * Mul;
            var y = Mathf.Cos(radian) * scale * Mul;
            m_Verts[i] = new Vector2(cur_pos.x + x, cur_pos.y + y);
        }
        SetVerticesDirty();
    }
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        vh.Clear();
        vh.AddVert(Vector2.zero, color, Vector2.zero);
        foreach (var pos in m_Verts) {
            vh.AddVert(pos, color, Vector2.zero);
        }
        for (int i = 1; i <= m_Length; i++) {
            var num = i + 1 > m_Length ? 1 : i + 1;
            vh.AddTriangle(0, i, num);
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容