unity绘制三角形

1,197 阅读1分钟

效果

image.png

实现

一个角色的三维属性(力量,敏捷,智力)不是。。。

1、定义一个类,继承自MaskableGraphic

    public class Triangle : MaskableGraphic, ICanvasRaycastFilter

2、中心的图可以使用自己的sprite

    [SerializeField] Sprite m_image;
    public override Texture mainTexture => m_image == null ? s_WhiteTexture : m_image.texture;

3、定义

    //定义三个pos
    public Vector2 positionA;
    public Vector2 positionB;
    public Vector2 positionC;
    //顶点信息
    UIVertex[] m_vertexes = new UIVertex[3];
    //三个顶点的数组
    Vector2[] m_uvs = new Vector2[3];
    protected override void Start()
    {
        //三角形 顺时针绘制
        m_uvs[0] = new Vector2(0, 0);
        m_uvs[1] = new Vector2(0.5f, 1);
        m_uvs[2] = new Vector2(1, 0);
    }

4、绘制 重新OnPopulateMesh方法

    protected override void OnPopulateMesh(VertexHelper vh)
    {
        vh.Clear();
        for (int i = 0; i < 3; i++)
        {
            m_vertexes[i].color = color;
            m_vertexes[i].uv0 = m_uvs[i];
        }

        m_vertexes[0].position = positionA;
        m_vertexes[1].position = positionB;
        m_vertexes[2].position = positionC;

        vh.AddVert(m_vertexes[0]);
        vh.AddVert(m_vertexes[1]);
        vh.AddVert(m_vertexes[2]);
        //绘制的顺序
        vh.AddTriangle(0, 1, 2);
    }

5、在lua中使用,因为使用的是lua来写所有的ugui界面 在ugui中创建一个gameobject,然后上面需要CanvasRenderer组件,然后再添加绘制的c#脚本。

    local triangle = self.view.image_hua:GetComponent("Triangle")
    --[[
        这个设置的pos目前还有点问题,这个需要乘上图片大小的一半,来控制pos。
        而且绘制的时候0,0点是在所设置的gameobject的中心点,也不是在左下角。
        因为要下班了,所以我明天再研究
    ]]
    triangle.positionB = CS.UnityEngine.Vector2(0,pos[1]*90)
    triangle.positionA = CS.UnityEngine.Vector2(-pos[2]*90,-pos[2]*90)
    triangle.positionC = CS.UnityEngine.Vector2(pos[3]*90,-pos[3]*90)

    triangle:SetVerticesDirty()
    --[[ 包含的刷新方法
        //调用后会在下一帧重新执行OnPopulateMesh
        SetVerticesDirty();
        //调用后会在下一帧重新设置material以及Texture
        SetMaterialDirty();
        //调用后会重新布局
        SetLayoutDirty();
        //以上全部调用
        SetAllDirty();
    ]]

参考文档link