Описание
Структура, содержащая данные сетки для доступа к системе заданий 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. |