U3D 代码生成简单的Mesh

效果图

这里写图片描述

辅助理解代码的图解

u3d 2d纹理 uv座标系

这里写图片描述

u3d Mathf.cos,sin三角函数的角度关系

这里写图片描述

u3d 三角面正反

这里写图片描述
总结为:三角面在投影座标下的顶点连接顺序顺时针为正面逆时针为反面
当然指定顺时针、或逆时针为正,在底层是可以设置的。

材质中使用到的纹理(自己用PS画就OK了)

这里写图片描述

代码

    /// <summary>
    /// author  :   Jave.Lin
    /// date    :   2018-05-03
    /// </summary>

    // sector
    public float sector_direction_degree = 90f;
    public float sector_theta_degree = 160;
    public int sector_segment = 15;
    public float sector_radius = 2;
    // circle
    public float circle_radius = 2;
    public int circle_segment = 30;
    // rect
    public float rect_side_len = 2;
    public void OnCreateSectorBtnClick()
    {
        _CreatSector(sector_direction_degree, sector_theta_degree, sector_radius, sector_segment);
    }
    public void OnCreateCircileBtnClick()
    {
        _CreatSector(0, 360, circle_radius, circle_segment);
    }
    public void OnCreateRectBtnClick()
    {
        _CreatSector(0, 360, rect_side_len, 4);
    }
    private void _CreatSector(float dir_degree, float theta_degree, float radius, int segment)
    {
        var go = new GameObject("TestMesh");
        var mf = go.AddComponent<MeshFilter>();
        var mr = go.AddComponent<MeshRenderer>();
        var m = new Mesh();

        const float oneRadian = (Mathf.PI / 180);
        var angle = oneRadian * dir_degree + oneRadian * (theta_degree * 0.5f);
        var stepAngle = oneRadian * (theta_degree / segment);
        var firstX = 0; var firstY = 0;

        Vector3[] vertices = new Vector3[3 + segment - 1];
        vertices[0] = new Vector3(firstX, firstY, 0);
        for (int i = 1; i < vertices.Length; i++)
        {
            vertices[i] = new Vector3(
                firstX + Mathf.Cos(angle) * radius,
                firstY + Mathf.Sin(angle) * radius, 0);
            angle -= stepAngle;
        }

        var triangles = new int[3 * segment];
        for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++)
        {
            triangles[i] = 0;
            triangles[i + 1] = vi;
            triangles[i + 2] = vi + 1;
        }

        var uvs = new Vector2[vertices.Length];
        uvs[0] = new Vector2(0.5f, 0);
        var count = uvs.Length - 1;
        for (int i = 1; i < uvs.Length; i++)
        {
            uvs[i] = new Vector2(i / count, 1);
        }
        m.vertices = vertices;
        m.triangles = triangles;
        m.uv = uvs;
        m.name = "MyMesh";

        mf.mesh = m;
        mr.material = Resources.Load<Material>("Materials/TestMesh1");

        go.transform.position = new Vector3(4, 4);
    }
    // 上面的顶点vertices,与三角索引组合triangles都会影响生成的三角面对于镜头来说,是正,还是反面
    // 如果开启了背面剔除,导致网格看不见,大家需要注意这点就OK了
    // 目前这种材质、与UV的设置,是控制不了类似王者荣耀的技能提示边缘的
    // 下次有时间,才实现两种方式来达效果:shader 以一个固定长度,直接设置颜色(RGBA),或是采样纹理(RGBA)

参考

Unity3D+moba+技能指示器(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章