用于通过脚本创建或修改网格的类。
网格包含顶点和多个三角形数组。
请参阅程序化示例项目
以了解使用网格接口的示例。
三角形数组是顶点数组的简单索引;每个三角形三个索引。
对于每个顶点,可能有一条法线、两个纹理坐标、颜色和切线。
不过这些内容是可选的,可以随意删除。所有顶点信息都存储在具有相同
大小的单独数组中,因此如果网格有 10 个顶点,则还会有大小为 10 的数组
以用于法线和其他属性。
您可能需要将可修改的网格接口用于 3 种用途:
1.从头开始构建网格:
应始终按以下顺序进行:\
a) 分配 vertices\
b) 分配 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.每一帧都修改顶点属性:\ a) 获取顶点\ b) 修改它们\ c) 将它们分配回网格。
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.连续更改网格三角形和顶点:\
a) 调用 Clear 以开始刷新\
b) 分配顶点和其他属性\
c) 分配三角形索引。
在分配新顶点或三角形之前调用 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 | 每个顶点的骨骼权重。 | 
| bounds | 网格的包围体。 | 
| colors | 网格的顶点颜色。 | 
| colors32 | 网格的顶点颜色。 | 
| indexFormat | 网格索引缓冲区数据的格式。 | 
| isReadable | 如果网格支持读/写,则返回 true,否则返回 false。 | 
| normals | 网格的法线。 | 
| subMeshCount | Mesh 对象中的子网格数。 | 
| tangents | 网格的切线。 | 
| triangles | 包含网格中所有三角形的数组。 | 
| uv | 网格的基础纹理坐标。 | 
| uv2 | 网格的第二个纹理坐标集(如果存在)。 | 
| uv3 | 网格的第三个纹理坐标集(如果存在)。 | 
| uv4 | 网格的第四个纹理坐标集(如果存在)。 | 
| uv5 | 网格的第五个纹理坐标集(如果存在)。 | 
| uv6 | 网格的第六个纹理坐标集(如果存在)。 | 
| uv7 | 网格的第七个纹理坐标集(如果存在)。 | 
| uv8 | 网格的第八个纹理坐标集(如果存在)。 | 
| vertexBufferCount | 获取网格中存在的顶点缓冲区数。(只读) | 
| vertexCount | 返回网格中的顶点数(只读)。 | 
| vertices | 返回顶点位置的副本或分配新顶点位置数组。 | 
| Mesh | 创建空网格。 | 
| AddBlendShapeFrame | 添加新的混合形状帧。 | 
| Clear | 清除所有顶点数据和所有三角形索引。 | 
| ClearBlendShapes | 从网格中清除所有混合形状。 | 
| CombineMeshes | 将多个网格合并到此网格中。 | 
| GetBaseVertex | 获取给定 sub-mesh 的基顶点索引。 | 
| GetBindposes | 获取此实例的绑定姿势。 | 
| GetBlendShapeFrameCount | 返回混合形状的帧计数。 | 
| GetBlendShapeFrameVertices | 检索混合形状帧的 deltaNormals、deltaNormals 和 /deltaTangents/。 | 
| GetBlendShapeFrameWeight | 返回混合形状帧的权重。 | 
| GetBlendShapeIndex | 按给定名称返回 BlendShape 的索引。 | 
| GetBlendShapeName | 按给定索引返回 BlendShape 的名称。 | 
| GetBoneWeights | 获取此实例的骨骼权重。 | 
| GetColors | 获取此实例的顶点颜色。 | 
| GetIndexCount | 获取给定 sub-mesh 的索引计数。 | 
| GetIndexStart | 对于给定 /sub-mesh/,获取网格索引缓冲区中的起始索引位置。 | 
| GetIndices | 获取指定子网格的索引列表。 | 
| GetNativeIndexBufferPtr | 检索指向索引缓冲区的原生(底层图形 API)指针。 | 
| GetNativeVertexBufferPtr | 检索指向顶点缓冲区的原生(底层图形 API)指针。 | 
| GetNormals | 获取此实例的顶点法线。 | 
| GetTangents | 获取此实例的切线。 | 
| GetTopology | 获取子网格的拓扑。 | 
| GetTriangles | 获取此对象上指定子网格的切线列表。 | 
| GetUVDistributionMetric | UV 分布指标可用于根据摄像机的位置计算所需的 Mipmap 级别。 | 
| GetUVs | 获取网格的 UV。 | 
| GetVertices | 获取此实例的顶点位置。 | 
| MarkDynamic | 优化网格以便频繁更新。 | 
| RecalculateBounds | 从顶点重新计算网格的包围体。 | 
| RecalculateNormals | 从三角形和顶点重新计算网格的法线。 | 
| RecalculateTangents | 从法线和纹理坐标重新计算网格的切线。 | 
| SetColors | 网格的顶点颜色。 | 
| SetIndices | 为子网格设置索引缓冲区。 | 
| SetNormals | 设置网格的法线。 | 
| SetTangents | 设置网格的切线。 | 
| SetTriangles | 为子网格设置三角形列表。 | 
| SetUVs | 设置网格的 UV。 | 
| SetVertices | 分配新的顶点位置数组。 | 
| UploadMeshData | 将以前进行的网格修改上传到图形 API。 | 
| GetInstanceID | 返回对象的实例 ID。 | 
| ToString | 返回 GameObject 的名称。 | 
| Destroy | 删除 GameObject、组件或资源。 | 
| DestroyImmediate | 立即销毁对象 /obj/。强烈建议您改用 Destroy。 | 
| DontDestroyOnLoad | 在加载新的 Scene 时,请勿销毁 Object。 | 
| FindObjectOfType | 返回第一个类型为 type 的已加载的激活对象。 | 
| FindObjectsOfType | 返回所有类型为 type 的已加载的激活对象的列表。 | 
| Instantiate | 克隆 original 对象并返回克隆对象。 | 
| bool | 该对象是否存在? | 
| operator != | 比较两个对象是否引用不同的对象。 | 
| operator == | 比较两个对象引用,判断它们是否引用同一个对象。 |