版本:Unity 6 (6000.0)
语言英语
  • C#

Mesh.AllocateWritableMeshData

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实阅读了用户提出的每项修改建议,并在适用情况下进行更新。

关闭

提交失败

由于某种原因,我们无法提交您建议的更改。请在几分钟后<a>重试</a>。感谢您抽出宝贵时间来帮助我们提升 Unity 文档的质量。

关闭

取消

切换到手册

声明

public static Mesh.MeshDataArray AllocateWritableMeshData(int meshCount);

参数

meshCount 要创建的网格数量。

返回

MeshDataArray 返回一个包含可写 MeshData 结构的 MeshDataArray。请参阅 MeshDataArrayMeshData

说明

使用 C# 作业分配用于创建网格的数据结构。

使用 Mesh.AllocateWritableMeshData 获取一个包含可写 MeshData 结构的 MeshDataArray。可以从任何线程访问生成的 MeshDataArrayMeshData 结构。出于内存跟踪和安全原因,创建一个 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; } }