之前的電流效果線段,是一段線段一張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