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

Mesh

класс в UnityEngine

Наследуется от:Object

Выполнено в:UnityEngine.CoreModule

Описание

Класс, позволяющий создавать и изменять меши.

Меши содержат вершины и множественные массивы треугольников.

Концептуально, все вершинные данные хранятся в отдельных массивах одинакового размера. Например, если у вас есть сетка из 100 вершин, и вы хотите иметь координаты положения, нормали и две текстуры для каждой вершины, то сетка должна иметь vertices, normals, uv и uv2 данные для i-й вершины находятся в индексе "i" в каждом массиве.

Для каждой вершины может быть положение вершины, нормаль, касательная, цвет и до 8 координат текстуры. Координаты текстуры чаще всего являются 2D данные (Vector2), но можно сделать их Vector3 или Vector4 Это чаще всего используется для хранения произвольных данных в вершинах меши, для специальных эффектов, используемых в шейдерах. Для мешей со скинами данные вершины могут также содержать boneWeights.

Данные о поверхности сетки, i.e. треугольники, из которых она состоит, представляют собой просто три индекса вершин для каждого треугольника. Например, если сетка состоит из 10 треугольников, то triangles массив должен состоять из 30 чисел, причем каждое число указывает, какую вершину использовать. Первые три элемента в массиве треугольников являются индексами вершин, которые составляют этот треугольник; вторые три элемента составляют другой треугольник и так далее.

Обратите внимание, что в то время как меши треугольников являются наиболее распространенными, Unity также поддерживает другие типы топологии меши, например, меши линии или точки. Для мешей линии каждая линия состоит из двух индексов вершин и так далее. См. SetIndices и MeshTopology.

Простая и расширенная сетка API

У класса Mesh есть два набора методов для присвоения данных мешу из скрипта. «Простой» набор даёт основу для задания индексов, треугольников, нормалей, касательных и т. д. Эти методы выполняют проверки — например, следят за тем, чтобы передаваемые данные не содержали индексов за пределами диапазона. Именно так данные меша обычно задаются из скрипта в Unity.

"Простыми" методами являются: SetColors, SetIndices, SetNormals, SetTangents, SetTriangles, SetUVs, SetVertices, SetBoneWeights.

Существует также "расширенный" набор методов, которые позволяют вам записывать данные сетки напрямую с контролем над тем, должны ли выполняться какие-либо проверки или подтверждения. Эти методы предназначены для расширенных случаев использования, требующих максимальной производительности. Они быстрее, но позволяют вам пропустить проверки данных, которые вы предоставляете. Если вы используете эти методы, вы должны убедиться, что вы не предоставляете неверные данные, потому что Unity не будет проверять за вас.

"Продвинутые" методы: SetVertexBufferParams, SetVertexBufferData, SetIndexBufferParams, SetIndexBufferData, SetSubMesh, и вы можете использовать MeshUpdateFlags для контроля за тем, какие проверки или подтверждения выполняются или не выполняются. AcquireReadOnlyMeshData чтобы сделать снимок данных сетки только для чтения, который можно использовать с C# Jobs и Burst, и AllocateWritableMeshData с ApplyAndDisposeWritableMeshData для создания Мешей из Заданий C# и Burst.



Манипулирование мешами из скрипта

Существует три общих задачи, для которых вы можете использовать Mesh API:

1. Создание сетки с нуля: следует всегда производить в следующем порядке:
а) Назначить vertices
b) Назначить triangles.

using UnityEngine;

public class Example : MonoBehaviour { [SerializeField] Vector3[] newVertices; [SerializeField] Vector2[] newUV; [SerializeField] int[] newTriangles;

void Start() { // Create a new Mesh and set its data properties (vertices, UV coordinates, and triangles). Mesh mesh = new Mesh { vertices = newVertices, uv = newUV, triangles = newTriangles };

// After updating the Mesh data, recalculate the normals. // If the Mesh uses shaders with normal maps, also call RecalculateTangents for proper lighting. mesh.RecalculateNormals(); // This assignment is temporary and will reset to the initial Mesh when exiting Play mode. GetComponent<MeshFilter>().mesh = mesh; } }

2. Изменение вершинных атрибутов в каждом кадре:
a) Получение вершин
b) Изменение их
c) Назначение их обратно в сетку.

