Unity创建平面网格时mesh.triangles长度为0及索引越界问题求助
问题排查与修复方案
报错含义解释
你遇到的Failed setting triangles. Some indices are referencing out of bounds vertices. IndexCount: 6, VertexCount: 4报错含义为:
三角形索引设置失败,部分索引值超出了当前网格顶点数组的下标范围。本次你提交的三角形索引总数为6个,但当前网格的顶点总数仅为4个,顶点下标仅支持0~3。
Unity检测到索引越界时会直接拒绝本次mesh.triangles赋值操作,这就是你赋值后mesh.triangles.Length为0的原因。
根因分析
你的代码存在两个核心错误:
- 非首次调用(
first=false)时,你直接用mesh.vertices = new Vector3[] {...}的方式赋值,直接覆盖了首次调用时写入的4个顶点,而非在原有顶点基础上追加。此时整个Mesh的顶点总数只有4个,自然无法支撑4~7的下标索引。 - 你仅计划合并三角形数组,没有同步合并顶点、法线、切线、UV数组,逻辑不完整。
修复方案
修改非首次调用分支的逻辑,改为先读取原有Mesh数据,和新数据合并后再重新赋值给Mesh,参考代码如下:
private void CreateQuad(ref Mesh mesh, Vector3 offset, bool first) { if (first) { // 首次初始化逻辑保持不变 mesh.vertices = new Vector3[] { Vector3.zero, Vector3.right, Vector3.forward, new Vector3(1, 0, 1) }; mesh.triangles = new int[] { 0, 2, 1, 1, 2, 3 }; mesh.normals = new Vector3[] { Vector3.back, Vector3.back, Vector3.back, Vector3.back }; mesh.tangents = new Vector4[] { new Vector4(1, 0, 0, -1), new Vector4(1, 0, 0, -1), new Vector4(1, 0, 0, -1), new Vector4(1, 0, 0, -1) }; mesh.uv = new Vector2[] { Vector2.zero, Vector2.right, Vector2.up, Vector2.one }; } else { // 先读取原有Mesh数据 Vector3[] oldVertices = mesh.vertices; Vector3[] oldNormals = mesh.normals; Vector4[] oldTangents = mesh.tangents; Vector2[] oldUvs = mesh.uv; int[] oldTriangles = mesh.triangles; // 定义新Quad的所有数据 Vector3[] newVertices = new Vector3[] { Vector3.zero + offset, Vector3.right + offset, Vector3.forward + offset, new Vector3(1, 0, 1) + offset }; Vector3[] newNormals = new Vector3[] { Vector3.back, Vector3.back, Vector3.back, Vector3.back }; Vector4[] newTangents = new Vector4[] { new Vector4(1, 0, 0, -1), new Vector4(1, 0, 0, -1), new Vector4(1, 0, 0, -1), new Vector4(1, 0, 0, -1) }; Vector2[] newUvs = new Vector2[] { Vector2.zero, Vector2.right, Vector2.up, Vector2.one }; int[] newTriangles = new int[] { 4, 6, 5, 5, 6, 7 }; // 合并数组后重新赋值给Mesh mesh.vertices = oldVertices.Concat(newVertices).ToArray(); mesh.normals = oldNormals.Concat(newNormals).ToArray(); mesh.tangents = oldTangents.Concat(newTangents).ToArray(); mesh.uv = oldUvs.Concat(newUvs).ToArray(); mesh.triangles = oldTriangles.Concat(newTriangles).ToArray(); Debug.Log(mesh.triangles.Length); } }
注意事项
- 如果后续要生成更多Quad,总顶点数超过65535时,需要提前设置
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32,避免16位索引溢出。 - 初始化Mesh时可调用一次
mesh.Clear()清空原有脏数据,避免历史数据干扰。
内容的提问来源于stack exchange,提问作者WeirdGuy
相关产品推荐
相关产品推荐

