- Home /
Duplicate Question
Spawning one by one problem?
How can i get this to spawn one object then after a surtan amount of time spawn another object.
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;
public int maxNumberOfObjects = 40; //Or whatever
public float spawnDelay = 10f; //Delay between new ones
private float lastTime = 0;
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();
}
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;
}
}
You already accepted an answer to this here: http://answers.unity3d.com/questions/270511/how-can-i-spawn-one-by-one.html
And you didn't even heed the suggestion of that answer to create a Coroutine.
Also, this must be the 9th or 10th time you dump that script into a new question, which usually overlaps >50% with one of your other questions.
If you really feel the need to reopen yet another question, at least refer to your other questions, explain why this instance of your question is different, what in the code has changed, why you accepted the answer of your other question(s), although it obviously did not answer your question, and what exactly you want answered.
Answer by Berenger · Jun 21, 2012 at 02:41 PM
That's close enough. First, there is a spawn cycle, you should use a coroutine or Invoke( "Spawn", cycle).
Your queue already contains instances of those entities, so the spawning should just be dequeueing one instance and making it active. Here, you look up the end, add a new one, then empty the queue every frames with Peek. That's odd.
Not sure what you're trying to do, but I would do it like that :
using UnityEngine; using System.Collections.Generic;
public class Platform$$anonymous$$anager : $$anonymous$$onoBehaviour { public Transform prefab; public int numberOfObjects; private Queue objectQueue;
public int maxNumberOfObjects = 40; //Or whatever
public float spawnDelay = 10f; //Delay between new ones
IEnumerator Start ()
{
objectQueue = new Queue<Transform>(numberOfObjects);
for(int i = 0; i < numberOfObjects; i++)
objectQueue.Enqueue((Transform)Instantiate(prefab));
while( Application.isPlaying )
{
yield return new WaitForSeconds( spawnDelay );
// Don't know what is supposed to happen to the spawned object.
Spawn();
}
}
// public, in case you want to spawn from outside at a specific moment
public Transform Spawn
{
if( numberOfObjects < maxNumberOfObjects )
{
Transform newOne;
newOne = objectQueue.Dequeue(); // Take it off the queue
newOne.gameObject.SetActiveRecursively(true); // Activate it
numberOfObjects++;
return newOne;
}
return null;
}
private void Recycle ( Transform o )
{
// ...
o.gameObject.SetActiveRecursively(false); //Deactivate it
objectQueue.Enqueue(o); // Re queue it
numberOfObjects = $$anonymous$$athf.$$anonymous$$ax( 0, numberOfObjects-1 );
}
}
Can you put the code you just gave me into my code i have posted at the top. and give me the final code with yours in it.
I removed the stuff I didn't understand. I don't know how it's supposed to work with the rest of your project, what it's exactly supposed to do. You should try to understand my code and see how to improve yours.
It is a platform spawner that is suppose to spawn and recycle and right now there is a gap in the spawning objects it spawns them all at ones i would like it to spawn one by one and over time.
Follow this Question
Related Questions
A node in a childnode? 1 Answer
How to make no spawning gap? 1 Answer
How do i make a spawing level? 1 Answer
Generate obstacles within boundry 1 Answer