Параметры
meshCount | Количество создаваемых сеток. |
Возвращает
MeshDataArray Возвращает MeshDataArray
, содержащий доступные для записи структуры MeshData
. См. MeshDataArray и MeshData.
Описание
Выделяет структуры данных для создания сетки с помощью заданий C#.
Используйте 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;
}
}
Смотрите так же: ApplyAndDisposeWritableMeshData, MeshDataArray, MeshData.