MeshData
структура в UnityEngine
Выполнено в:UnityEngine.CoreModule
Описание
Структура с данными меша для доступа из системы заданий C#.
Используйте MeshData структуру, чтобы обращаться к мешам, обрабатывать и создавать их в системе заданий C#. Существует два типа MeshData структура: только для чтения MeshData структуры, которые позволяют доступ только для чтения к данным Mesh из C# Job System, и записываемые MeshData структуры, которые позволяют создавать Меши из Системы Задач C#.
только для чтения MeshData
Когда вы передаете одну или несколько мешей Mesh.AcquireReadOnlyMeshData, Unity возвращает MeshDataArray только для чтения MeshData Вы можете получить доступ к полученной MeshDataArray и MeshData структуры из любого потока. Создание MeshDataArray имеет некоторые накладные расходы для отслеживания памяти и по соображениям безопасности, поэтому более эффективно сделать один вызов Mesh.AcquireReadOnlyMeshData и запросить множественные MeshData структуры в том же MeshDataArray чем это сделать несколько вызовов к Mesh.AcquireReadOnlyMeshData.
Каждый MeshData структура содержит снимок данных конкретного меша, доступный только для чтения. Вы можете использовать GetIndexData и GetVertexData для доступа к необработанным данным Mesh только для чтения без выделения памяти, копирования данных или преобразования формата. Для этого вам нужно знать точное расположение данных Mesh: например, наличие и форматы всех атрибутов вершин сетки. Вы можете использовать GetColors, GetIndices, GetNormals, GetTangents, GetUVs, и GetVertices копировать данные Mesh только для чтения в существующие массивы. Эти методы также выполняют преобразование формата данных при необходимости. Например, если данные Mesh только для чтения MeshData структура использует VertexAttributeFormat.Float16 нормы и вы звоните GetNormals, нормы будут преобразованы в Vector3 нормы в массиве назначения.
Вы должны избавиться от MeshDataArray после того, как вы закончите работу с ним. Mesh.AcquireReadOnlyMeshData не вызывает никаких выделений памяти или копий данных по умолчанию, до тех пор, пока вы распоряжаетесь MeshDataArray модифицировать Mesh. Однако, если вы вызываете Mesh.AcquireReadOnlyMeshData и затем изменить сетку, пока MeshDataArray существует, Unity должен скопировать MeshDataArray в новое выделение памяти. Кроме того, если вы вызовете Mesh.AcquireReadOnlyMeshData и затем изменить сетку, ваши изменения не отражаются в MeshData Структуры.
Использование Dispose ликвидации отходов MeshDataArray, или используйте C# using шаблон, чтобы сделать это автоматически:
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(); } } }
Записываемый MeshData
Использование Mesh.AllocateWritableMeshData для получения MeshDataArray число записываемых MeshData Вы можете получить доступ к полученной MeshDataArray и MeshData структуры из любого потока. Создание MeshDataArray имеет некоторые накладные расходы для отслеживания памяти и по соображениям безопасности, поэтому более эффективно сделать один вызов Mesh.AllocateWritableMeshData и запросить множественные MeshData структуры в том же MeshDataArray чем это сделать несколько вызовов к Mesh.AllocateWritableMeshData.
Вы можете заполнить записываемые MeshData структуры с данными для создания новых мешей. Используйте Mesh.MeshData.SetVertexBufferParams чтобы установить размер и расположение вершинного буфера, а затем записать в массив, возвращенный Mesh.MeshData.GetVertexData для установки вершин. Используйте Mesh.MeshData.SetIndexBufferParams чтобы установить размер и формат буфера индекса, а затем записать в массив, возвращенный Mesh.MeshData.GetIndexData для установки индексов. Mesh.MeshData.subMeshCount чтобы установить количество подсеток, а затем использовать Mesh.MeshData.SetSubMesh для установки данных субсетки.
Когда вы заполняете записываемый MeshData структуру своими данными, используйте Mesh.ApplyAndDisposeWritableMeshData для применения данных к Mesh объектов и автоматически уничтожает MeshDataArray.
using UnityEngine; using UnityEngine.Rendering; using Unity.Collections;
[RequireComponent(typeof(MeshFilter))] public class ExampleScript : MonoBehaviour { void Start() { // Allocate mesh data for one mesh. var dataArray = Mesh.AllocateWritableMeshData(1); var data = dataArray[0];
// Tetrahedron vertices with positions and normals. // 4 faces with 3 unique vertices in each -- the faces // don't share the vertices since normals have to be // different for each face. data.SetVertexBufferParams(12, new VertexAttributeDescriptor(VertexAttribute.Position), new VertexAttributeDescriptor(VertexAttribute.Normal, stream: 1));
// Four tetrahedron vertex positions: var sqrt075 = Mathf.Sqrt(0.75f); var p0 = new Vector3(0, 0, 0); var p1 = new Vector3(1, 0, 0); var p2 = new Vector3(0.5f, 0, sqrt075); var p3 = new Vector3(0.5f, sqrt075, sqrt075 / 3);
// The first vertex buffer data stream is just positions; // fill them in. NativeArray<Vector3> pos = data.GetVertexData<Vector3>(); pos[0] = p0; pos[1] = p1; pos[2] = p2; pos[3] = p0; pos[4] = p2; pos[5] = p3; pos[6] = p2; pos[7] = p1; pos[8] = p3; pos[9] = p0; pos[10] = p3; pos[11] = p1;
// Note: normals will be calculated later in RecalculateNormals. // Tetrahedron index buffer: 4 triangles, 3 indices per triangle. // All vertices are unique so the index buffer is just a // 0,1,2,...,11 sequence. data.SetIndexBufferParams(12, IndexFormat.UInt16); NativeArray<ushort> indexBuffer = data.GetIndexData<ushort>(); for (ushort i = 0; i < indexBuffer.Length; ++i) indexBuffer[i] = i;
// One sub-mesh with all the indices. data.subMeshCount = 1; data.SetSubMesh(0, new SubMeshDescriptor(0, indexBuffer.Length)); // Create the mesh and apply data to it: var mesh = new Mesh(); mesh.name = "Tetrahedron"; Mesh.ApplyAndDisposeWritableMeshData(dataArray, mesh); mesh.RecalculateNormals(); mesh.RecalculateBounds(); GetComponent<MeshFilter>().mesh = mesh; } }
Свойства
| Свойство | Описание |
|---|---|
| indexFormat | Получает формат данных буфера индекса в MeshData. (только для чтения) |
| lodCount | Число уровней детализации в этой сетке. |
| lodSelectionCurve | Структура со значениями lodBias и lodSlope. Unity использует их при вычислении того, какой уровень Mesh LOD выбрать. |
| subMeshCount | Число подсеток в MeshData. |
| vertexBufferCount | Получает число вершинных буферов в MeshData. (только для чтения) |
| vertexCount | Получает число вершин в MeshData. (только для чтения) |
Открытые методы
| Метод | Описание |
|---|---|
| GetColors | Заполняет массив цветами вершин из MeshData. |
| GetIndexData | Получает необработанные данные из индексного буфера MeshData. |
| GetIndices | Заполняет массив индексами для данной подсетки из MeshData. |
| GetLod | Получает диапазон Mesh LOD (начало индекса и число индексов) для заданного Mesh LOD. |
| GetNormals | Заполняет массив вершинными нормалями из MeshData. |
| GetSubMesh | Получает данные о заданном подсете в MeshData. |
| GetTangents | Заполняет массив касаниями вершин из MeshData. |
| GetUVs | Заполняет массив UVs из MeshData. |
| GetVertexAttributeDimension | Получает размерность заданного атрибута вершины в MeshData. |
| GetVertexAttributeFormat | Получает формат заданного атрибута вершины в MeshData. |
| GetVertexAttributeOffset | Получает смещение в потоке вершинного буфера заданного атрибута вершинных данных на этом MeshData. |
| GetVertexAttributeStream | Получить индекс потока вершинного буфера определенного атрибута вершинных данных на этом MeshData. |
| GetVertexBufferStride | Получить шаг потока вершинного буфера в байтах. |
| GetVertexData | Получает необработанные данные для заданного формата потока вершинного буфера в MeshData. |
| GetVertices | Заполняет массив позициями вершин из MeshData. |
| HasVertexAttribute | Проверяет, существует ли данный атрибут вершины в MeshData. |
| SetIndexBufferParams | Задает размер буфера индекса и формат Mesh, который Unity создает из MeshData. |
| SetLod | Установить диапазон Mesh LOD для данной подсетки и уровня детализации. |
| SetSubMesh | Задает данные для подсетки сетки, которую Unity создает из MeshData. |
| SetVertexBufferParams | Задает размер буфера вершин и расположение сетки, которую Unity создает из MeshData. |