- Home /
How do i spawn object after it has been destroyed?
Hello i have this script that works great but it does not re-spawn when the object it is spawning is destroyed. I would like it if 2 objects are destroyed to spawn another 2 right away so we always have the same amount of objects in the scene. here is the code so far.
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();
}
}
void Update () {
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;
}
}
}
make the game object you want to re-spawn as prefab then you will be able to re-spawn the object after it is destroyed the prefab you want to re-spawn should be in project
you need to be running a check looking for your gameobjects to see if you have 2 in game if not respawn.
Answer by Wolfram · Jun 15, 2012 at 11:37 PM
Create/edit a script that you attach to the projectile prefab, and add a function OnDestroy(). In it, you can put any code that gets executed as soon as the projectile is destroyed. For example, you could decrease a counter in your PlatformManager (and then react to that in PlatformManager's Update(), or immediately spawn a new Projectile, etc...
Hang on, he's got the objects in a Queue there and it will be nulling it (which is throwing an error right now)- I think the best place to re instantiate is in the loop where it peeks at the queue position... If it is null then create a new one....
void Update () {
if(objectQueue.Peek() == null)
{
objectQueue.Dequeue();
objectQueue.Enqueue((Transform)Instantiate(prefab));
nextPosition = transform.localPosition;
}
if(objectQueue.Peek().localPosition.x + recycleOffset < Runner.distanceTraveled){
Recycle();
}
}
It replaces the Update function in the code you posted.
Answer by whydoidoit · Jun 16, 2012 at 12:08 AM
If you don't mind them turning up later on - when it's time to fit one in to the right slot then this would do it:
void Update () {
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();
if(!o.gameObject.active)
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;
}
}
Your answer
Follow this Question
Related Questions
A node in a childnode? 1 Answer
Spawn Script not working on iPhone? 0 Answers
How can i spawn one by one? 2 Answers
How can i get this to spawn all the time? 1 Answer
how can i get rid of this transform.localPosition;? 1 Answer