Starting a roguelike, maze generator problem.

Hi all,

I’m working on a level generator and, it works exactly how I want it to but it is so very slow it could take up to 10 seconds to generate the map. Is there anywhere that I can speed this script up?
Thanks for looking!

var myX : int;
var myZ : int;
var i : int;
var maxTiles : int;
var tileSpin : int;
var tilePrefab : Transform;
var lastTile : Transform;
var lookDirection : int;
var locationVector : Vector3;
static var tiles : Array;

function Awake()
{
tiles = new Array();
locationVector=(Vector3.zero);
tilePrefab = Instantiate(tilePrefab,locationVector, Quaternion.identity);
tiles.push(locationVector);
}
function Update()
{    
	if (i == maxTiles){Destroy(gameObject,0);}
	tileSpin = Random.Range (0,4);
	lookDirection = Random.Range(0,5);
	Builder();
}	
function Builder ()
{
	switch (tileSpin) //rotate the cubes at the right angles
	{
		case (1): tileSpin =  90; break;
		case (2): tileSpin = 180; break;
		case (3): tileSpin = 270; break;
	}
	
	switch (lookDirection) // 4 primaries, I used to have all 8 but it generated ugly and got stuck a lot
	{
		case (1): locationVector = Vector3(myX,  0,myZ+1);break;
		case (2): locationVector = Vector3(myX+1,0,myZ)  ;break;
		case (3): locationVector = Vector3(myX,  0,myZ-1);break;
		case (4): locationVector = Vector3(myX-1,0,myZ)  ;break;
	}	
	for (var a = 0; a < tiles.length; a++)  //  I bet it's in this loop here cause of cycling the array everytime
	{
		if (locationVector == tiles[a])		//  but then... how to accomplish the check?
		{
		myX = locationVector.x;
		myZ = locationVector.z;
		return;
		}
	}
	if (i==maxTiles-1)
	{
		lastTile = Instantiate (lastTile,locationVector, Quaternion.identity);
		tiles.push(locationVector);
		i++;
		return;
	}
	
	tilePrefab = Instantiate (tilePrefab,locationVector, Quaternion.Euler(0, tileSpin, 0));
	myX = locationVector.x;
	myZ = locationVector.z;
	tiles.push(locationVector);
	i++;
}

It’s inefficient sure, but I wouldn’t expect it to take 10 seconds to complete.

Try swapping out the tile prefab for a default cube. This should tell you if the problem is the algorithm or the complexity of the assets.

I think your approach to the algorithm can be improved significantly:

  1. Create a 2D array that is going to hold references to tiles in your game world.
  2. Every time you test to see if a tile exists already, look it up in the 2D array INSTEAD of looping over all tiles and comparing position.
  3. When you instantiate a tile add it to the 2D array in the relevant location.

This way you will only ever check 1 value every loop instead of 200.