- Home /
How can i spawn one by one?
Hello there how can i get this script to spawn one by one, and not spawn all these objects at as time. also how can i spawn the objects so that they stay in my min and max area? thanks for your help. here is my code.
using UnityEngine;
using System.Collections.Generic;
public class PlatformManager : MonoBehaviour {
public Transform prefab;
public int numberOfObjects;
public float recycleOffset;
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 = transform.localPosition;
for(int i = 0; i < numberOfObjects; i++){
Recycle();
}
}
public int maxNumberOfObjects = 40; //Or whatever
public float spawnDelay = 10f; //Delay between new ones
float lastTime = 0;
void Update () {
if(objectQueue.Count < maxNumberOfObjects && Time.time - lastTime > spawnDelay)
{
Transform newOne;
lastTime = Time.time;
objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
newOne.gameObject.SetActiveRecursively(false);
}
if(objectQueue.Peek() == null)
{
Transform newOne;
objectQueue.Dequeue();
objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
newOne.gameObject.SetActiveRecursively(false);
nextPosition = transform.localPosition;
}
if(objectQueue.Peek().gameObject.active == false || objectQueue.Peek().localPosition.x + recycleOffset < Runner.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) + scale.x,
Random.Range(minGap.y, maxGap.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;
}
}
}
Answer by pudd1nG · Jun 20, 2012 at 01:17 AM
I would split the function into a Coroutine. Something like
public void Start(){
StartCoRoutine("MyFunction",5);
}
IENumerator MyFunction(int spawnCount){
for(i=0;i<spawnCount;i++;){
yield return new WaitForSeconds(waitTimeInt);
Instantiate(etc,etc,etc,etc);
}
}
Havn't put that through an IDE so you'll need to clean it up to fit your purpose. Main points are to use an IENumerator function and call it via a coroutine. A Numerator can sleep it's thread using WaitForSeconds, which you can't do in normal functions.
Answer by Pawn · Jun 20, 2012 at 03:22 AM
Instead of using
if(objectQueue.Count < maxNumberOfObjects && Time.time - lastTime > spawnDelay)
{
Transform newOne;
lastTime = Time.time;
objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
newOne.gameObject.SetActiveRecursively(false);
}
try using
private float nextSpawn = 0.0f;
if(objectQueue.Count < maxNumberOfObjects && Time.time > nextSpawn)
{
nextSpawn = Time.time + spawnDelay;
Transform newOne;
objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
newOne.gameObject.SetActiveRecursively(false);
}
Haven't tested it though
Your answer
![](https://koobas.hobune.stream/wayback/20220613073021im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
A node in a childnode? 1 Answer
Spawn Script not working on iPhone? 0 Answers
How can i get this to spawn all the time? 1 Answer
how can i get rid of this transform.localPosition;? 1 Answer
Spawning one by one problem? 1 Answer