# Mesh.MeshDataArray

> An array of Mesh data snapshots for C# Job System access.

## Definition

* **Type:** Struct
* **Namespace:** [UnityEngine](/engine/6000.5/script-reference/unityengine.md)
* **Assembly:** UnityEngine.CoreModule
* **Implements:** [IDisposable](https://learn.microsoft.com/dotnet/api/system.idisposable)

```csharp
public struct Mesh.MeshDataArray : IDisposable
```

## Remarks

Access to most Unity objects is not thread-safe, so in order to efficiently process or create meshes from the C# Job System, use the `MeshDataArray` and `MeshData` structs.

You can use [Mesh.AcquireReadOnlyMeshData](/engine/6000.5/script-reference/unityengine/mesh/acquirereadonlymeshdata.md) for read-only access to mesh data of multiple meshes, and [Mesh.AllocateWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/allocatewritablemeshdata.md) together with [Mesh.ApplyAndDisposeWritableMeshData](/engine/6000.5/script-reference/unityengine/mesh/applyanddisposewritablemeshdata.md) for creating new meshes.

A single `MeshDataArray` struct represents snapshot of mesh data of multiple meshes. Use [Length](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/length.md) and index operator to access data of an individual Mesh. Memory allocation and C# Job System safety tracking is built into `MeshDataArray` struct, so that the tracking overhead is minimal when working with multiple meshes at the same time. It is thus much more efficient to use a single MeshDataArray struct for multiple meshes, than to operate on several individual structs.

It is important to dispose of a `MeshDataArray` struct once you have finished working with it. Use [Dispose](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/dispose.md) to dispose of the struct when you have finished using it, or use the C# `using` pattern to do this automatically:

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

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

## Properties

| Property                                                                           | Description                                          |
| ---------------------------------------------------------------------------------- | ---------------------------------------------------- |
| [this\[\]](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/item.md) | Access `MeshDataArray` element by an index.          |
| [Length](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/length.md) | Number of Mesh data elements in the `MeshDataArray`. |

## Methods

| Method                                                                               | Description                                               |
| ------------------------------------------------------------------------------------ | --------------------------------------------------------- |
| [Dispose](/engine/6000.5/script-reference/unityengine/mesh/meshdataarray/dispose.md) | Use this method to dispose of the `MeshDataArray` struct. |
