- Home /
WaitForSeconds Problem [C#]
Hi, im having a problem with the waitforseconds function. I have this script and i want it to spawn a cube at one of the designated points randomly, and it does this however it does it every second and it creates a giant cluster of massed cubes. So i tried to add a waitforseconds yet this also dosent work. I have tried everything and any help will be appretiated. Thanks in advance, Matt
Script:
using UnityEngine;
using System.Collections;
public class moveUp : MonoBehaviour {
public Transform pos1;
public Transform pos2;
public Transform pos3;
public Transform pos4;
public Rigidbody enemy;
void Update(){
int random = Random.Range(1, 7);
switch (random) {
case 1:
StartCoroutine("hi");
Rigidbody thing1 = Instantiate(enemy, pos1.position, pos1.rotation) as Rigidbody;
break;
case 2:
StartCoroutine("hi");
Rigidbody thing2 = Instantiate(enemy, pos2.position, pos2.rotation) as Rigidbody;
break;
case 3:
StartCoroutine("hi");
Rigidbody thing3 = Instantiate(enemy, pos3.position, pos3.rotation) as Rigidbody;
break;
case 4:
StartCoroutine("hi");
Rigidbody thing4 = Instantiate(enemy, pos4.position, pos4.rotation) as Rigidbody;
break;
}
}
IEnumerator hi(){
yield return new WaitForSeconds(3);
}
}
Answer by AFanOfHammers · Mar 07, 2014 at 09:09 PM
Or, you could also do something like this:
private bool hivar = true;
//^^needs to be different to the ienumerator name.
IEnumerator hi(){
if(hivar == true){
hivar = false;
//insert your spawn cube code here//
yield return new WaitForSeconds(3);
hivar = true;
}
Your problem is that the 'start co-routine' is in update, which means it is called every frame. To stop this, insert a boolean called 'hivar,' or something different to your 'enumerator' name. This piece of the program will limit the number of cubes spawned, spawning only 1 every 3 seconds.
Answer by Stormizin · Mar 07, 2014 at 08:36 PM
Hello!
You started a Coroutine and once time started you can't use it again before stop it.
E.G:
case 1:
StartCoroutine("hi");
Rigidbody thing1 = Instantiate(enemy, pos1.position, pos1.rotation) as Rigidbody;
StopAllCoroutines();
break;
Or instead use StopCoroutine("COROUTINE NAME");
More information: StopCoroutine
Try to switch the instantiate from the case to the IEnumerator method, is you switch case working?
also replaceing the case with ienumerator just brought out a load of errors
Answer by Lennon Petrick · Mar 07, 2014 at 09:12 PM
what you have to do has to be in the method that is going to wait, like the following code, but you cannot call a Coroutine in a Update. Try call it in other method.
IEnumerator hi(){
yield return new WaitForSeconds(3);
int random = Random.Range(1, 7);
switch (random) {
case 1:
Rigidbody thing1 = Instantiate(enemy, pos1.position, pos1.rotation) as Rigidbody;
break;
case 2:
Rigidbody thing2 = Instantiate(enemy, pos2.position, pos2.rotation) as Rigidbody;
break;
case 3:
Rigidbody thing3 = Instantiate(enemy, pos3.position, pos3.rotation) as Rigidbody;
break;
case 4:
Rigidbody thing4 = Instantiate(enemy, pos4.position, pos4.rotation) as Rigidbody;
break;
}
}
Answer by DimitriUK · Jul 19, 2015 at 02:20 AM
yield return new WaitForSeconds (Random.Range (10, 30));
Waiting a random time between 10 seconds and 30 seconds.
Your answer
Follow this Question
Related Questions
Distribute terrain in zones 3 Answers
Multiple Cars not working 1 Answer
C# wait X-Seconds in Code before continue in Code? 3 Answers
audio.Play ignoring WaitForSeconds 2 Answers
A node in a childnode? 1 Answer