# AcquireReadOnlyMeshData

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

## Definition

* **Type:** Method
* **Namespace:** [UnityEngine](/engine/6000.5/script-reference/unityengine.md)
* **Assembly:** UnityEngine.CoreModule

## AcquireReadOnlyMeshData(Mesh)

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

```csharp
public static Mesh.MeshDataArray AcquireReadOnlyMeshData(Mesh mesh)
```

### Parameters

**** (\[Mesh]\(/engine/6000.5/script-reference/unityengine/mesh)): The input mesh.

### Returns

| Type                                                                               | Description                                                                                                                                                                                                                                       |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) | Returns a `MeshDataArray` containing read-only `MeshData` structs. See [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) and [Mesh.MeshData](/engine/6000.5/script-reference/unityengine/mesh/meshdata.md). |

### Remarks

When you pass one or more Meshes to [Mesh.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md), Unity returns a [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) and request multiple `MeshData` structs in the same `MeshDataArray` than it is to make multiple calls to [Mesh.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md).

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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) and then modify the Mesh, your modifications are not reflected in the `MeshData` structs.

This method will throw an `InvalidOperationException` if [Mesh.isReadable](/engine/6000.5/script-reference/unityengine/mesh/isreadable.md) is `false` for one or more input meshes. When working in the Unity Editor, use [MeshUtility.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityeditor/meshutility/acquirereadonlymeshdata.md) to skip this check.

Use [Dispose](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/dispose.md) to dispose of the `MeshDataArray`, or use the C# `using` pattern to do this automatically:

```csharp
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();
        }
    }
}
```

Additional Resources: [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md), [Mesh.MeshData](/engine/6000.5/script-reference/unityengine/mesh/meshdata.md), [Mesh.AllocateWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/allocatewritablemeshdata.md), [Mesh.ApplyAndDisposeWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/applyanddisposewritablemeshdata.md).

## AcquireReadOnlyMeshData(Mesh\[])

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

```csharp
public static Mesh.MeshDataArray AcquireReadOnlyMeshData(Mesh[] meshes)
```

### Parameters

**** (\[Mesh\[]]\(/engine/6000.5/script-reference/unityengine/mesh)): The input meshes.

### Returns

| Type                                                                               | Description                                                                                                                                                                                                                                       |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) | Returns a `MeshDataArray` containing read-only `MeshData` structs. See [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) and [Mesh.MeshData](/engine/6000.5/script-reference/unityengine/mesh/meshdata.md). |

### Remarks

When you pass one or more Meshes to [Mesh.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md), Unity returns a [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) and request multiple `MeshData` structs in the same `MeshDataArray` than it is to make multiple calls to [Mesh.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md).

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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) and then modify the Mesh, your modifications are not reflected in the `MeshData` structs.

This method will throw an `InvalidOperationException` if [Mesh.isReadable](/engine/6000.5/script-reference/unityengine/mesh/isreadable.md) is `false` for one or more input meshes. When working in the Unity Editor, use [MeshUtility.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityeditor/meshutility/acquirereadonlymeshdata.md) to skip this check.

Use [Dispose](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/dispose.md) to dispose of the `MeshDataArray`, or use the C# `using` pattern to do this automatically:

```csharp
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();
        }
    }
}
```

Additional Resources: [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md), [Mesh.MeshData](/engine/6000.5/script-reference/unityengine/mesh/meshdata.md), [Mesh.AllocateWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/allocatewritablemeshdata.md), [Mesh.ApplyAndDisposeWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/applyanddisposewritablemeshdata.md).

## AcquireReadOnlyMeshData(List\<Mesh>)

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

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

### Parameters

**** (\[List\<Mesh>]\(https\://learn.microsoft.com/dotnet/api/system.collections.generic.list-1)): The input meshes.

### Returns

| Type                                                                               | Description                                                                                                                                                                                                                                       |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) | Returns a `MeshDataArray` containing read-only `MeshData` structs. See [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) and [Mesh.MeshData](/engine/6000.5/script-reference/unityengine/mesh/meshdata.md). |

### Remarks

When you pass one or more Meshes to [Mesh.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md), Unity returns a [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) and request multiple `MeshData` structs in the same `MeshDataArray` than it is to make multiple calls to [Mesh.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md).

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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) 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](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) and then modify the Mesh, your modifications are not reflected in the `MeshData` structs.

This method will throw an `InvalidOperationException` if [Mesh.isReadable](/engine/6000.5/script-reference/unityengine/mesh/isreadable.md) is `false` for one or more input meshes. When working in the Unity Editor, use [MeshUtility.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityeditor/meshutility/acquirereadonlymeshdata.md) to skip this check.

Use [Dispose](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/dispose.md) to dispose of the `MeshDataArray`, or use the C# `using` pattern to do this automatically:

```csharp
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();
        }
    }
}
```

Additional Resources: [Mesh.MeshDataArray](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray.md), [Mesh.MeshData](/engine/6000.5/script-reference/unityengine/mesh/meshdata.md), [Mesh.AllocateWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/allocatewritablemeshdata.md), [Mesh.ApplyAndDisposeWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/applyanddisposewritablemeshdata.md).
