Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты
к Руководству

MeshData

структура в UnityEngine / Реализовано в: UnityEngine.CoreModule

Описание

Структура, содержащая данные сетки для доступа к системе заданий C#.

Используйте структуру MeshData для доступа, обработки и создания сеток в системе заданий C#. Существует два типа структур MeshData: структуры MeshData только для чтения, которые разрешают доступ только для чтения к данным Mesh из задания C#. 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 в уже существующие массивы. Эти методы также выполняют преобразования формата данных, если это необходимо. Например, если в структуре MeshData, доступной только для чтения, используются нормали VertexAttributeFormat.Float16, и вы вызываете GetNormals, нормали будут преобразованы в нормали Vector3 в целевом массиве.

Вы должны избавиться от MeshDataArray после завершения работы с ним. Вызов Mesh.AcquireReadOnlyMeshData не приводит к выделению памяти или копированию данных по умолчанию, если вы удаляете MeshDataArray. перед изменением сетки. Однако если вы вызываете Mesh.AcquireReadOnlyMeshData, а затем изменяете сетку, пока существует MeshDataArray, Unity должна скопировать MeshDataArray в новое выделение памяти. В дополнение к этому, если вы вызываете Mesh.AcquireReadOnlyMeshData, а затем изменяете Mesh, ваши изменения не отражаются в MeshData структуры.

Используйте Dispose для удаления MeshDataArray или используйте C# используя шаблон, чтобы сделать это автоматически:

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; [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. var 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); var ib = data.GetIndexData(); for (ushort i = 0; i < ib.Length; ++i) ib[i] = i; // One sub-mesh with all the indices. data.subMeshCount = 1; data.SetSubMesh(0, new SubMeshDescriptor(0, ib.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. (Только чтение)
subMeshCount Количество вложенных сеток в MeshData.
vertexBufferCount Получает количество буферов вершин в MeshData. (Только чтение)
vertexCount Получает количество вершин в MeshData. (Только чтение)

Публичные Методы

GetColors Заполняет массив цветами вершин из MeshData.
GetIndexData Получает необработанные данные из индексного буфера MeshData.
GetIndices Заполняет массив индексами для данной вложенной сетки из MeshData.
GetNormals Заполняет массив нормалями вершин из MeshData.
GetSubMesh Получает данные о заданной подсетке в MeshData.
GetTangents Заполняет массив касательными вершин из MeshData.
GetUVs Заполняет массив UV из MeshData.
GetVertexAttributeDimension Получает измерение заданного атрибута вершины в MeshData.
GetVertexAttributeFormat Получает формат данного атрибута вершины в MeshData.
GetVertexData Получает необработанные данные для заданного формата потока буфера вершин в MeshData.
GetVertices Заполняет массив позициями вершин из MeshData.
HasVertexAttribute Проверяет, существует ли заданный атрибут вершины в MeshData.
SetIndexBufferParams Устанавливает размер буфера индекса и формат Mesh, который Unity создает из MeshData.
SetSubMesh Задает данные для подсети сетки, которую Unity создает из MeshData.
SetVertexBufferParams Устанавливает размер буфера вершин и расположение сетки, которую Unity создает из MeshData.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3