- Home /
Adding Delay to a for loop in C#
I'm creating a spawn system for my game. Problem is that everything spawns at once. I need them to stagger. I've tried using Thread.Sleep (which gives me errors) and a few other methods which have all failed. Here is my code:
using UnityEngine;
using System.Collections;
public class SpawnPieces : MonoBehaviour {
//Sets up prefab
public GameObject PiecePrefab;
public GameObject Spawn;
public int fSpawnDelay;
public string GameTag;
// number of rows and columns
// use rows to count pieces
public int rows = 8;
public int columns = 5;
// count each row by GameTag
private int piececountR1 = GameObject.FindGameObjectsWithTag("game_piece_r1").Length;
private int piececountR2 = GameObject.FindGameObjectsWithTag("game_piece_r2").Length;
private int piececountR3 = GameObject.FindGameObjectsWithTag("game_piece_r3").Length;
private int piececountR4 = GameObject.FindGameObjectsWithTag("game_piece_r4").Length;
private int piececountR5 = GameObject.FindGameObjectsWithTag("game_piece_r5").Length;
void SpawnStart() {
Instantiate(PiecePrefab, Spawn.transform.position, Quaternion.identity);
}
/*
string SpawnStart(int EmptySpaces) {
for(int i=0; i<rows; i++) {
//Spawn Pieces
Instantiate(PiecePrefab, Spawn.transform.position, Quaternion.identity);
}
return "Spawn";
}*/
// Use this for initialization
void Start () {
for(int i=0; i<rows; i++) {
Invoke("SpawnStart", fSpawnDelay);
}
}
// Update is called once per frame
void Update () {
}
}
Right now, that pauses however many seconds I've setup and then dumps everything all at once. How do I make it spawn 1 enemy, then pause, then another enemy, then pause, so I don't start the game with a horde?
Answer by robertbu · Jan 06, 2014 at 08:42 PM
Try this:
void Start () {
InvokeRepeating("SpawnStart", 0.0f, fSpawnDelay);
}
I'd make fSpawnDelay a float rather than an int.
Well it slows it down, but now it won't stop when it hits the top piececount (contained in "rows"). I tried it in a if statement
if (piececountR1 < rows) {
InvokeRepeating("SpawnStart", 0.0f, fSpawnDelay);
}
But it doesn't work.
You can do it this way for a fixed number:
IEnumerator Start() {
for(int i=0; i<rows; i++) {
SpawnStart();
yield return new WaitForSeconds(fSpawnDelay);
}
}
You can put the Instantiate() in place of 'SpawnStart()' if the Instantiate() call is all the 'SpawnStart()' function is going to do.
While this is cleaner, using the original code you could have used CancelInvoke() when the number of items reached the limit.
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
How to assign transfrom array in the code? 1 Answer
Distribute terrain in zones 3 Answers