Mesh
Описание
Класс, позволяющий создавать и изменять меши.
Меши содержат вершины и множественные массивы треугольников.
Концептуально, все вершинные данные хранятся в отдельных массивах одинакового размера. Например, если у вас есть сетка из 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 на этой сетке. |
| boneWeights | BoneWeight для каждой вершины в сетке, которая представляет 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 | Существует ли объект? |
| оператор!= | Сравнивает, если два объекта ссылаются на разные объекты. |
| оператор == | Сравнение двух ссылок на объекты для определения того, относятся ли они к одному и тому же объекту. |