使用2D数组和文本文件以统一方式创建平铺地图

时间:2014-10-01 18:20:48

标签: c# arrays unity3d 2d

我正在尝试阅读文本图块并使用它在运行游戏时显示地图。 当它读取大于0的数字时,我遇到了问题(我认为)。

将显示第一列中的对象,但不会显示任何其他对象。我再次认为它是因为它是tile [0]的位置。

这是我得到的错误:

IndexOutOfRangeException:数组索引超出范围。 Map.loadMap()(在Assets / Photon Unity Networking / Scripts / Overworld / Map.cs:49)

这是地图文件

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 6 1 1 1 1 1 1 1 1 1 1 1 4 4 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 4 0
0 1 1 1 1 1 1 3 1 1 1 1 1 2 2 0
0 5 1 1 1 1 3 3 3 2 2 7 2 2 1 0
0 1 1 2 7 2 2 3 2 2 1 1 1 1 5 0
0 1 2 2 4 1 1 1 1 1 1 1 1 1 1 0
0 2 2 4 4 1 1 1 1 1 1 1 1 1 6 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

这是我的地图代码。

int X, Y;
public int mapHeight;
public int mapWidth;

GameObject mapTile;

GameObject [,] mapArray;
public GameObject [] Tiles = new GameObject[8]; //this is an array of the tile objects

/* UNITY FUNCTIONS */
void Awake(){

}

void Start () {
    loadMap ();
}

void Update () {

}


/* DATA MANAGEMENT */
void loadMap(){
    string input = File.ReadAllText( Application.dataPath + 
                                            "/Resources/Maps/map0.txt" );

    mapHeight = 9;
    mapWidth = 15;
    mapArray = new GameObject [mapHeight,mapWidth];

    int i = 0, j = 0;
    foreach (var row in input.Split('\n'))
    {
        foreach (var col in row.Trim().Split(' '))
        {
            mapArray[i, j] = Tiles[int.Parse(col.Trim())]; //Get the GameObject from the Tiles
            mapTile = mapArray[i, j];                      //array and att it to the map array
            GameObject.Instantiate(mapTile, new Vector3(i, j, 0),
                                   Quaternion.Euler(0, 0, 0)); //display it on screen
            j++;
        }
        i++;
    }
}

非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

问题似乎在于每个磁贴的迭代。像这样迭代你的数组可以解决问题。

foreach (var row in Map))
{
    foreach (var col in row)
    {
        mapArray[i, j] = Tiles[int.Parse(col.Trim())]; //Get the GameObject from the Tiles
        mapTile = mapArray[i, j];                      //array and att it to the map array
        GameObject.Instantiate(mapTile, new Vector3(i, j, 0),
                               Quaternion.Euler(0, 0, 0)); //display it on screen
        j++;
    }
    i++;
}

我建议在这篇文章中寻求一些指导:
Generate Tile Map from array

答案 1 :(得分:1)

我已经解决了这个问题。以下是可能需要帮助的人的代码。我还添加了从前两行获取地图宽度和高度的代码。

map txt文件现在看起来像这样。

10 
17
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 6 1 1 1 1 1 1 1 1 1 1 1 4 4 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 3 1 1 1 1 1 2 2 1 0
0 5 1 1 1 1 3 3 3 2 2 7 2 2 1 1 0
0 1 1 2 2 7 2 3 2 2 1 1 1 1 5 1 0
0 1 2 2 4 1 1 1 1 1 1 1 1 1 1 1 0
0 2 2 4 4 1 1 1 1 1 1 1 1 1 6 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

此功能现在看起来像这样。

void loadMap(){

    bool isMap = false;
    string input = File.ReadAllText( Application.dataPath + 
                                        "/Photon Unity Networking" +
                                            "/Resources/Maps/map0.txt" );

    string[] f = input.Split(new string[] {"\n", "\r", "\r\n"}, 
                             System.StringSplitOptions.RemoveEmptyEntries);

    if(f[0].Length > 0 && f[1].Length > 0)
    {
        int.TryParse(f[0], out mapHeight);
        int.TryParse(f[1], out mapWidth);
    }

    if (mapWidth > 0 && mapHeight > 0) {
                    mapArray = new GameObject [mapHeight, mapWidth];
                    int y = 0, x = 0;
                    foreach (var row in input.Split('\n')) {
                            x = 0;
                            foreach (var col in row.Trim().Split(' ')) {
                                    if(int.Parse (col.Trim ()) < 8){
                                        mapArray [y, x] = Tiles [int.Parse (col.Trim ())];  
                                        mapTile = mapArray [y, x];
                                        GameObject.Instantiate (mapTile, new Vector3 (x, mapHeight-y, 0),
                                                                Quaternion.Euler (0, 0, 0));
                                        x++;
                                        isMap = true;
                                    }else{ isMap = false; }
                            }
                            if(isMap == true){ y++; }
                    }
    }
}