- Home /
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);
}
}
What if you add colliders to the spawned objects and when spawning new one you will check if new collider intersects with existing?
Answer by toddisarockstar · Jul 10, 2017 at 10:21 PM
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 [i] = 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 [i].x,spot.y + cross [i].y);
if (roadmap [v.x].y[v.y] == 1) {
print (spot+" is touching is touching "+v+" in direction of " + cross [i]);
}}
@toddisarockstar I already am using prefabs for my cross intersection, my straight 30m road, and my curve. And yes, I know my code is a bit messy; I am relatively lazy. And I would prefer not to use a grid-like system, because I am trying to make my city both procedural and random, so my game has replay-ability, so would your script work for random generation too?
if you dont want a grid based system the only thing i could think to do is push connection points of the prefabs into a list. then generate additional roads off from those points. After finishing the generation, unused points in the list would be replaced by prefabs with caps. but that would be much more work!!!!
Hm. I'll try it, and if it works, I will mark your answer as accepted. It is working semi-well currently. I'm just having overlap issues. Also, I don't $$anonymous$$d some extra work. :)