Unity 6.3
0 онлайн 1 гость 3 в системе
Вход

Mesh.AllocateWritableMeshData

Declaration

public static Mesh.MeshDataArray AllocateWritableMeshData(int meshCount);

Параметры

Параметр Описание
meshCount Количество мешей, которые будут созданы.

Возвращаемое значение

MeshDataArray Возвращает MeshDataArray, содержащий записываемые структуры MeshData. См. MeshDataArray и MeshData.

Описание

Выделяет структуры данных для создания сетки с помощью заданий C#.

Использование Mesh.AllocateWritableMeshData для получения MeshDataArray число записываемых MeshData Вы можете получить доступ к полученной MeshDataArray и MeshData структуры из любого потока. Создание MeshDataArray имеет некоторые накладные расходы для отслеживания памяти и по соображениям безопасности, поэтому более эффективно сделать один вызов Mesh.AllocateWritableMeshData и запросить множественные MeshData структуры в том же MeshDataArray чем это сделать несколько вызовов к Mesh.AllocateWritableMeshData. Если вы используете перегрузку, принимающую Mesh или массив Mesh, вам вернётся копия существующего меша, пригодная для использования в потоке.

Вы можете заполнить записываемые 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<ushort>(); 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; } }

Дополнительные ресурсы: ,ApplyAndDisposeWritableMeshData,, ,MeshDataArray,, ,MeshData,.