Version: 2021.2
LanguageEnglish
  • C#

Mesh.AcquireReadOnlyMeshData

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Switch to Manual

Declaration

public static Mesh.MeshDataArray AcquireReadOnlyMeshData(Mesh mesh);

Declaration

public static Mesh.MeshDataArray AcquireReadOnlyMeshData(Mesh[] meshes);

Declaration

public static Mesh.MeshDataArray AcquireReadOnlyMeshData(List<Mesh> meshes);

Parameters

mesh The input mesh.
meshes The input meshes.

Returns

MeshDataArray Returns a MeshDataArray containing read-only MeshData structs. See MeshDataArray and MeshData.

Description

Gets a snapshot of Mesh data for read-only access.

When you pass one or more Meshes to Mesh.AcquireReadOnlyMeshData, Unity returns a MeshDataArray of read-only MeshData structs. You can access the resulting MeshDataArray and MeshData structs from any thread. Creating a MeshDataArray has some overhead for memory tracking and safety reasons, so it is more efficient to make a single call to Mesh.AcquireReadOnlyMeshData and request multiple MeshData structs in the same MeshDataArray than it is to make multiple calls to Mesh.AcquireReadOnlyMeshData.

Each MeshData struct contains a read-only snapshot of data for a given Mesh.

You must dispose of the MeshDataArray once you have finished working with it. Calling Mesh.AcquireReadOnlyMeshData does not cause any memory allocations or data copies by default, as long as you dispose of the MeshDataArray before modifying the Mesh. However, if you call Mesh.AcquireReadOnlyMeshData and then modify the Mesh while the MeshDataArray exists, Unity must copy the MeshDataArray into a new memory allocation. In addition to this, if you call Mesh.AcquireReadOnlyMeshData and then modify the Mesh, your modifications are not reflected in the MeshData structs.

Use Dispose to dispose of the MeshDataArray, or use the C# using pattern to do this automatically:

using Unity.Collections;
using UnityEngine;

public class ExampleScript : MonoBehaviour { void Start() { var mesh = new Mesh(); mesh.vertices = new[] {Vector3.one, Vector3.zero}; using (var dataArray = Mesh.AcquireReadOnlyMeshData(mesh)) { var data = dataArray[0]; // prints "2" Debug.Log(data.vertexCount); var 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 (var v in gotVertices) Debug.Log(v); gotVertices.Dispose(); } } }

This method will throw an InvalidOperationException if isReadable is false for one or more input meshes. When working in the Unity Editor, use MeshUtility.AcquireReadOnlyMeshData to skip this check.

See Also: MeshDataArray, MeshData, AllocateWritableMeshData, ApplyAndDisposeWritableMeshData.