# How can I make Random Obstacle Spawn randomize between 4 or more prefabs?

Hello I am new to Unity and I’ve been trying to make a vertical endless runner in which I’m trying to randomize obstacles, I have already set up for one prefab, but I’m trying to make it randomly choose between 4 prefabs. Here’s what I have so far.

``````enter code here   public Transform prefab;
public int numberOfObjects;
public float recycleOffset;
public Vector3 startPosition;
public Vector3 minSize, maxSize, minGap, maxGap;
public float minY, maxY;

private Vector3 nextPosition;
private Queue<Transform> objectQueue;

void Start () {
objectQueue = new Queue<Transform>(numberOfObjects);
for(int i = 0; i < numberOfObjects; i++){
objectQueue.Enqueue((Transform)Instantiate(prefab));
}
nextPosition = startPosition;
for(int i = 0; i < numberOfObjects; i++){
Recycle();
}
}

void Update () {
if(objectQueue.Peek().localPosition.y + recycleOffset < Player.distanceTraveled){
Recycle();
}
}

private void Recycle () {
Vector3 scale = new Vector3(
Random.Range(minSize.x, maxSize.x),
Random.Range(minSize.y, maxSize.y),
Random.Range(minSize.z, maxSize.z));

Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;

Transform o = objectQueue.Dequeue();
o.localScale = scale;
o.localPosition = position;
objectQueue.Enqueue(o);

nextPosition += new Vector3(
Random.Range(minGap.x, maxGap.x),
Random.Range(minGap.y, maxGap.y)+ scale.y,
Random.Range(minGap.z, maxGap.z));

if(nextPosition.y < minY){
nextPosition.y = minY + maxGap.y;
}
else if(nextPosition.y > maxY){
nextPosition.y = maxY - maxGap.y;
}
}
}
``````

A simple way that I can think of is

1. Make an array of prefabs
2. Randomise a number between 1-4
3. Use the number to select which prefab to use

I always use this one. It lets you handle how much prefabs you wanna take, choose a random prefab, vary the spawntime and takes gameobjects as spawnpoints.

``````public class mobGenerator : MonoBehaviour {
public enum State {
Idle,
Initialize,
Setup,
SpawnMob
}
public GameObject[] mobPrefabs; //an array to hold all of the prefabs of mobs we want to spawn
public GameObject[] spawnPoints; // this array will hold a reference to akk the spawn points in the scene

public State state; 	//this is our local variable that holds our current state
public int mobsNumber = 1;
public float countSpawnTimer;
public float spawnTimer = 10;
GameObject child;

void Awake () {
state = mobGenerator.State.Initialize;
countSpawnTimer = spawnTimer;

}

// Use this for initialization
IEnumerator Start () {
while (true) {
switch(state) {
case State.Initialize:
Initialize();
break;
case State.Setup:
Setup();
break;
case State.SpawnMob:
SpawnMob();
break;
}

yield return 0;
}

}

void Update() {
countSpawnTimer -= Time.deltaTime;
if (countSpawnTimer <= 0) {
countSpawnTimer = 0;
state = mobGenerator.State.Initialize;
}
}

private void Initialize() {
countSpawnTimer = spawnTimer;
if (!CheckForMobPrefabs ())
return;
if (!CheckForSpawnPoints ())
return;
state = mobGenerator.State.Setup;
}

private void Setup() {
state = mobGenerator.State.SpawnMob;
}
private void SpawnMob() {
GameObject[] gos = AvailableSpawnPoints ();

for (int cnt = 0; cnt < mobsNumber; cnt++) {
GameObject go = Instantiate(mobPrefabs[Random.Range(0, mobPrefabs.Length)],
gos[Random.Range (0, gos.Length)].transform.position,
Quaternion.identity
) as GameObject;
go.transform.parent = gos[cnt].transform;
Destroy(go, spawnTimer);
}
state = mobGenerator.State.Idle;
}

//check to see that we have at least one mob prefab to spawn
private bool CheckForMobPrefabs() {
if (mobPrefabs.Length > 0)
return true;
else
return false;
}

//check to see that we have at least one spawnpoint to spawn mobs
private bool CheckForSpawnPoints() {
if (spawnPoints.Length > 0)
return true;
else
return false;
}

//generate a list of available spawn points that do not have any mobs child to it
private GameObject[] AvailableSpawnPoints() {
List<GameObject> gos = new List<GameObject> ();

for(int cnt = 0; cnt < spawnPoints.Length; cnt++) {
if(spawnPoints[cnt].transform.childCount == 0) {