mesh | The input mesh. |
meshes | The input meshes. |
MeshDataArray
Returns a MeshDataArray
containing read-only MeshData
structs. See MeshDataArray and MeshData.
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.
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.
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(); } } }
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.