using System.Collections.Generic;
using UnityEngine;

public class AnimateMesh : MonoBehaviour { Mesh m_Mesh;

readonly List<Vector3> m_InitialVertices = new List<Vector3>(); readonly List<Vector3> m_InitialNormals = new List<Vector3>(); readonly List<Vector3> m_AnimatedVertices = new List<Vector3>();

// Cache the vertices and normals lists, assuming the Mesh does not change. void Start() { m_Mesh = GetComponent<MeshFilter>().mesh; m_Mesh.GetVertices(m_InitialVertices); m_Mesh.GetNormals(m_InitialNormals); m_AnimatedVertices.AddRange(m_InitialVertices); }

void Update() { // Animate the vertices in the direction of the normals. for (var i = 0; i < m_InitialVertices.Count; i++) m_AnimatedVertices[i] = m_InitialVertices[i] + Mathf.Abs(Mathf.Sin(Time.time)) * m_InitialNormals[i];

// Update the mesh with the modified vertex positions. m_Mesh.SetVertices(m_AnimatedVertices); } }

3. Непрерывное изменение треугольников и вершин сетки:
a) Вызов Clear, чтобы начать с нуля
b) Назначение вершин и других атрибутов
c) Назначение индексов треугольников.

Важно вызвать Clear перед назначением новых вершин или треугольников. Unity всегда проверяет предоставленные индексы треугольников, не относятся ли они к вершинам вне границ. Вызов Clear, затем назначение вершин, а затем треугольников гарантирует, что вы никогда не будете иметь данных вне границ.

using UnityEngine;

