- Home /
I can't get my list to loop and keep "spawning" prefabs
Hello I had a question earlier and a user named "RudyTheDev" was a great help starting me out. The script below I got from his answer and I modified it to position my prefabs that were already instantiated at run and act like they were spawning then scrolling across the screen.
I have been trying to get it to loop the positioning process so I could essentially make an endless runner, but once the "list" fills with "activatedobjects" I can't get it to restart the process. The second script below is how I though I was emptying the list and renewing the process but it doesn't work. If I could get some help or hints on how to restart the loop it would be much appreciated.
This is the modified script:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class EnableRandomChildren : MonoBehaviour
{
public float spawnTime = 0.1f;
public GameObject[] spawnPoints = new GameObject[7];
// Keep a timer since the last time we "spawned" a child
private float timeSinceLastSpawn;
private int i;
void Start()
{
for(int i = 0; i < spawnPoints.Length; i++)
{
spawnPoints = GameObject.FindGameObjectsWithTag("Spawners");
}
}
void Update()
{
// Tick down time until next spawn
timeSinceLastSpawn += Time.deltaTime;
// If the 2sec have passed for spawning
if (timeSinceLastSpawn >= spawnTime)
{
// Schedule the next spawn in 2 sec
timeSinceLastSpawn -= spawnTime;
// Make a list of all children that are not yet enabled
List<GameObject> availableObjects = new List<GameObject>();
foreach (Transform child in transform)
{
if (!child.gameObject.activeSelf)
{
availableObjects.Add(child.gameObject);
}
}
// If we found some
if (availableObjects.Count > 0)
{
// Choose a random child from the list
GameObject childToEnable = availableObjects[Random.Range(0, availableObjects.Count)];
// Enable the child
childToEnable.SetActive(true);
// .. and do other things to this child
childToEnable.transform.position = spawnPoints[Random.Range(0, spawnPoints.Length)].transform.position;
}
}
}
}
And this is the script I am using to try and renew the process or reset the list in the first script which is on each of the prefabs that are activated in the script above:
using UnityEngine;
using System.Collections;
public class MoveObjectsInPool : MonoBehaviour {
public float moveSpeed = 35.0f;
public float prefabLife = 5.0f;
private float timeToReturn = 0.0f;
void Start()
{
timeToReturn = Time.time + prefabLife;
}
// Use this for initialization
void FixedUpdate ()
{
float move = moveSpeed * Time.deltaTime;
transform.Translate(-move, 0 , 0);
CountDown();
}
void Deactivate()
{
this.transform.parent = GameObject.Find("ObjectPool").transform;
gameObject.SetActive(false);
}
void CountDown()
{
if(timeToReturn < Time.time)
{
Deactivate();
}
}
}
Answer by RudyTheDev · Feb 25, 2014 at 09:58 AM
This happens because you never reset timeToReturn
. Start()
only happens once, not when you enable/disable objects. So replace your Start
with OnEnable
, so it happens every time you enable it.
Also, a few notes:
for(int i = 0; i < spawnPoints.Length; i++)
{
spawnPoints = GameObject.FindGameObjectsWithTag("Spawners");
}
should be just
spawnPoints = GameObject.FindGameObjectsWithTag("Spawners");
because GameObject.FindGameObjectsWithTag()
already returns an array. And you don't need to pre-make it with = new GameObject[7];
either. Not sure what that 7
is for, but it won't affect anything.
And private int i;
is not needed; int i
in the for loop is what defines a local variable.
Your answer
Follow this Question
Related Questions
A node in a childnode? 1 Answer
What's the best way to find the smallest Vector3.Distance of an array of enemies? 2 Answers
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers