我正在尝试阅读文本图块并使用它在运行游戏时显示地图。 当它读取大于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++;
}
}
非常感谢任何帮助。谢谢。
答案 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++; }
}
}
}