- Home /
Spawning random terrain pieces
Hello! I'm trying to set up a random terrain generator. I'm using e2d for the terrain, and what I did was create about 10 pieces using that. I put them all in an array, and I'm using this code to spawn pieces at random from the array.
var spawned = 0;
var start : Transform;
var end : Transform;
var player : GameObject;
var ptimer = 0;
var terrain : Transform[];
var ttype = 0;
function Start () {
ttype = Random.Range(1, terrain.Length);
}
function Update () {
if(player == null){
ptimer ++;
if(ptimer >= 10){
player = GameObject.FindGameObjectWithTag("Player");
}
}
if(player){
var pdis1 = Vector3.Distance(player.transform.position, end.position);
var pdis2 = Vector3.Distance(player.transform.position, start.position);
if(pdis1 <= 4000){
if(spawned == 0){
spawnend();
spawned = 1;
}
}
}
}
function spawnend(){
//yield WaitForSeconds(5.0);
var terrainss = Instantiate(terrain[ttype], Vector3(transform.position.x + terrain[ttype].GetChild(0).collider.bounds.size.x, transform.position.y,7), Quaternion.Euler(0,0,0));
var ts : randomhillspawn = terrainss.GetComponent("randomhillspawn");
ts.spawned = 0;
}
The problem I'm facing is that it'll spawn 5 - 6 different pieces in one location when it shouldn't. What am I doing wrong here?
Well they are being placed on top of each other because of Vector3(transform.position.x + terrain[ttype].GetChild(0).collider.bounds.size.x, ...
sure collider.bounds.size is not the same every time, but they are being instantiated in relatively the same spot.
Answer by Glister · Apr 15, 2013 at 06:24 AM
Try placing spawned = 1;
before the call to the function spawnend. It also looks as though you are resetting spawned to 0 at the end of spawnend and have the call for spawnend in the update function. The update function is called every frame so upwards to 60 times in a second. This can have adverse affects. You should check the time between the last call to spawnend.
declare a variable to store the time value.
var timeLastSpawnEnd = Time.time;
Then change the following code.
if(player){
var pdis1 = Vector3.Distance(player.transform.position, end.position);
var pdis2 = Vector3.Distance(player.transform.position, start.position);
if(pdis1 <= 4000){
if(spawned == 0 && Time.time > timeLastSpawnEnd +1 ){
spawnend();
spawned = 1;
}
}
}
}
function spawnend(){
//yield WaitForSeconds(5.0);
var terrainss = Instantiate(terrain[ttype], Vector3(transform.position.x + terrain[ttype].GetChild(0).collider.bounds.size.x, transform.position.y,7), Quaternion.Euler(0,0,0));
timeLastSpawnEnd = Time.time;
var ts : randomhillspawn = terrainss.GetComponent("randomhillspawn");
ts.spawned = 0;
}
This should allow you to make a call to spawnend only once every second.
Your answer
Follow this Question
Related Questions
About ListItems in Unity3D 1 Answer
Load function not working propperly? 1 Answer
Loading from multiple files? 2 Answers
Object deformation on activat 0 Answers
Saving items to a text file 1 Answer