Описание
Класс, позволяющий создавать или изменять сетки.
Сети содержат вершины и несколько массивов треугольников.
Массивы треугольников являются индексами массивов вершин; три индекса для каждого треугольника.
Для каждой вершины может быть нормаль, восемь текстурных координат, цвет, касательная и вес кости. Они являются необязательными и могут быть удалены по желанию. Вся информация о вершинах хранится в отдельных массивах одинакового размера, поэтому, если ваша сетка имеет 10 вершин, у вас также будут массивы 10-го размера для нормалей и других атрибутов.
Концептуально все данные вершин хранятся в отдельных массивах одинакового размера. Например, если у вас есть сетка из 100 вершин и вы хотите иметь позицию, нормаль и две координаты текстуры для каждой вершины, то сетка должна иметь vertices, normals, uv и uv2, каждый из которых 100 размер. Данные для i-й вершины находятся по индексу "i" в каждом массиве.
Для каждой вершины может быть положение вершины, нормаль, касательная, цвет и до 8 текстурных координат. Координаты текстур чаще всего являются 2D-данными (Vector2), но их можно сделать Vector3 или Vector4 при необходимости. Это чаще всего используется для хранения произвольных данных в вершинах сетки, для специальных эффектов, используемых в шейдерах. Для каркасных сеток данные вершин также могут содержать boneWeights.
Данные грани сетки, то есть треугольники, из которых она состоит, представляют собой просто три индекса вершин для каждого треугольника. Например, если в сетке 10 треугольников, то массив triangles должен содержать 30 чисел, каждое из которых указывает, какую вершину использовать. Первые три элемента в массиве треугольников — это индексы вершин, составляющих этот треугольник; вторые три элемента составляют еще один треугольник и так далее.
Обратите внимание, что, хотя треугольные сетки являются наиболее распространенным вариантом использования, Unity также поддерживает другие типы топологии сетки, например линейные или точечные сетки. Для линейных сеток каждая линия состоит из двух индексов вершин и так далее. См. разделы SetIndices и Топология сетки.
Простой и расширенный API Mesh
Класс Mesh имеет два набора методов для назначения данных Mesh из скрипта. «Простой» набор методов обеспечивает основу для установки индексов, треугольников, нормалей, касательных и т. д. Эти методы включают в себя проверки правильности, например, чтобы гарантировать, что вы не передаете данные, которые могут включать индексы за пределами границ. Они представляют собой стандартный способ назначения данных Mesh из скрипта в Unity.
«Простые» методы: SetColors, SetIndices, SetNormals, SetTangents, SetTriangles, SetUVs, SetVertices, SetBoneWeights.
Существует также «расширенный» набор методов, которые позволяют вам напрямую записывать данные сетки с контролем над тем, должны ли выполняться какие-либо проверки или проверки. Эти методы предназначены для расширенных вариантов использования, требующих максимальной производительности. Они быстрее, но позволяют пропустить проверку предоставленных вами данных. Если вы используете эти методы, вы должны убедиться, что вы не предоставляете неверные данные, потому что Unity не будет проверять вас.
Расширенные методы: SetVertexBufferParams, SetVertexBufferData, SetIndexBufferParams, SetIndexBufferData, SetSubMesh, и вы можете использовать MeshUpdateFlags для управления тем, какие проверки или проверки выполняются или не выполняются. Используйте AcquireReadOnlyMeshData, чтобы сделать моментальный снимок данных Mesh только для чтения, который можно использовать с C# Jobs и Burst, и AllocateWritableMeshData с помощью ApplyAndDisposeWritableMeshData для создания мешей из C# Jobs и Burst.
Управление сетками из скрипта
Существует три общих задачи, для которых можно использовать Mesh API:
1. Построение сетки с нуля: всегда следует выполнять в следующем порядке:
а) Назначить vertices
б) Назначьте triangles.
using UnityEngine;
public class Example : MonoBehaviour
{
Vector3[] newVertices;
Vector2[] newUV;
int[] newTriangles;
void Start()
{
Mesh mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.triangles = newTriangles;
}
}
2. Изменение атрибутов vertices в каждом кадре:
а) Получить vertices
б) Изменить их
в) Назначьте их обратно в сетку.
using UnityEngine;
public class Example : MonoBehaviour
{
void Update()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
Vector3[] normals = mesh.normals;
for (var i = 0; i < vertices.Length; i++)
{
vertices[i] += normals[i] * Mathf.Sin(Time.time);
}
mesh.vertices = vertices;
}
}
3. Постоянное изменение треугольников и вершин сетки:
а) Вызовите Clear, чтобы начать заново
б) Назначить vertices и другие атрибуты
c) Назначить индексы у triangle.
Важно вызывать Clear перед назначением новых вершин или треугольников. Unity всегда проверяет предоставленные индексы треугольников, не ссылаются ли они на вершины, находящиеся за границами. Вызов Clear с последующим назначением вершин, а затем треугольников гарантирует, что у вас никогда не будет данных за границами.
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
Vector3[] newVertices;
Vector2[] newUV;
int[] newTriangles;
void Start()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.Clear();
// Do some calculations...
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.triangles = newTriangles;
}
}
Свойства
bindposes | Позы привязки. Поза привязки в каждом индексе относится к кости с тем же индексом. |
blendShapeCount | Возвращает счетчик BlendShape для этой сетки. |
boneWeights | BoneWeight для каждой вершины в меше, который представляет 4 кости на вершину. |
bounds | Ограничивающий объем сетки. |
colors | Цвета вершин сетки. |
colors32 | Цвета вершин сетки. |
indexFormat | Формат данных буфера индекса сетки. |
isReadable | Возвращает true, если Mesh разрешено чтение/запись, или false, если нет. |
normals | Нормали сетки. |
subMeshCount | Количество подсетей внутри объекта Mesh. |
tangents | Касательные сетки. |
triangles | Массив, содержащий все треугольники в сетке. |
uv | Координаты базовой текстуры меша. |
uv2 | Второй набор текстурных координат меша, если он есть. |
uv3 | Третий набор текстурных координат меша, если он присутствует. |
uv4 | Четвертый набор текстурных координат меша, если он присутствует. |
uv5 | Пятый набор текстурных координат меша, если он присутствует. |
uv6 | Шестой набор текстурных координат меша, если он присутствует. |
uv7 | Седьмой набор текстурных координат меша, если он есть. |
uv8 | Восьмой набор текстурных координат меша, если он есть. |
vertexAttributeCount | Возвращает количество атрибутов вершин, которые имеет сетка. (Только чтение) |
vertexBufferCount | Получает количество буферов вершин, присутствующих в сетке. (Только чтение) |
vertexCount | Возвращает количество вершин в сетке (только для чтения). |
vertices | Возвращает копию позиций вершин или присваивает новый массив позиций вершин. |
Конструкторы
Mesh | Создает пустую сетку. |
Публичные Методы
AddBlendShapeFrame | Добавляет новую рамку плавной формы. |
Clear | Очищает все данные вершин и все индексы треугольников. |
ClearBlendShapes | Удаляет все формы перехода из сетки. |
CombineMeshes | Объединяет несколько сеток в эту сетку. |
GetAllBoneWeights | Получает вес костей для сетки. |
GetBaseVertex | Получает индекс базовой вершины данной подсетки. |
GetBindposes | Получает позы связывания сетки. |
GetBlendShapeFrameCount | Возвращает количество кадров для формы перехода. |
GetBlendShapeFrameVertices | Получает deltaVertices, deltaNormals и deltaTangents фрейма плавной формы. |
GetBlendShapeFrameWeight | Возвращает вес кадра плавной формы. |
GetBlendShapeIndex | Возвращает индекс BlendShape по заданному имени. |
GetBlendShapeName | Возвращает имя BlendShape по заданному индексу. |
GetBonesPerVertex | Количество ненулевых весов костей для каждой вершины. |
GetBoneWeights | Получает вес костей для сетки. |
GetColors | Получает цвета вершин сетки. |
GetIndexCount | Получает количество индексов данной подсетки. |
GetIndexStart | Получает начальное положение индекса в индексном буфере сетки для заданной подсети. |
GetIndices | Выбирает список индексов для указанной вложенной сетки. |
GetNativeIndexBufferPtr | Извлекает собственный (основной графический API) указатель на индексный буфер. |
GetNativeVertexBufferPtr | Извлекает собственный (основной графический API) указатель на буфер вершин. |
GetNormals | Получает нормали вершин сетки. |
GetSubMesh | Получить информацию о подсетке Mesh. |
GetTangents | Получает касательные сетки. |
GetTopology | Получает топологию вложенной сетки. |
GetTriangles | Выбирает список треугольников для указанной вложенной сетки этого объекта. |
GetUVDistributionMetric | Метрику распределения UV можно использовать для расчета желаемого уровня MIP-карты на основе положения камеры. |
GetUVs | Получает UV сетки. |
GetVertexAttribute | Возвращает информацию об атрибуте вершины на основе его индекса. |
GetVertexAttributeDimension | Получить измерение определенного атрибута данных вершины в этой сетке. |
GetVertexAttributeFormat | Получить формат определенного атрибута данных вершины в этой сетке. |
GetVertexAttributes | Получить информацию об атрибутах вершин сетки. |
GetVertices | Получает позиции вершин сетки. |
HasVertexAttribute | Проверяет, существует ли определенный атрибут данных вершины в этой сетке. |
MarkDynamic | Оптимизируйте сетку для частых обновлений. |
MarkModified | Уведомлять компоненты средства визуализации об изменении геометрии сетки. |
Optimize | Оптимизирует данные сетки для повышения производительности рендеринга. |
OptimizeIndexBuffers | Оптимизирует геометрию сетки для повышения производительности рендеринга. |
OptimizeReorderVertexBuffer | Оптимизирует вершины сетки для повышения производительности рендеринга. |
RecalculateBounds | Пересчитайте ограничивающий объем сетки по вершинам. |
RecalculateNormals | Пересчитывает нормали Меша из треугольников и вершин. |
RecalculateTangents | Пересчитывает касательные сетки по нормалям и координатам текстуры. |
RecalculateUVDistributionMetric | Пересчитывает метрику UV-распределения Mesh по вершинам и UV-координатам. |
RecalculateUVDistributionMetrics | Пересчитывает метрики UV-распределения Mesh по вершинам и UV-координатам. |
SetBoneWeights | Устанавливает вес костей для сетки. |
SetColors | Установите цвета для каждой вершины сетки. |
SetIndexBufferData | Устанавливает данные индексного буфера Mesh. |
SetIndexBufferParams | Устанавливает размер и формат индексного буфера. |
SetIndices | Устанавливает индексный буфер для вложенной сетки. |
SetNormals | Установите нормали сетки. |
SetSubMesh | Задает информацию о подсетке сетки. |
SetSubMeshes | Задает информацию, определяющую все подсетки в этой сетке, заменяя любые существующие подсетки. |
SetTangents | Установите касательные сетки. |
SetTriangles | Задает список треугольников для подсетки. |
SetUVs | Устанавливает UV сетки. |
SetVertexBufferData | Устанавливает данные буфера вершин меша. |
SetVertexBufferParams | Устанавливает размер и расположение буфера вершин. |
SetVertices | Назначает новый массив позиций вершин. |
UploadMeshData | Загрузить ранее выполненные модификации Mesh в графический API. |
Статические Методы
AcquireReadOnlyMeshData | Получает снимок данных Mesh для доступа только для чтения. |
AllocateWritableMeshData | Выделяет структуры данных для создания сетки с помощью заданий C#. |
ApplyAndDisposeWritableMeshData | Применяет данные, определенные в структурах MeshData, к объектам Mesh. |
Унаследованные члены
Свойства
hideFlags | Должен ли объект быть скрыт, сохранен вместе со сценой или изменен пользователем? |
name | Имя объекта. |
Публичные Методы
GetInstanceID | Возвращает id экземпляра объекта. |
ToString | Возвращает имя объекта. |
Статические Методы
Destroy | Удаляет игровой объект, компонент или актив. |
DestroyImmediate | Уничтожает объект obj. Вместо этого рекомендуется использовать метод Destroy. |
DontDestroyOnLoad | Не уничтожает целевой объект при загрузке новой сцены. . |
FindObjectOfType | Возвращает первый активный загруженный объект. |
FindObjectsOfType | Получает список всех загруженных объектов. |
Instantiate | Клонирует исходный объект и возвращает клон. |
Операторы
bool | Объект существует? |
operator != | Сравнивает, ссылаются ли два объекта на другой объект. |
operator == | Сравнивает две ссылки на объекты, чтобы определить, ссылаются ли они на один и тот же объект. |