- Home /
Create a random group of asteroids.
What would be a good way to create a random assortment of asteroids in a given bounding area, with no overlaps being allowed? I can't think of any way besides brute force while loops.
Answer by aldenneely15 · May 25, 2011 at 07:40 PM
You can use a for loop and the Instantaniate command to create an asteroid field. ive thought of this idea too XD
Answer by save · May 25, 2011 at 07:43 PM
In our game I recently did this to spawn debris. It shows the bounding box in the editor and is ready to take different types of meshes with a random rotation. Adding different sizes would just be another variable to throw in if you want that.
var junkObjects : GameObject[]; //The different types of objects to spawn
var totalObjects : int = 100; //The amount of objects to spawn
var size = Vector3(10,10,10); //The initial size of the spawn area
var useRandomRotation : boolean = true; //Random rotation at spawn
private var pos;
function Start () {
for(i=0; i<totalObjects; i++) {
var randomX : int = Random.Range(-size.x/2, size.x/2);
var randomY : int = Random.Range(-size.y/2, size.y/2);
var randomZ : int = Random.Range(-size.z/2, size.z/2);
pos = transform.position+Vector3(randomX, randomY, randomZ);
var junkObject = Random.Range(0,junkObjects.length);
if(useRandomRotation==true){
Instantiate(junkObjects[junkObject], pos, Random.rotation);
} else {
Instantiate(junkObjects[junkObject], pos, Quaternion.identity);
}
}
}
function OnDrawGizmosSelected () {
Gizmos.color = Color (1,0,0,.5);
Gizmos.DrawCube (transform.position, Vector3 (size.x,size.y,size.z));
}
http://unity3d.com/support/documentation/ScriptReference/Transform-localScale.html to manipulate the scale of the instantiated gameobject (which needs to be var:ed and referenced to after instantiation) if you want the scaling. Remember that large quantities hogs loadingtimes quite good.
But how would you prevent overlaps? For random junk overlaps probably do not matter, but if you're dispersing a smaller number of larger objects, overlaps are a bit of an eye-sore.
I would keep a list of where every object had spawned and have a bounding sphere to that position, if the random range goes inside the limited area then randomize new numbers / push a random vector direction until free space is found.
I can't think of any other way that is quick enough, I probably would have randomized the positions first tho into an array (with the range solution) and then instantiate towards that whole array. Still this script gets you going pretty good in the right direction hopefully.
Your answer
Follow this Question
Related Questions
Networking: Object is instantiated twice instead of once 1 Answer
Spawn Point Problems 1 Answer
Code based 3d multiple cube instantiation 1 Answer
Instantiate over time? 1 Answer
Simple Instantiate/Spawning Example 3 Answers