You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的原因。

根因分析

你的代码存在两个核心错误:

  1. 非首次调用(first=false)时,你直接用mesh.vertices = new Vector3[] {...}的方式赋值,直接覆盖了首次调用时写入的4个顶点,而非在原有顶点基础上追加。此时整个Mesh的顶点总数只有4个,自然无法支撑4~7的下标索引。
  2. 你仅计划合并三角形数组,没有同步合并顶点、法线、切线、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:54:03