- Home /
 
Yield WaitForSeconds doesn't work, give syntax error
Hi,
I am at a bit of an impasse. I have tried everything, but it would seem my Yield WaitForSeconds is not properly formatted, even though I have followed numerous examples. The MonoDevelop and Unity is telling me that there should not be a ( at the WaitForSeconds line. Could someone please let me know what I am doing wrong? Here is my code (I commented out what I had previously tried with creating a coroutine and then waiting a second but the load level did not get called):
     void OnTriggerEnter(Collider otherObject){
         if(otherObject.tag == "enemy"){
             Enemy enemy = (Enemy) otherObject.gameObject.GetComponent("Enemy");
             Instantiate(ExplosionPrefab, enemy.transform.position, enemy.transform.rotation);
             enemy.SetPositionAndSpeed();
             Destroy(gameObject);
             Player.Score += 100;
             
             if(Player.Score >= 1000){
                 Debug.Log ("In 1000");
                 yield WaitForSeconds(1f);
                 Application.LoadLevel(3);
                 //StartCoroutine(WinScreen ());
             }
         }
     }
     
     IEnumerator WinScreen(){
         yield return new WaitForSeconds(1);
         Application.LoadLevel(3);
         Debug.Log ("In coroutine");
     }
 
              Answer by EliteMossy · Apr 05, 2013 at 02:44 AM
You can't use a yield outside of a IEnumerator.
So what you had originally with the StartCoroutine was correct, the reason it did not run, is you destroyed the gameObject. So nothing below that would work.
Here is a fixed way of doing it.
 void OnTriggerEnter(Collider otherObject){
        if(otherObject.tag == "enemy"){
          Enemy enemy = (Enemy) otherObject.gameObject.GetComponent("Enemy");
          Instantiate(ExplosionPrefab, enemy.transform.position, enemy.transform.rotation);
          enemy.SetPositionAndSpeed();
          Player.Score += 100;
  
          if(Player.Score >= 1000){
           Debug.Log ("In 1000");
           StartCoroutine(WinScreen ());
          }
          else {
            Destroy(gameObject);
          }
        }
     }
  
     IEnumerator WinScreen(){
        yield return new WaitForSeconds(1f);
        Application.LoadLevel(3);
        Destroy(gameObject);
        Debug.Log ("In coroutine");
     }
 
              EDIT: Sorry, you were right, just not in this place. I destroy the object when it exits the frame and since in this instance it keeps going it still got destroyed before the coroutine was finished. Thanks a lot!
Are you destroying the gameObject anywhere else?
 IEnumerator WinScreen(){
        Debug.Log ("In coroutine");
        yield return new WaitForSeconds(1f);
        Debug.Log("WaitForSeconds finished, Loading Level");
        Application.LoadLevel(3);
        Destroy(gameObject);
     }
 
                  See if it prints them two lines.
Your answer
 
             Follow this Question
Related Questions
Wait For Seconds to Load level C# 2 Answers
Waypoint / Yield help 1 Answer
Script gets stuck on WaitForSeconds() 1 Answer
Another yield not working problem 2 Answers