美文网首页
unity 绘制雷达图

unity 绘制雷达图

作者: WOTTOW | 来源:发表于2020-04-06 22:31 被阅读0次

雷达图一般都是显示在UGUI上,但在开始写时创建出来的是3D物体,走了点弯路才发现CanvasRenderer。
CanvasRenderer与3D世界模型的'Mesh Render'一样,UGUI的UI元素也需要一个Render渲染出来,那么第一时间想到的就是修改Render的Mesh。

具体的操作

因为5变形的角度都是一样的,旋转的角度是360/(边数-1)。
通过一个Vector3.up沿着指定的角度旋转,来确定5个边的顶点的位置,中心点为一个顶点。我们就把顶点的位置赋值完毕。

在赋值三角面时,我们需要了解:
顶点顺时针,剔除后面
顶点逆时针,剔除前面
同时绘制顶点顺时针与顶点逆时针 ,两面都可以看

当我们完成mesh的创建后,我们需要赋值给UGUI的Mesh,必须赋值材质,不然看不到创建出来的UI

       canvasRenderer.SetMesh(mesh);
        canvasRenderer.SetMaterial(renderMaterial, null);

现在UI在game场景中显示的材质是不对的。这是正常状态。因为设置mesh的uv和切线都没写


Image.gif

代码:

 private int[] triangles;       
    private Vector2[] uvs;         
    private Vector3[] vertices;    
    private Vector4[] tangents;   

    [Header("元素")]
    public float element1 = 10;
    public float element2 = 10;
    public float element3 = 10;
    public float element4 = 10;
    public float element5 = 10;

    private float sideLength = 10;    
    private float everyAngle=0;        

    private CanvasRenderer canvasRenderer;
    [SerializeField]
    private Material renderMaterial;   
    private int count = 6;             
    private Mesh mesh;                 

    void Start()
    {
        SetVertices();
    }

    private void Update()
    {
        for (int i = 1; i < vertices.Length; i++)
        {
            switch (i)
            {
                case 1:
                    sideLength = element1;
                    break;
                case 2:
                    sideLength = element2;
                    break;
                case 3:
                    sideLength = element3;
                    break;
                case 4:
                    sideLength = element4;
                    break;
                case 5:
                    sideLength = element5;
                    break;
            }
            vertices[i] = Quaternion.Euler(0, 0, everyAngle * i) * Vector3.up * sideLength;
        }
        mesh.vertices = vertices;
        canvasRenderer.SetMesh(mesh);
    }

    void SetVertices()
    {
        canvasRenderer = GetComponent<CanvasRenderer>();
        mesh = new Mesh();
        vertices = new Vector3[count];
        uvs = new Vector2[count];
        triangles = new int[count * 3];
        tangents = new Vector4[count];
        Vector4 tangent = new Vector4(0, 1, 0, -1);
        everyAngle = (float)360 / (count-1);

        for (int i = 0; i < vertices.Length; i++)   //循环顶点
        {
            vertices[i] = Quaternion.Euler(0, 0, everyAngle * i) * Vector3.up * sideLength;
            uvs[i] = Quaternion.Euler(0, 0, everyAngle * i) * Vector3.up;
            tangents[i] = tangent;
        }

        for (int i = 0, index=0; i < count-1; i++,index+=3)
        {
            triangles[index + 0] = 0;
            triangles[index + 1] = i==4?1:2+i; 
            triangles[index + 2] = i==4?5:1+i;
        }

        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.RecalculateNormals();
        mesh.tangents = tangents;
        mesh.uv = uvs;
 
        canvasRenderer.SetMesh(mesh);
        canvasRenderer.SetMaterial(renderMaterial, null);
    }

相关文章

网友评论

      本文标题:unity 绘制雷达图

      本文链接:https://www.haomeiwen.com/subject/abnlphtx.html