Unity 3D中Mesh渲染出现IndexOutOfRangeException错误的修复方案
Unity Mesh生成报错IndexOutOfRangeException的修复方案
错误根源分析
- 顶点数组长度不足:创建顶点数组时计算错误,循环遍历顶点使用
z <= zSize和x <= xSize,意味着每个轴上有xSize+1和zSize+1个顶点,总顶点数应为(xSize + 1) * (zSize + 1),而非原代码的xSize * zSize,导致数组容量不足,赋值时触发越界。 - 三角形生成缺失z轴遍历:原代码仅遍历x方向生成单排三角形,无法构建完整平面,且顶点索引计算未考虑z轴偏移,后续扩展时会引发索引越界。
修改后的CreateShape方法
void CreateShape() { // 修正顶点数组长度,匹配实际生成的顶点数量 vertices = new Vector3[(xSize + 1) * (zSize + 1)]; int i = 0; for (int z = 0; z <= zSize; z++) { for (int x = 0; x <= xSize; x++) { vertices[i] = new Vector3(x, 0, z); i++; } } triangles = new int[xSize * zSize * 6]; int vert = 0; int tris = 0; // 添加z轴循环,遍历每一行生成网格 for (int z = 0; z < zSize; z++) { for (int x = 0; x < xSize; x++) { triangles[tris + 0] = vert + 0; triangles[tris + 1] = vert + xSize + 1; triangles[tris + 2] = vert + 1; triangles[tris + 3] = vert + 1; triangles[tris + 4] = vert + xSize + 1; triangles[tris + 5] = vert + xSize + 2; vert++; tris += 6; } // 跳过每行最后一个顶点,避免下一行索引错误 vert++; } }
关键修改说明
- 顶点数组长度修正为
(xSize + 1) * (zSize + 1),确保能容纳所有生成的顶点。 - 新增z轴循环,遍历每一行顶点,生成完整的平面网格三角形数据。
- z循环末尾添加
vert++,跳过每行最后一个顶点,保证下一行的顶点索引计算正确。
内容的提问来源于stack exchange,提问作者Tadeáš Hrudka
相关产品推荐
相关产品推荐

