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

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.