mesh | 输入网格。 |
meshes | 输入网格。 |
MeshDataArray 返回一个包含只读 MeshData
结构体的 MeshDataArray
。请参阅 MeshDataArray 和 MeshData。
获取网格数据的只读访问快照。
当您将一个或多个网格传递给 Mesh.AcquireReadOnlyMeshData 时,Unity 会返回一个包含只读 MeshData
结构体的 MeshDataArray。您可以从任何线程访问生成的 MeshDataArray
和 MeshData
结构体。出于内存跟踪和安全原因,创建 MeshDataArray
会产生一些开销,因此,调用一次 Mesh.AcquireReadOnlyMeshData 并请求同一个 MeshDataArray
中的多个 MeshData
结构体,比多次调用 Mesh.AcquireReadOnlyMeshData 更有效率。
每个 MeshData
结构体都包含给定网格数据的只读快照。
在完成对 MeshDataArray
的操作后,必须将其释放。默认情况下,只要在修改网格之前释放 MeshDataArray
,调用 Mesh.AcquireReadOnlyMeshData 不会导致任何内存分配或数据复制。但是,如果您调用 Mesh.AcquireReadOnlyMeshData,然后在 MeshDataArray
存在时修改网格,Unity 必须将 MeshDataArray
复制到新的内存分配中。此外,如果您调用 Mesh.AcquireReadOnlyMeshData,然后修改网格,则您的修改不会反映在 MeshData
结构体中。
如果一个或多个输入网格的 isReadable 为 false
,则此方法将引发 InvalidOperationException
。在 Unity 编辑器中工作时,使用 MeshUtility.AcquireReadOnlyMeshData 跳过此检查。
使用 Dispose 释放 MeshDataArray
,或者使用 C# 的 using
模式自动执行此操作。
using Unity.Collections; using UnityEngine;
public class ExampleScript : MonoBehaviour { void Start() { Mesh mesh = new Mesh(); mesh.vertices = new[] {Vector3.one, Vector3.zero}; using (Mesh.MeshDataArray dataArray = Mesh.AcquireReadOnlyMeshData(mesh)) { Mesh.MeshData data = dataArray[0]; // prints "2" Debug.Log(data.vertexCount); NativeArray<Vector3> gotVertices = new NativeArray<Vector3>(mesh.vertexCount, Allocator.TempJob); data.GetVertices(gotVertices); // prints "(1.0, 1.0, 1.0)" and "(0.0, 0.0, 0.0)" foreach (Vector3 v in gotVertices) Debug.Log(v); gotVertices.Dispose(); } } }