使用二维数组和文本文件创建一个统一的平铺地图
本文关键字:一个 地图 二维数组 文本 文件创建 | 更新日期: 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++; }
}
}
}