Unity - 動態製作一張平面網格 (Dynamically create plane mesh)

  簡單快速使用動態產生一張平面Mesh,跟之前的用Mesh來製作電流效果線段的方式一樣,不過這次只是單純的建立一張平面網格,跟內建的Plane物件類似,不過多了一些簡單操控的數值而已。




  之前的電流效果線段,是一段線段一張Mesh物件,少量使用下還好,不過如果在製作平面Mesh上使用這樣的方法會產生大量的Mesh物件,不是很好,產生大量物件也不是說很有效率。

  因此這次換個方式來建立網格,把平面網格的各個點座標計算完後,使用這些座標產生網格建立一個物件,同時把各個座標點數值存下來,方便之後使用編輯。

  製作完網格後同時把要配置的Material配置好,這樣動態製作一張平面網格就完成了,之後可以視情況來調整修改Mesh個座標點的數值或是做其他不同的調整,不過事實上也是可以用內建的Plane然後去抓其中的Mesh資料來修改,端看自己的需求了。


--
製作平面網格Code
public class CreatePlane: MonoBehaviour
{
    public int lengthY = 50; //網格的長
    public int lengthX = 50; //寬
    public Material mat; //貼圖材質
    public Vector3[] matrix; //把網格中各點的座標存下來
    public Mesh mesh; //把建立的Mesh留下參照
    public float levelYPosition = 0; //網格的Y軸位置

    void Start ()
    {
        Create();
    }

    void Create()
    {
        //建立網格點座標陣列
        matrix = new Vector3[lengthX * lengthY];
        for (int y = 0; y < lengthY; ++y)
        {
            for(int x = 0; x < lengthX; ++x)
            {
                matrix[y * lengthX + x] = new Vector3(((float)x)/10, levelYPosition, ((float)y)/10);
            }
        }

        //建立[vert][Normals][UVs]
        Vector3[] vertices = new Vector3[lengthX * lengthY];
        Vector3[] norms = new Vector3[lengthX * lengthY];
        Vector2[] UVs = new Vector2[lengthX * lengthY];

        for(int y = 0; y < lengthY; ++y)
        {
            for(int x = 0; x < lengthX; ++x)
            {
                vertices[y * lengthX + x] = matrix[y * lengthX + x];
                norms[y * lengthX + x] = Vector3.up;
                UVs[y * lengthX + x] = new Vector2((1/(float)(lengthX-1))*x , (1/(float)(lengthY-1))*y);
            }
        }

        //建立[Triangle]
        int[] triangles = new int[(lengthX-1) * (lengthY-1) * 6];
        int ind = 0;
        for(int y = 0; y < lengthY-1; ++y)
        {
            for(int x = 0; x < lengthX-1; ++x)
            {
                triangles[ind++] = y * lengthX + x;
                triangles[ind++] = (y + 1) * lengthX + (x + 1);
                triangles[ind++] = y * lengthX + (x + 1);
                triangles[ind++] = y * lengthX + x;
                triangles[ind++] = (y + 1) * lengthX + x;
                triangles[ind++] = (y + 1) * lengthX + (x + 1);
            }
        }

        //建立新的MeshRenderer並設定好材質
        GameObject newMesh = new GameObject ();
        MeshRenderer mr = newMesh.AddComponent(typeof(MeshRenderer)) as MeshRenderer;
        mr.material = mat;

        MeshFilter mf = newMesh.AddComponent (typeof(MeshFilter)) as MeshFilter;
        mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.normals = norms;
        mesh.triangles = triangles;
        mesh.uv = UVs;
        mf.mesh = mesh;

        //把這個Mesh掛在當前物件底下
        newMesh.transform.parent = this.transform;
    }
}


No comments:

Post a Comment