Unity里的Mesh的SetVertices函数与mesh.vertices的区别
今天使用Unity的时候,需要自己创建Mesh,然后对Mesh里的vertices进行赋值,我发现了有两种写法:
List<Vector3>vertices = new List<Vector3>();
//写法1
mesh.vertices = vertices;
//写法2
mesh.SetVertices(vertices.ToArray());
这两种写法有什么区别呢?
直接对mesh.vertices和mesh.triangles进行赋值是老版本的Untiy输入网格数据的方法,这种方式并不准确,因为mesh.triangles里存储的顶点索引信息并不一定是构成三角形,也可能是Lines,Quad等方式,所以为了区分primitive(图元)的类型,新增了SetIndices函数,用于区别图元的类型。
List<Vector3> verts = new List<Vector3>();
verts.Add(new Vector3(0, 0, 0));
verts.Add(new Vector3(0, 111, 110));
verts.Add(new Vector3(110, 0, 111));
int[] indices = new int[] { 0, 1, 2 };
mesh.Clear();
//新写法
mesh.SetVertices(verts);
mesh.SetIndices(indices, MeshTopology.Triangles, 0);
//旧写法
mesh.vertices = verts.ToArray();
mesh.triangles = indices;
从上面的代码也可以看出,mesh.SetVertices
支持的是List数组,而mesh.vertices
支持的固定Array数组(2018.3f版本的Unity),所以也可以根据自己数组的类型自行选择用哪个API
值得注意的是,最新版本的Unity,使用SetVertices已经能支持两种格式的数组,以下是新旧版本的Unity对比,可以看出来Unity在慢慢鼓励大家使用新的API: