meshCount | 要创建的网格数量。 |
MeshDataArray 返回一个包含可写 MeshData
结构的 MeshDataArray
。请参阅 MeshDataArray 和 MeshData。
使用 C# 作业分配用于创建网格的数据结构。
使用 Mesh.AllocateWritableMeshData 获取一个包含可写 MeshData
结构的 MeshDataArray
。可以从任何线程访问生成的 MeshDataArray
和 MeshData
结构。出于内存跟踪和安全原因,创建一个 MeshDataArray
需要一些开销,因此,对 Mesh.AllocateWritableMeshData
进行一次调用并请求同一个 MeshDataArray
中的多个 MeshData
结构,比对 Mesh.AllocateWritableMeshData
进行多次调用更有效。如果你使用把 Mesh 或 Mesh 数组作为参数的覆盖方法,它会返回一个可以在线程上使用的现有 Mesh 的副本。
可以使用数据填充可写 MeshData
结构来创建新的网格。使用 Mesh.MeshData.SetVertexBufferParams
设置顶点缓冲区大小和布局,然后写入 Mesh.MeshData.GetVertexData
返回的数组以设置顶点。使用 Mesh.MeshData.SetIndexBufferParams
设置索引缓冲区大小和格式,然后写入 Mesh.MeshData.GetIndexData
返回的数组以设置索引。写入 Mesh.MeshData-subMeshCount
以设置子网格数量,然后使用 Mesh.MeshData.SetSubMesh
设置子网格数据。
当你已使用数据填充可写入的 MeshData
结构时,请使用 Mesh.ApplyAndDisposeWritableMeshData 将数据应用到 Mesh 对象,并自动丢弃 MeshDataArray
。
using UnityEngine; using UnityEngine.Rendering;
[RequireComponent(typeof(MeshFilter))] public class ExampleScript : MonoBehaviour { void Start() { // Allocate mesh data for one mesh. var dataArray = Mesh.AllocateWritableMeshData(1); var data = dataArray[0];
// Tetrahedron vertices with positions and normals. // 4 faces with 3 unique vertices in each -- the faces // don't share the vertices since normals have to be // different for each face. data.SetVertexBufferParams(12, new VertexAttributeDescriptor(VertexAttribute.Position), new VertexAttributeDescriptor(VertexAttribute.Normal, stream:1)); // Four tetrahedron vertex positions: var sqrt075 = Mathf.Sqrt(0.75f); var p0 = new Vector3(0,0,0); var p1 = new Vector3(1,0,0); var p2 = new Vector3(0.5f,0,sqrt075); var p3 = new Vector3(0.5f,sqrt075,sqrt075/3); // The first vertex buffer data stream is just positions; // fill them in. var pos = data.GetVertexData<Vector3>(); pos[0] = p0; pos[1] = p1; pos[2] = p2; pos[3] = p0; pos[4] = p2; pos[5] = p3; pos[6] = p2; pos[7] = p1; pos[8] = p3; pos[9] = p0; pos[10] = p3; pos[11] = p1; // Note: normals will be calculated later in RecalculateNormals.
// Tetrahedron index buffer: 4 triangles, 3 indices per triangle. // All vertices are unique so the index buffer is just a // 0,1,2,...,11 sequence. data.SetIndexBufferParams(12, IndexFormat.UInt16); var ib = data.GetIndexData<ushort>(); for (ushort i = 0; i < ib.Length; ++i) ib[i] = i;
// One sub-mesh with all the indices. data.subMeshCount = 1; data.SetSubMesh(0, new SubMeshDescriptor(0, ib.Length));
// Create the mesh and apply data to it: var mesh = new Mesh(); mesh.name = "Tetrahedron"; Mesh.ApplyAndDisposeWritableMeshData(dataArray, mesh); mesh.RecalculateNormals(); mesh.RecalculateBounds();
GetComponent<MeshFilter>().mesh = mesh; } }