- Home /
Time Delay isnt working
I added a time delay to happen after it say congratulations and before it moves onto the next level. It doesn't seem to be working. Is there something i did wrong? Thank you!
public class PlayerController : MonoBehaviour
{
public float speed;
public GUIText countText;
public GUIText winText;
private int count;
public int levelNumber;
void Start ()
{
count = 0;
levelNumber = 1;
SetCountText ();
winText.text ="";
StartCoroutine (Timer.Enumerator ());
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "PickUp")
{
other.gameObject.SetActive(false);
count = count + 1;
SetCountText ();
}
}
void SetCountText ()
{
countText.text = "Count: " + count.ToString ();
if (count >= 1)
{
levelNumber = levelNumber + 1;
winText.text = "CONGRAGULATIONS!";
IEnumerator TimerEnumerator()
{
yield return new WaitForSeconds(3);
}
Debug.Log ("Level Number: " + levelNumber);
Application.LoadLevelAsync(Application.loadedLevel + 1);
}
}
}
Answer by Paulo-Henrique025 · Jun 23, 2015 at 05:47 PM
Try to split your logic in more functions, you are doing too many nested operations, that adds complexity and makes it hard to maintain:
void OnTriggeEnter(Collider other)
{
if(other.gameObject.tag == "PickUp")
{
AddCount(1);
}
}
void AddCount(int val)
{
count += val;
countText.text = "Count: " + count.ToString();
if(count >= 1)
{
FinishLevel();
}
}
void FinishLevel()
{
levelNumber = levelNumber + 1;
winText.text = "CONGRAGULATIONS!";
Invoke("LoadNextLevel", 3);
}
void LoadNextLevel()
{
Debug.Log ("Level Number: " + levelNumber);
Application.LoadLevelAsync(Application.loadedLevel + 1);
}
A fine answer. A bit of follow up that addresses the OP's essential mistake:
In C#, you cannot use yield statements outside of coroutines. This is a very good thing, in my opinion. Coroutine logic should be separated from other logic.
Thanks a lot guys! But for some reason now I cant pick up the object anymore.
void Start ()
{
count = 0;
levelNumber = 1;
winText.text = "";
}
void OnTriggeEnter(Collider other)
{
if(other.gameObject.tag == "PickUp")
{
other.gameObject.SetActive(false);
AddCount(1);
}
}
void AddCount(int val)
{
count += val;
countText.text = "Count: " + count.ToString();
if(count >= 1)
{
FinishLevel();
}
}
void FinishLevel()
{
levelNumber = levelNumber + 1;
winText.text = "CONGRAGULATIONS!";
Invoke("LoadNextLevel", 3);
}
void LoadNextLevel()
{
Debug.Log ("Level Number: " + levelNumber);
Application.LoadLevelAsync(Application.loadedLevel + 1);
}
}
Did i do something wrong?
Your answer
Follow this Question
Related Questions
Time Function in Javascript? 1 Answer
Time Delay Animation 1 Answer
Delay before any action 3 Answers
I'd like to move a cube without delay.(C#) 0 Answers
how to slow down speed increase? 2 Answers