- 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
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                