public class ExampleClass : MonoBehaviour { [SerializeField] Vector3[] newVertices; [SerializeField] Vector2[] newUV; [SerializeField] int[] newTriangles;

void Start() { // Extract a new Mesh instance and automatically assign it to the MeshFilter component. Mesh mesh = GetComponent<MeshFilter>().mesh; // Clear the Mesh to reset its data before assigning new values. mesh.Clear();

// Update the Mesh data. mesh.vertices = newVertices; mesh.uv = newUV; mesh.triangles = newTriangles; // After updating the Mesh data, recalculate the normals. // If the Mesh uses shaders with normal maps, also call RecalculateTangents. mesh.RecalculateNormals(); } }

Дополнительные ресурсы: ,MeshFilter,, ,MeshRenderer,.

Свойства

Свойство Описание
bindposeCountЧисло позиций привязки в сетке.
bindposesПозы связывания. Поза связывания на каждом индексе относится к кости с тем же индексом.
blendShapeCountВозвращает число BlendShape на этой сетке.
boneWeightsBoneWeight для каждой вершины в сетке, которая представляет 4 кости на вершину.
boundsОбъем сетки, содержащий все вершины сетки.
colorsЦвета вершин сетки.
colors32Цвета вершин сетки.
indexBufferTargetПредполагаемое использование буфера индекса Mesh GPU.
indexFormatФормат данных буфера индекса сетки.
isReadableВозвращает true, если Mesh включена для чтения/записи, или false, если она не включена.
lodCountКоличество уровней LOD в этой сетке.
lodSelectionCurveЭта структура представляет параметры, по которым Unity вычисляет, какой уровень Mesh LOD выбрать. Она содержит свойства lodBias и lodSlope, масштабируемые логарифмически относительно площади в пикселях экранного пространства.
normalsМассив векторов, определяющий ориентацию поверхности в каждой вершине сетки.
skinWeightBufferLayoutРазмер данных в буфере по весу костной ткани.
subMeshCountКоличество подсеток внутри объекта Mesh.
tangentsКасательные сетки.
trianglesМассив, содержащий все треугольники в сетке.
uvКоординаты текстуры (UVs) в первом канале.
uv2Координаты текстуры (UVs) во втором канале.
uv3Координаты текстуры (UVs) в третьем канале.
uv4Координаты текстуры (UVs) в четвертом канале.
uv5Координаты текстуры (UVs) в пятом канале.
uv6Координаты текстуры (UVs) в шестом канале.
uv7Координаты текстуры (UVs) в седьмом канале.
uv8Координаты текстуры (UVs) в восьмом канале.
vertexAttributeCountВозвращает число атрибутов вершин, которые имеет сетка. (только для чтения)
vertexBufferCountПолучает число буферов вершин, присутствующих в сетке. (Только для чтения)
vertexBufferTargetПредполагаемое использование вершинного буфера Mesh GPU.
vertexCountВозвращает число вершин в сетке (только для чтения).
verticesВозвращает копию позиций вершин или назначает новый массив позиций вершин.

Конструкторы

Конструктор Описание
MeshСоздает новый пустой объект Mesh, который может быть динамически создан или изменен с помощью скрипта.

Открытые методы

Метод Описание
AddBlendShapeFrameДобавление новой рамки слияния.
ClearОчистка всех данных вершин и всех индексов треугольников.
ClearBlendShapesОчистить все формы слияния из Сетки.
CombineMeshesОбъединяет несколько мешей в эту меш.
GetAllBoneWeightsПолучает весы костей для сетки.
GetBaseVertexПолучает индекс базовой вершины заданной подсетки.
GetBindposesПолучает матрицы привязки, используемые в расчетах скининга.
GetBlendShapeBufferПолучает GraphicsBuffer, который обеспечивает прямой доступ для чтения и записи к GPU данным вершины формы смешивания.
GetBlendShapeBufferRangeПолучить расположение данных вершины формы смешивания для данной формы смешивания.
GetBlendShapeFrameCountВозвращает количество кадров для формы смешивания.
GetBlendShapeFrameVerticesПолучает deltaVertices, deltaNormals и deltaTangents из рамки слияния форм.
GetBlendShapeFrameWeightВозвращает вес рамки слияния.
GetBlendShapeIndexПолучает индекс формы смешивания по заданному имени.
GetBlendShapeNameВозвращает имя BlendShape по заданному индексу.
GetBonesPerVertexЧисло ненулевых весов костей для каждой вершины.
GetBoneWeightBufferПолучает GraphicsBuffer, который обеспечивает прямой доступ для чтения и записи к GPU данным о весе кости.
GetBoneWeightsПолучает весы костей для сетки.
GetColorsПолучает цвета вершин сетки.
GetIndexBufferПолучает GraphicsBuffer в буфер индекса GPU.
GetIndexCountПолучает число индексов заданной подсетки. Если сетка содержит Mesh LODs, число индексов LOD0.
GetIndexStartПолучает расположение начального индекса в буфере индексов Mesh для заданной подсетки.
GetIndicesПолучает список индексов для указанной подсетки.
GetLodПолучает диапазон Mesh LOD (начало индекса и число индексов) для заданного Mesh LOD.
GetLodsПолучает массив, содержащий диапазоны Mesh LOD (начало индекса и число индексов) для заданного Mesh LOD.
GetNativeIndexBufferPtrПолучает указатель на буфер индекса из графической среды (базовая графика API).
GetNativeVertexBufferPtrПолучает собственный (базовый график API) указатель на буфер вершин.
GetNormalsПолучает нормы вершин сетки.
GetSubMeshПолучить информацию о подсете сетки.
GetTangentsПолучает касательные сетки.
GetTopologyПолучает тип топологии указанной подсетки в Сети.
GetTrianglesПолучает список треугольников для указанной подсетки на этом объекте.
GetUVDistributionMetricМетрика распределения UV может быть использована для вычисления желаемого уровня mipmap на основе положения камеры.
GetUVsПолучает координаты текстуры (UVs), хранящиеся в заданном канале.
GetVertexAttributeВозвращает информацию об атрибуте вершины на основе его индекса.
GetVertexAttributeDimensionПолучить размерность определенного атрибута данных вершины на этой сетке.
GetVertexAttributeFormatПолучить формат определенного атрибута данных вершины на этой сетке.
GetVertexAttributeOffsetПолучить смещение в потоке вершинного буфера определенного атрибута данных вершины на этой сетке.
GetVertexAttributesПолучить информацию об атрибутах вершины сетки.
GetVertexAttributeStreamПолучает индекс потока вершинного буфера определенного атрибута данных вершины на этой Сети.
GetVertexBufferПолучает GraphicsBuffer, который предоставляет прямой доступ к буферу вершин GPU.
GetVertexBufferStrideПолучить шаг потока вершинного буфера в байтах.
GetVerticesПолучает позиции вершин сетки.
HasVertexAttributeПроверяет, существует ли в этой Сети конкретный атрибут данных вершины.
MarkDynamicПодсказывает, что данные геометрии сетки будут обновляться часто, оптимизируя стратегии буферизации GPU для потенциально более быстрого обновления данных.
MarkModifiedУведомляет компоненты рендерера об изменении геометрии сетки.
OptimizeОптимизирует данные Mesh для повышения производительности отображения.
OptimizeIndexBuffersОптимизирует геометрию сетки для повышения производительности рендеринга.
OptimizeReorderVertexBufferОптимизирует вершины сетки для повышения производительности рендеринга.
RecalculateBoundsПересчитайте объем границы меши и всех ее подсеток с помощью данных вершин.
RecalculateNormalsПересчитывает нормы сетки из треугольников и вершин.
RecalculateTangentsПересчитывает касательные сетки из координат нормали и текстуры.
RecalculateUVDistributionMetricПересчитывает метрику распределения UV сетки из вершин и ультрафиолетовых координат.
RecalculateUVDistributionMetricsПересчитывает метрики распределения UV сетки из вершин и ультрафиолетовых координат.
SetBindposesЗадает позиции привязки сетки.
SetBoneWeightsЗадает вес костной структуры для сетки.
SetColorsУстановить цвета сетки на вершину.
SetIndexBufferDataЗадает данные для индексного буфера Mesh.
SetIndexBufferParamsЗадает размер и формат буфера индекса.
SetIndicesЗадает индексный буфер для подсетки.
SetLodЗадает диапазон Mesh LOD (начало индекса и число индексов) для данной подсетки и уровня детализации.
SetLodsУстанавливает диапазоны Mesh LOD (начало индекса и число индексов) для заданного подсетки с массивом.
SetNormalsУстанавливает нормали сетки.
SetSubMeshЗадает информацию о подсети Сетки.
SetSubMeshesУстанавливает информацию, определяющую все подсетки в этой меше, заменяя любые существующие подсетки.
SetTangentsУстановить касательные сетки.
SetTrianglesЗадает список треугольников для подсетки.
SetUVsУстанавливает координаты текстуры (UVs), хранящиеся в заданном канале.
SetVertexBufferDataУстанавливает данные в поток определенного вершинного буфера, копируя элементы из исходного контейнера в целевой диапазон в буфере Mesh.
SetVertexBufferParamsЗадает размер и расположение вершинного буфера.
SetVerticesНазначает новый массив позиций вершин.
UploadMeshDataЗагрузить ранее сделанные модификации Mesh в графику API.

Статические методы

Метод Описание
AcquireReadOnlyMeshDataПолучает снимок данных Mesh для доступа только для чтения.
AllocateWritableMeshDataВыделяет структуры данных для создания сетки с помощью заданий C#.
ApplyAndDisposeWritableMeshDataПрименяет данные, определенные в структурах MeshData, к объектам Mesh.
Унаследованные члены 4

Свойства

СвойствоОписание
hideFlagsДолжен ли объект быть скрытым, сохраняться с Scene или изменяться пользователем?
nameИмя объекта.

Открытые методы

МетодОписание
GetInstanceIDПолучает экземпляр ID объекта.
ToStringВозвращает имя объекта.

Статические методы

МетодОписание
DestroyУдаляет GameObject, компонент или ресурс.
DestroyImmediateНемедленно уничтожает указанный объект. Используйте с осторожностью и только в режиме редактирования.
DontDestroyOnLoadНе уничтожать целевой Объект при загрузке нового Scene.
FindAnyObjectByTypeПолучает любой активный загруженный объект типа Type.
FindFirstObjectByTypeПолучает первый активный загруженный объект типа Type.
FindObjectsByTypeПолучает список всех загруженных объектов типа Type.
InstantiateКлонирует исходный объект и возвращает клон.
InstantiateAsyncЗахватывает моментальный снимок первоначального объекта (который должен быть связан с каким-либо GameObject) и возвращает AsyncInstantiateOperation.

Операторы

ОператорОписание
boolСуществует ли объект?
оператор!=Сравнивает, если два объекта ссылаются на разные объекты.
оператор ==Сравнение двух ссылок на объекты для определения того, относятся ли они к одному и тому же объекту.