- Home /
erros and bugs
I'm trying to make 2d roguelike game but somehow the image looks scary. here are the error's that I received from the console.
/Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:633) BoardManager.RandomPosition () (at Assets/Script/BoardManager.cs:69) BoardManager.LayoutObjectAtRandom (UnityEngine.GameObject[] tileArray, Int32 minimum, Int32 maximum) (at Assets/Script/BoardManager.cs:79) BoardManager.SetupScene (Int32 level) (at Assets/Script/BoardManager.cs:90) GameManager.InitGame () (at Assets/Script/GameManager.cs:30) GameManager.Awake () (at Assets/Script/GameManager.cs:25)
all of my sprites are 254x254.
using UnityEngine;
using System;
using System.Collections.Generic;
using Random = UnityEngine.Random;
public class BoardManager : MonoBehaviour
{
[Serializable]
public class Count
{
public int minimum;
public int maximum;
public Count (int min, int max)
{
minimum = min;
maximum = max;
}
}
public int columns = 8;
public int rows = 8;
public Count wallCount = new Count (5,9);
public Count foodCount = new Count (1,5);
public GameObject exit;
public GameObject[] floorTiles;
public GameObject[] wallTiles;
public GameObject[] foodTiles;
public GameObject[] enemyTiles;
public GameObject[] outerWallTiles;
private Transform boardHolder;
private List <Vector3> gridPositions = new List<Vector3>();
void InitialiseList()
{
gridPositions.Clear ();
for (int x =1; x < columns - 1; x++)
{
for (int y = 1; y < rows - 1;y++)
{
gridPositions.Add(new Vector3(x,y,0f));
}
}
}
void BoardSetup()
{
boardHolder = new GameObject ("Board").transform;
for (int x = -1; x < columns + 1; x++)
{
for (int y = -1; y < rows + 1; y++)
{
GameObject toInstantiate = floorTiles[Random.Range (0, floorTiles.Length)];
if (x == -1 || x == columns || y == -1 || y == rows)
toInstantiate = outerWallTiles[Random.Range (0, outerWallTiles.Length)];
GameObject instance = Instantiate(toInstantiate, new Vector3 (x,y,0f), Quaternion.identity) as GameObject;
instance.transform.SetParent(boardHolder);
}
}
}
Vector3 RandomPosition()
{
int randomIndex = Random.Range(0,gridPositions.Count);
Vector3 randomPosition = gridPositions [randomIndex];
gridPositions.RemoveAt (randomIndex);
return randomPosition;
}
void LayoutObjectAtRandom(GameObject[] tileArray, int minimum, int maximum)
{
int objectCount = Random.Range (minimum, maximum + 1);
for (int i = 0; i < objectCount; i++)
{
Vector3 randomPosition = RandomPosition();
GameObject tileChoice = tileArray[Random.Range (0, tileArray.Length)];
Instantiate (tileChoice, randomPosition, Quaternion.identity);
}
}
public void SetupScene (int level)
{
BoardSetup ();
InitialiseList ();
LayoutObjectAtRandom(wallTiles, wallCount.minimum, wallCount.maximum);
LayoutObjectAtRandom(foodTiles, foodCount.minimum, foodCount.maximum);
int enemyCount = (int)Mathf.Log (level, 2f);
LayoutObjectAtRandom(enemyTiles, enemyCount, enemyCount);
Instantiate (exit, new Vector3 (columns - 1, rows - 1, 0f), Quaternion.identity);
}
}
also I think my code is perfectly fine.
If your code was perfectly fine it wouldn't cause a crash.
Answer by NoseKills · Feb 23, 2015 at 03:18 PM
Doing a Google search for your error's line number and class
System.Collections.Generic/List.cs:633
shows it's an array out of bounds/range exception as you can probably see on your machine from the complete error message that you should've pasted here :).
The stacktrace also shows it's coming from inside your methodVector3 RandomPosition()
from the lineVector3 randomPosition = gridPositions [randomIndex];
.
The only way this line can throw an out of bounds exception (since you are doing int randomIndex = Random.Range(0,gridPositions.Count);
) is if the list doesn't have any items in it ( gridPositions.Count == 0
)
Since this is all the code we can see and we can't see how you are calling this method, we can't really tell what is the root of your problem.
One thing sticks out for me though, You are populating gridPositions
with for loops
for (int x =1; x < columns - 1; x++)
{
for (int y = 1; y < rows - 1;y++)
{
gridPositions.Add(new Vector3(x,y,0f));
This means that with columns
/rows
set to 2
for example, you would be adding zero items to the list.
Also, since gridPositions is depleted each time a position is used, it could be emptied by the process. So you definitely need to check that. Could just change line 77 to
for (int i = 0; i < objectCount && gridPositions.Count > 0; i++)
(although you probably want a warning in that situation too)
Your answer
Follow this Question
Related Questions
Unity C# code not register, other PC can 0 Answers
Why does empty if statement fix null reference 1 Answer
Error "OnTriggerEnter: this message has to be of type: Collider" 0 Answers
Exporting to iOS device breaks game and causes errors 0 Answers
Strange bug after update to 5.6.0f1 (This is not supported) 2 Answers