Unity C# 中的二维数组 IndexOutOfRange 问题

2D Array IndexOutOfRange Issue in Unity C#

我有 35 个 Tile 对象,我试图将它们放入二维数组(和列表)中,但在填充数组时我不断收到 IndexOutofRange 错误。我使用的代码是:

private Tile[,] AllTiles = new Tile[5,7]; 
private List<Tile> EmptyTiles = new List<Tile>();

// Use this for initialization
void Start () {

    Tile[] AllTilesOneDim = GameObject.FindObjectsOfType<Tile> ();
    foreach (Tile t in AllTilesOneDim) {

        // Fill 2D Array AllTiles
        AllTiles [t.indRow, t.indCol] = t;
        // Fill List with all tiles
        EmptyTiles.Add (t);

    }
}

我应该注意到,每个 Tile 对象都包含一个 intRow 的 0-4 之间的 int 和一个 0-6 之间的 indCol 的 int。

在将图块添加到二维数组之前,尝试添加一些防御代码来检查范围。喜欢:

int rows = AllTiles.GetLength(0);
int cols = AllTiles.GetLength(1);

int indRow = 0;
int indCol = 0;

foreach (Tile t in AllTilesOneDim) {
    indRow = t.indRow;
    indCol = t.indCol;

    if (indRow >= 0 && indRow < rows
        && indCol >= 0 && indCol < cols)
    {
        // Fill 2D Array AllTiles
        AllTiles[indRow, indCol] = t;
    }
}

使用调试器单步执行此路径并查看发现的内容。 indRow 和 indCol 值有时必须超出您指定的范围 5(0 到 4)和 7(0 到 6)。请记住,索引是从零开始的,长度 returns 是项目的总数,因此我们必须减去一个才能找到正确的索引(或者像我在 if 语句中那样使用 "index less than rows or cols")。

GetLength() 方法:

https://msdn.microsoft.com/en-us/library/system.array.getlength.aspx