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);
}
}