Overlapping instantiation issues. Help?

I am making a procedural city generation script, and so far, it is working. The only issue I am having is that my roads tend to overlap. Is there any way I can make my roads detect if an object is about to collide if it proceeds any farther? And instead of nothing being at the end, I want my code to put down a “U-Turn” spot, thus making it look more natural. Is this possible?

Here is my code: (Horizontal roads are temporarily disabled, until I figure out how to fix the vertical overlaps first)

public var Crossroad: GameObject;
public var Road: GameObject;
public var HorizontalRoad: GameObject;
public var DisabledRoad: GameObject;
public var Lamp: GameObject;
var CityLimitX1 = 500;
var CityLimitZ1 = 500;
var CityLimitX2 = -500;
var CityLimitZ2 = -500;
var i = 0;

//var Number = Random.Range(1, 16);
//static var CoordX = 



//}


function Start () {
var CurrentXPos = transform.position.x;
var CurrentZPos = transform.position.z;
var CrossroadNX = transform.position.x + 90;
var TurnNX = transform.position.x + 60;
var RoadNX = transform.position.x + 30;
var Cross3wayNX = transform.position.x + 25;
var CrossroadNZ1 = transform.position.z + 30;
var TurnNZ = transform.position.z + 60;
var RoadNZ = transform.position.z + 20;
var Cross3wayNZ = transform.position.z + 30;
var RandomNum = Random.Range(1, 6);;

	//for (var i: int = 0; i < 10; i++) {
	if (RandomNum == 1) {
		if (CrossroadNX < CityLimitX1) {
			if (CrossroadNZ1 < CityLimitZ1) {
				if (CrossroadNX > CityLimitX2) {
					if (CrossroadNZ1 > CityLimitZ2) {
					Debug.Log("Fired Crossroad");
					Instantiate(Crossroad, new Vector3(CurrentXPos + 60, 0, CurrentZPos),  Quaternion.Euler(Vector3(-90, 90, 0)));
					Instantiate(DisabledRoad, new Vector3(CurrentXPos + 30, 0, CurrentZPos),  Quaternion.Euler(Vector3(-90, 90, 0)));
					Instantiate(HorizontalRoad, new Vector3(CurrentXPos + 60, 0, CurrentZPos + 30),  Quaternion.Euler(Vector3(-90, 0, 0)));
					Instantiate(HorizontalRoad, new Vector3(CurrentXPos + 60, 0, CurrentZPos - 30),  Quaternion.Euler(Vector3(-90, 0, 0)));
					Instantiate(Road, new Vector3(CurrentXPos + 90, 0, CurrentZPos),  Quaternion.Euler(Vector3(-90, 90, 0)));
					Destroy(GetComponent(SecondCityGen));
					GetComponent(SecondCityGen).enabled = false;
					Debug.Log("Failed to exit script");
}
}
}
}
}
//}
if (RandomNum == 2) {
		if (RoadNX < CityLimitX1) {
			if (RoadNZ < CityLimitZ1) {
				if (RoadNX > CityLimitX2) {
					if (RoadNZ > CityLimitZ2) {
					Debug.Log("Fired Road1");
					Instantiate(Road, new Vector3(CurrentXPos + 30, 0, CurrentZPos),  Quaternion.Euler(Vector3(-90, 90, 0)));
					Destroy(GetComponent(SecondCityGen));
					GetComponent(SecondCityGen).enabled = false;
					Debug.Log("Failed to exit script");
}
}
}
}
}
if (RandomNum == 3) {
		if (RoadNX < CityLimitX1) {
			if (RoadNZ < CityLimitZ1) {
				if (RoadNX > CityLimitX2) {
					if (RoadNZ > CityLimitZ2) {
					Debug.Log("Fired RoadLamp");
					Instantiate(Road, new Vector3(CurrentXPos + 30, 0, CurrentZPos),  Quaternion.Euler(Vector3(-90, 90, 0)));
					Instantiate(Lamp, new Vector3(CurrentXPos + 30, 0, CurrentZPos + 6),  Quaternion.Euler(Vector3(0, 180, 0)));
					Instantiate(Lamp, new Vector3(CurrentXPos + 30, 0, CurrentZPos - 6),  Quaternion.Euler(Vector3(0, 0, 0)));
					Destroy(GetComponent(SecondCityGen));
					GetComponent(SecondCityGen).enabled = false;
					Debug.Log("Failed to exit script");
}
}
}
}
}
if (RandomNum == 4) {
		if (RoadNX < CityLimitX1) {
			if (RoadNZ < CityLimitZ1) {
				if (RoadNX > CityLimitX2) {
					if (RoadNZ > CityLimitZ2) {
					Debug.Log("Fired Road3");
					Instantiate(Road, new Vector3(CurrentXPos + 30, 0, CurrentZPos),  Quaternion.Euler(Vector3(-90, 90, 0)));
					Destroy(GetComponent(SecondCityGen));
					GetComponent(SecondCityGen).enabled = false;
					Debug.Log("Failed to exit script");
}
}
}
}
}


}
function OnTriggerEnter (other : Collider) {
for (var T: int = 0; T < 50; T++) {
//if (RandomNum == 1) {
        Destroy(gameObject);
        }
}

i would set up prefab road pieces so you would have a strait peice, a cross inersection, a curve, a tee and a cap. and make lines of blocks!!!
anyways if you are relatively grid based you could store and mark 2d positions in an array of an array to decide what pieces to use or where positions might overlapp with this idea:

                var i:int;
	        //directions to check;
				var cross:Vector2[] = new Vector2[4];
				cross [0] = new Vector2 (0, 1);
				cross [1] = new Vector2 (1, 0);
				cross [2] = new Vector2 (0, -1);
				cross [3] = new Vector2 (-1, 0);
                
                 // make a 2D grid of info like this
                class grid{var y:int[]=new int[100];}
		        var roadmap:grid[]=new grid[100];
				i = roadmap.Length;
				while (i>0) {i--;roadmap  *= new grid();}*

// set some info at 2D coodinates like this:

  •  		roadmap [13].y[55] = 1;*
    
  •  		roadmap [13].y[57] = 1;*
    
  •  		roadmap [10].y[80] = 1;*
    
  •  		roadmap [80].y[83] = 1;*
    

var spot :Vector2=Vector2(13,56);//<<–check if this coordinate is touching those above

  •  		i = cross.Length;*
    
  •      	while (i>0) {i--;*
    

var v:Vector2=Vector2(spot.x + cross .x,spot.y + cross .y);
* if (roadmap [v.x].y[v.y] == 1) {*

print (spot+" is touching is touching “+v+” in direction of " + cross );

* }}*