- Home /
Question by
Chris12345 · Jun 16, 2012 at 02:29 PM ·
spawning
How can i get this to spawn all the time?
Hello How can i get this to spawn all the time? here is my script?
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)
{
lastTime = Time.time;
objectQueue.Enqueue((Transform)Instantiate(prefab));
}
if(objectQueue.Peek() == null)
{
Transform newOne;
objectQueue.Dequeue();
objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
newOne.gameObject.SetActiveRecursively(false);
nextPosition = transform.localPosition;
}
if(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;
}
}
}
Comment
Best Answer
Answer by whydoidoit · Jun 16, 2012 at 02:35 PM
You've missed out a bit of the code I gave you - it is spawning, but they aren't active:
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();
if(o.gameObject.active==false)
o.gameObject.SetActiveRecursively(true);
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;
}
}
}
here is my full code
using UnityEngine;
using System.Collections.Generic;
public class Platform$$anonymous$$anager : $$anonymous$$onoBehaviour {
public Transform prefab;
public int numberOfObjects;
public float recycleOffset;
public Vector3 $$anonymous$$Size, maxSize, $$anonymous$$Gap, maxGap;
public float $$anonymous$$Y, 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)
{
lastTime = Time.time;
objectQueue.Enqueue((Transform)Instantiate(prefab));
}
if(objectQueue.Peek() == null)
{
Transform newOne;
objectQueue.Dequeue();
objectQueue.Enqueue(newOne = (Transform)Instantiate(prefab));
newOne.gameObject.SetActiveRecursively(false);
nextPosition = transform.localPosition;
}
if(objectQueue.Peek().localPosition.x + recycleOffset < Runner.distanceTraveled){
Recycle();
}
}
private void Recycle () {
Vector3 scale = new Vector3(
Random.Range($$anonymous$$Size.x, maxSize.x),
Random.Range($$anonymous$$Size.y, maxSize.y),
Random.Range($$anonymous$$Size.z, maxSize.z));
Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;
Transform o = objectQueue.Dequeue();
if(o.gameObject.active==false)
o.gameObject.SetActiveRecursively(true);
o.localScale = scale;
o.localPosition = position;
objectQueue.Enqueue(o);
nextPosition += new Vector3(
Random.Range($$anonymous$$Gap.x, maxGap.x) + scale.x,
Random.Range($$anonymous$$Gap.y, maxGap.y),
Random.Range($$anonymous$$Gap.z, maxGap.z));
if(nextPosition.y < $$anonymous$$Y){
nextPosition.y = $$anonymous$$Y + maxGap.y;
}
else if(nextPosition.y > maxY){
nextPosition.y = maxY - maxGap.y;
}
}
}
Your answer
Follow this Question
Related Questions
A node in a childnode? 1 Answer
How do i make a spawing level? 1 Answer
Generate obstacles within boundry 1 Answer
How do i get this to spawn over time? 1 Answer
I am having spawning problems. 2 Answers