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+技能指示器(二)

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