Increasing forward speed when level completes.
I am trying to set up a feature in a space shooter game that works alot like the game Tetris does. With each level the user completes, the hazards fall at a faster speed. However, when making the function call I get the error
 Assets/Scripts/GameController.cs(22,31): warning CS0649: Field `GameController.asteroid' is never assigned to, and will always have its default value `null'
 
               Why would this error be sent back and how do I correctly increase the hazards' falling speed with each passing level?
 public class AsteroidMover:MonoBehaviour{
     private Rigidbody asteroid;
     public float speed;
     
     void Start(){
         asteroid = GetComponent<Rigidbody>();
         asteroid.velocity = transform.forward * speed;
     }
 
     public void increaseSpeed(){
         speed += 0.5f;
         Debug.Log(speed);
     }
 }
 
               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 AsteroidMover asteroid;
 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){
         asteroid = GetComponent<AsteroidMover>();
         wave_count += 1;
         if(asteroid != null){
             if(wave_count > 1){
                 min_asteroids *= wave_count;
                 max_asteroids += min_asteroids;
                 asteroid.increaseSpeed();
             }
         }
         else{
             Debug.Log ("Asteroid is null");
         }
         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);
     }
 }
 
               }
Answer by RobbyT15 · Jan 16, 2016 at 04:12 PM
I figured out that I was trying to update the speed in the wrong script. Instead of updating the score in the GameController script, I simply needed to check the wave count inside the asteroidMover script and update it there. Here is what my updated script looks like.
 public class AsteroidMover:MonoBehaviour{
     private Rigidbody asteroid;
     public float speed;
     public GameController game_controller;
     public float new_speed;
     
     void Start(){
         asteroid = GetComponent<Rigidbody>();
         asteroid.velocity = transform.forward * speed;
         GameObject game_object = GameObject.FindWithTag("GameController");
         if(game_object != null){
             game_controller = game_object.GetComponent<GameController>();
         }
         if(game_controller == null){
             Debug.Log("Can't find game controller.");
         }
 
         new_speed = game_controller.wave_count;
 
         if(new_speed > 1){
             increaseSpeed(new_speed);
         }
         else{
             Debug.Log(speed);
         }
     }
 
     public void increaseSpeed(float new_speed){
         speed = speed - (new_speed * 0.5f);
         asteroid.velocity = transform.forward * speed;
         Debug.Log(speed);
     }
 }
 
              Answer by Zoelovezle · Dec 22, 2015 at 11:33 PM
Since the both scripts are differently attached as components to Gameobjects you need to get the component in your variable before using it.
 // public class GameController : MonoBehavior
 { 
             //Declared a variable
             private AsteroidMover _asteroid  ;
 
            void Start()
 {
                 // You need to get the component before using that variable
                _asteroid = GetComponent<AsteroidMover>() ;
 }
 
               Check this Things :
Check if you have hazard Prefab in your GameController component : line 18
Since your are instantiating hazard as a GameObject in line 67 ,
.
 var hazardClone = (GameObject)Instantiate(hazard, hazard_position, hazard_rotation) ;
 
               Next possible thing can be your hazard Prefab with no Rigidbody component attached.
Ah ok, and once I do that, I should be able to access the function and update the speed with each wave? What do I need to do when I get the error Object Reference not set to an instance of an object? 
Can you tell me at which line it says? In your new Updated Script? & are you making in 3d or 2d?
I've updated the script in my question. The line it's happening at is 51, the function call to the increaseSpeed function in Asteroid$$anonymous$$over. The asteroid prefab also has a rigidbody attached to it.
Your answer