我目前正在尝试使用C#在Unity上编写战术角色扮演游戏,为此,我需要使用寻路,Dijkstra,节点边缘等。 我试图在带有边的节点的2D区域中转换代表我的地图的二维char区域,这里是地图:
#
用于标记地图的边框并避开索引超出范围错误。
这是项目的代码:
public Nodes[,] GenerateNodes(TextAsset lvl)
{
Nodes[,] nodeArray;
char[,] matrix = GenerateArray(lvl);
nodeArray = new Nodes[matrix.GetLength(0), matrix.GetLength(1)];
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
char type = matrix[row, col];
if (type != '#' && type != '\n')
{
Debug.LogError(type);
Nodes n = new Nodes(row, col, type);
nodeArray[row, col] = n;
findNeighbors(row, col, matrix, nodeArray); //assuming nodes and matrix variables are instance variables
}
else
nodeArray[row, col] = null;
}
}
return nodeArray;
}
public void findNeighbors(int row, int col, char[,] matrix, Nodes[,] nodeArray)
{
for (int r = -1; r <= 1; r++)
{
for (int c = -1; c <= 1; c++)
{
Debug.LogError(row);
Debug.LogError(col);
if (matrix[row + r, col + c] != '#')
{
nodeArray[row, col].addEdges(nodeArray[row + r, col + c]);
}
}
}
}
GenerateArray()
方法正在运行;我以前用过它。问题来自findNeighbors()
。我有这个错误:
数组超出第0行和第19列的范围
问题是我在这里只有一些#
,它甚至不应该在这里。我试图打印那个char并且它什么都没打印,所以我试着重写一行,压制\n
等等,然后我什么都没得到。
答案 0 :(得分:0)
据我所知,有18列,你试图访问第19列,当然它会抛出这个异常。
你应该在你的发现邻居的第二个上放一个if:
if(row == 0 && r == -1)
continue;
if(col == matrix.GetLength(1) && c == 1)
continue;
也许你可以找到一种更好的方式去做我告诉你的事情,但请记住,如果你不避免访问不存在的数组索引,你将不断收到此错误。
编辑。 根据我们的同伴@yes,我错误地计算了19个cols而不是18个。我提供的解决方案仍然有效:D