首页 > 解决方案 > 无法统一生成网格

问题描述

我一直在尝试使用下面的代码生成网格,并且已经成功生成了宽度和长度为 1 的网格,但是再没有,我在控制台中收到错误消息

“设置三角形失败。一些索引引用超出边界的顶点。IndexCount:24,VertexCount:9 UnityEngine.Mesh:set_triangles(int [])”

我已经在纸上完成了计算三角形的所有数学运算,所有值都在顶点数组的长度范围内,从 0 到 8。我不知道我做错了什么,或者为什么会出现这个错误消息被抛出,所以任何帮助将不胜感激。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshGenerator : MonoBehaviour
{
    Mesh mesh;
    Vector3[] vertices;
    int[] triangles;

    public Mesh GenerateMesh(int mapWidth, int mapHeight)
    {
        mesh = new Mesh();
        vertices = new Vector3[(mapHeight + 1) * (mapWidth + 1)];
        triangles = new int[6 * (mapHeight * mapWidth)];
        int index = 0;
        for (int x = 0; x <= mapHeight; x++)
        {
            for (int y = 0; y <= mapWidth; y++)
            {
                vertices[index] = new Vector3(x, 0, y);
                index += 1;
            }
        }
        int z = 0;
        for (int i = 0; i <= triangles.Length - 1; i += 6)
        {
            Debug.Log(i);
            if (z == mapWidth)
            {
                triangles[i] = i + 1;
                triangles[i + 1] = i + 2;
                triangles[i + 2] = i + mapWidth + 3;
                triangles[i + 3] = i + 1;
                triangles[i + 4] = i + mapWidth + 3;
                triangles[i + 5] = i + mapWidth + 2;
                z = 1;
            }
            else
            {
                triangles[i] = i;
                triangles[i + 1] = i + 1;
                triangles[i + 2] = i + mapWidth + 2;
                triangles[i + 3] = i;
                triangles[i + 4] = i + mapWidth + 2;
                triangles[i + 5] = i + mapWidth + 1;
                z++;
            }
        }
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.RecalculateNormals();
        return mesh;
    }
}

标签: c#unity3d

解决方案


我想到了。问题是我使用三角形数组的索引来计算顶点数组的索引。相反,我需要使用单独的变量 (a) 来计算顶点索引。新代码如下。

        int a = 0;
        for (int i = 0; i < triangles.Length; i += 6)
        {
            Debug.Log(i);
            if (z == mapWidth)
            {
                triangles[i] = a + 1;
                triangles[i + 1] = a + 2;
                triangles[i + 2] = a + mapWidth + 3;
                triangles[i + 3] = a + 1;
                triangles[i + 4] = a + mapWidth + 3;
                triangles[i + 5] = a + mapWidth + 2;
                z = 1;
                a += 2;
            }
            else
            {
                triangles[i] = a;
                triangles[i + 1] = a + 1;
                triangles[i + 2] = a + mapWidth + 2;
                triangles[i + 3] = a;
                triangles[i + 4] = a + mapWidth + 2;
                triangles[i + 5] = a + mapWidth + 1;
                z++;
                a++;
            }
        }

推荐阅读