Mesh.SetVertices
Declaration
public void SetVertices(Vector3[] inVertices);public void SetVertices(List<Vector3> inVertices);public void SetVertices(NativeArray<T> inVertices);Параметры
| Параметр | Описание |
|---|---|
| inVertices | Положение вершины для копирования, которое заменяет существующие вершины Mesh и устанавливает новое количество вершин. |
Описание
Назначает новый массив позиций вершин.
Используйте этот метод, чтобы назначить полный набор вершинных позиций для Mesh. Это фундаментальная операция для процедурного определения или изменения формы сетки.
Обработка данных:
Когда вы предоставляете контейнер, Unity копирует данные о позиции из вашего контейнера в Mesh internal storage.
- Вы можете безопасно изменить свой оригинальный контейнер после вызова SetVertices без изменения данных Mesh.
- Вы можете повторно использовать один и тот же исходный контейнер для установки данных для нескольких различных объектов Mesh.
- Mesh не сохраняет ссылку на ваш оригинальный контейнер (особенно актуально для управляемых массивов и списков).
Количество вершин: Вызов этого метода перезапишет все существующие позиции вершин. Количество вершин Mesh (см. vertexCount) будет скорректировано, чтобы соответствовать количеству элементов в контейнере inVertices, который вы предоставляете. Если вы впоследствии установите другие данные на вершину (например, нормали или UVs), убедитесь, что их количество соответствует новому количеству вершин.
Этот метод часто используется как основная реализация для установщика свойств vertices. Для частых обновлений, рассмотрите возможность вызова MarkDynamic в первую очередь, что может повысить производительность за счет оптимизации основополагающей стратегии буфера GPU.
using UnityEngine; using Unity.Collections;
// This script demonstrates how to create a simple quad mesh from scratch. // Attach this script to an empty GameObject. It will create a Mesh and // assign it to the MeshFilter, and add a default material to the MeshRenderer. [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class SetVerticesFullExample : MonoBehaviour { private Material m_Material; private Mesh m_Mesh;
void Start() { // Create a new mesh object. m_Mesh = new Mesh(); m_Mesh.name = "Procedural Quad";
// Define the vertex and triangle data. var vertices = new NativeArray<Vector3>(4, Allocator.Temp); vertices[0] = new Vector3(-1, 0, -1); vertices[1] = new Vector3(-1, 0, 1); vertices[2] = new Vector3( 1, 0, 1); vertices[3] = new Vector3( 1, 0, -1); var triangles = new NativeArray<int>(6, Allocator.Temp); triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; // First triangle triangles[3] = 0; triangles[4] = 2; triangles[5] = 3; // Second triangle
// Populate the mesh with the data. m_Mesh.SetVertices(vertices); m_Mesh.SetIndices(triangles, MeshTopology.Triangles, 0); // Dispose of the NativeArrays now that the data is in the mesh. vertices.Dispose(); triangles.Dispose();
// Finalize the mesh state for rendering. m_Mesh.RecalculateNormals(); m_Mesh.RecalculateBounds();
// Get the required components and assign the fully constructed mesh and a material. var meshFilter = GetComponent<MeshFilter>(); meshFilter.sharedMesh = m_Mesh;
var renderer = GetComponent<MeshRenderer>(); if (renderer.sharedMaterial == null) { m_Material = new Material(Shader.Find("Unlit/Color")); renderer.sharedMaterial = m_Material; } }
void OnDestroy() { // Destroy the mesh when the component is destroyed to prevent memory leaks. if (m_Mesh != null) Destroy(m_Mesh); if (m_Material != null) Destroy(m_Material); } }
Дополнительные ресурсы: ,Mesh.vertices,, ,Mesh.vertexCount,, ,Mesh.SetIndices,, ,Mesh.SetNormals,, ,Mesh.SetUVs,, ,Mesh.MarkDynamic,, ,Mesh.RecalculateNormals,.
Declaration
public void SetVertices(Vector3[] inVertices, int start, int length, Rendering.MeshUpdateFlags flags = MeshUpdateFlags.Default);public void SetVertices(List<Vector3> inVertices, int start, int length, Rendering.MeshUpdateFlags flags = MeshUpdateFlags.Default);public void SetVertices(NativeArray<T> inVertices, int start, int length, Rendering.MeshUpdateFlags flags = MeshUpdateFlags.Default);Параметры
| Параметр | Описание |
|---|---|
| inVertices | Положение вершины для копирования, которое заменяет существующие вершины Mesh и устанавливает новое количество вершин. |
| начало | Нулевой индекс в inVertices, где начинается фрагмент копируемых данных. |
| длина | Число вершин, которые будут скопированы из inVertices, начиная с индекса start, который также становится новым числом вершин Mesh. |
| флаги | Необязательные флаги для управления поведением после установки вершин, например, пропуск автоматического перерасчета границ (по умолчанию MeshUpdateFlags.Default). |
Описание
Задает позиции вершин для всего Mesh с использованием данных, скопированных из конкретного сегмента исходного контейнера.
Используйте этот метод, чтобы назначить полный набор вершинных позиций для Mesh, источник данных из части более крупного массива, списка, или NativeArray.
Обработка и разделение данных:
Этот метод ведет себя аналогично полной перегрузке контейнера, но использует только элементы из inVertices контейнер начиная с start индекс и принимает @@length@ число элементов. Unity копирует этот фрагмент данных о местоположении в Mesh internal storage.
- Как и при полной перегрузке, вы можете безопасно изменить оригинальный исходный контейнер после вызова этого метода, не влияя на данные
Mesh. - Mesh не сохраняет ссылку на ваш оригинальный контейнер.
- Убедитесь, что
startиlengthопределяют допустимый диапазон в пределах контейнераinVertices.
Mesh Update Flags: параметр flags позволяет управлять операциями после обновления. Например, использование MeshUpdateFlags.DontRecalculateBounds может предотвратить автоматический и потенциально затратный пересчёт границ меша, если вы собираетесь позже задать их вручную или знаете, что они существенно не изменились. См. MeshUpdateFlags для получения подробных сведений.
При частых обновлениях с использованием срезов сначала можно вызвать MarkDynamic, чтобы потенциально повысить производительность.
using UnityEngine; using Unity.Collections; using UnityEngine.Rendering;
// This script demonstrates how to set mesh vertices using a slice of a larger data array. // It creates two quads' worth of vertex data but only displays one at a time. // Use the "Start Index Group" slider in the Inspector to switch between them. [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class SetVerticesPartialExample : MonoBehaviour { [Range(0,1)] public int startIndexGroup = 0;
private Mesh m_Mesh; private NativeArray<Vector3> m_AllVertices; private int m_PreviousIndexGroup = -1;
void Start() { m_Mesh = new Mesh(); m_Mesh.name = "Partial Vertices Mesh";
// Create a persistent NativeArray containing data for multiple potential quads. m_AllVertices = new NativeArray<Vector3>(8, Allocator.Persistent);
// Quad 1 vertices (group 0) m_AllVertices[0] = new Vector3(-1, 0, -1); m_AllVertices[1] = new Vector3(-1, 0, 1); m_AllVertices[2] = new Vector3( 1, 0, 1); m_AllVertices[3] = new Vector3( 1, 0, -1);
// Quad 2 vertices (group 1), offset on X axis m_AllVertices[4] = new Vector3( 2, 0, -1); m_AllVertices[5] = new Vector3( 2, 0, 1); m_AllVertices[6] = new Vector3( 4, 0, 1); m_AllVertices[7] = new Vector3( 4, 0, -1);
var renderer = GetComponent<MeshRenderer>(); renderer.material = new Material(Shader.Find("Unlit/Color"));
var meshFilter = GetComponent<MeshFilter>(); meshFilter.mesh = m_Mesh; }
void Update() { if (m_PreviousIndexGroup == startIndexGroup) return;
m_PreviousIndexGroup = startIndexGroup;
// Set the mesh vertices using a slice of the full data array. int dataLength = 4; int startIndex = startIndexGroup * dataLength;
// Copy the slice from m_AllVertices into the Mesh. m_Mesh.SetVertices(m_AllVertices, startIndex, dataLength, MeshUpdateFlags.DontRecalculateBounds);
// Define the triangles for a single quad using a NativeArray. var triangles = new NativeArray<int>(6, Allocator.Temp); triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; triangles[3] = 0; triangles[4] = 2; triangles[5] = 3; m_Mesh.SetIndices(triangles, MeshTopology.Triangles, 0); triangles.Dispose();
// Recalculate bounds and normals manually. m_Mesh.RecalculateBounds(); m_Mesh.RecalculateNormals();
Debug.Log($"Mesh updated to show vertex group {startIndexGroup}."); }
void OnDestroy() { // Dispose the persistent NativeArray and destroy the mesh to prevent memory leaks. if (m_AllVertices.IsCreated) m_AllVertices.Dispose();
if (m_Mesh != null) Destroy(m_Mesh); } }
Дополнительные ресурсы: ,Mesh.vertices,, ,Mesh.vertexCount,, ,Mesh.SetIndices,, ,Mesh.SetNormals,, ,Mesh.SetUVs,, ,Mesh.MarkDynamic,, ,MeshUpdateFlags,, ,Mesh.UploadMeshData,.