使用二维数组和文本文件创建一个统一的平铺地图

本文关键字:一个 地图 二维数组 文本 文件创建 | 更新日期: 2023-09-27 18:25:12

我正在尝试读取一个文本磁贴,并在游戏运行时使用它来显示地图。当它读取一个大于0的数字时,我遇到了问题(我想)。

将显示第一列中的对象,但不会显示其他对象。我再次认为这是因为它是瓷砖[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++;
    }
}

如有任何帮助,我们将不胜感激。谢谢。

使用二维数组和文本文件创建一个统一的平铺地图

问题似乎在于每个瓦片的迭代。像这样迭代数组可能会解决问题。

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++;
}

我建议查看此帖子以获得一些指导:
从阵列生成平铺映射

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

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++; }
                    }
    }
}