为了方便把这些cube放到了一个空的父物体下(这里就不再用图片展示了)
这个代码就是把获取所有的cube的position存到了一个列表中
void DrawMesh(Vector3[] vec)
{
//创建一个空的gameObject 这里我的名字就叫做box
GameObject box = new GameObject("Box");
//为其添加MeshFilter、MehsRenderer 它获取mesh资源,运用MeshRenderer渲染到屏幕上
box.AddComponent<MeshFilter>();
box.AddComponent<MeshRenderer>();
Mesh mesh = new Mesh();
//将这些cube的position存到了一个数组中
Vector3[] top_Vec = vec;
List<int> top_list = new List<int>();
for (int i = 0; i < top_Vec.Length - 1; i++)
{
//通过不同的三个顶点为网格创建三角形,网格是由多个三角形构成的一个面,构成三角形的个数为(n-2)个(注:注意这个小练习的顶点有5个但实际上是由3个三角形拼成的,但是top_list中有4组信息,但我们可以将这个列表计算一下
0,1,4 1,2,3 2,3,2 3,4,1 这四组单2,3,2 这一组其实是一条线并非一个三角形)
top_list.Add(i);
top_list.Add(i + 1);
top_list.Add(top_Vec.Length - i - 1);
}
//储存定点信息
mesh.vertices = top_Vec;
//将遍历三角形的顶点顺序储存到列表中并转化成数组, 我认为它会自动解析这个数组(以每三个点进行解析吧)
mesh.triangles = top_list.ToArray();
//重新计算法线、uv
mesh.RecalculateBounds();
mesh.RecalculateNormals();
box.GetComponent<MeshFilter>().mesh = mesh;
//这里的材质是我自己设置的
box.GetComponent<MeshRenderer>().material = material;
注意:1.想要构成一个面这些点必须按照顺序摆放,如果不按顺序会构不成一个面或者其中某几个点构成一个面(说白了就是缺少三角形)
2.这些点建议按顺时针摆放,因为生成的mesh渲染的时候是单面材质在正面可以看到渲染而背面却看不到,如果不小心按逆时针摆放的话把shader -> Nature->SpeedTree cill选择off 修改材质的shader就可以看到了(原因我还没搞懂)
效果如图