0

I tried asking this in Game Development put it got put on hold so I'm asking it here. I'm trying to update the value of a float variable in one script from another script but I keep getting the following error

NullReferenceException: Object reference not set to an instance of an object GameController+<asteroidWaves>c__Iterator2.MoveNext () (at Assets/Scripts/GameController.cs:51)

Why am I getting this error and what do I need to do to fix it?

 public class GameController:MonoBehaviour{
     public GameObject hazard;
     public Vector3 hazard_values;
     public int min_asteroids;
     public int max_asteroids;
     private int hazard_count;
     public float spawn_wait;
     public float start_wait;
     public float wave_wait;
     private int wave_count = 0;
     public Text score_text;
     private int score;
     public Text restart;
     public Text game_over_text;
     private bool game_over;
     private bool new_game;
     private float new_speed = 1f;

     void Start(){
         game_over = false;
         new_game = false;
         restart.text = "";
         game_over_text.text = "";
         score = 0;
         updateScore();
         StartCoroutine(asteroidWaves());
     }

     void Update(){
         if(new_game){
             if(Input.GetKeyDown(KeyCode.Return)){
                 Application.LoadLevel(Application.loadedLevel);
             }
         }
     }

     IEnumerator asteroidWaves(){
         yield return new WaitForSeconds(start_wait);
         while(true){
             wave_count += 1;
             AsteroidMover asteroid = GetComponent<AsteroidMover>();
             if(asteroid != null){
                 if(wave_count > 1){
                     min_asteroids *= wave_count;
                     max_asteroids += min_asteroids;
                     asteroid.increaseSpeed(new_speed);
                 }
             }
             if(asteroid == null){
                 Debug.Log ("Meh");
             }

             hazard_count = Random.Range(min_asteroids, max_asteroids);
             for(int i = 0; i < hazard_count; i++){
                 Vector3 hazard_position = new Vector3(Random.Range(-hazard_values.x, hazard_values.x), hazard_values.y, hazard_values.z);
                 Quaternion hazard_rotation = Quaternion.identity;
                 Instantiate(hazard, hazard_position, hazard_rotation);
                 yield return new WaitForSeconds(spawn_wait);
             }
             yield return new WaitForSeconds(wave_wait);
             if(game_over){
                 restart.text = "Press 'Enter' to start a new game.";
                 new_game = true;
                 break;
             }
         }
     }

     public void addScore(int new_score){
         score += new_score;
         updateScore();
     }

     void updateScore(){
         score_text.text = "SCORE: " +score;
     }

     public void gameOver(){
         game_over_text.text = "Game Over";
         game_over = true;
     }
 }

         public class AsteroidMover:MonoBehaviour{
             private Rigidbody asteroid;
             public float speed;

             void Start(){
                 asteroid = GetComponent<Rigidbody>();
                 asteroid.velocity = transform.forward * speed;
             }

             public void increaseSpeed(float new_speed){
                 speed += (new_speed + 0.5f);
                 Debug.Log (speed);
             }
         }

1 Answers1

1

Change these two lines of code:

StartCoroutine(asteroidWaves());
asteroid = GetComponent<AsteroidMover> ();

to

asteroid = GetComponent<AsteroidMover> ();
StartCoroutine(asteroidWaves());
Dovydas Šopa
  • 2,242
  • 8
  • 24
  • 31