c# - 无法统一生成网格
问题描述
我一直在尝试使用下面的代码生成网格,并且已经成功生成了宽度和长度为 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;
}
}
解决方案
我想到了。问题是我使用三角形数组的索引来计算顶点数组的索引。相反,我需要使用单独的变量 (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++;
}
}
推荐阅读
- python - 使用python连接多个电子表格并在存在重复项时将数据附加到行中
- excel - 从关闭的工作簿中复制变量范围
- c++ - 整数的按位非运算
- wildfly - Keycloak 15.0.2:入门:WildFly 错误“所需机制 'KEYCLOAK' 在机制 [..] HttpAuthenticationFactory 中不可用
- javascript - 列表中单词出现的计数,不区分大小写
- python - 如何在 Pandas 中将此日期从字符串转换为日期时间?
- c# - 将所有按位标志设置为 false
- arrays - 从 'char *' 初始化 'char' 从指针生成整数而不进行强制转换
- r - r 使用模式更改列名称的列类型
- database - 执行将使集合大小加倍的迁移