void Update()
    {
        if (model.gameOver)
        {
            view.restartText.gUIText.text = "Press 'R' for Restart";
        }

        //Hazard control
        for (int i = 0; i < model.hazards.Count; i++)
        {
            if (model.hazards[i].GetCollider() != null)
            {
                if (model.hazards[i].GetType() == typeof(Model.EnemySpaceship))
                {
                    Model.EnemySpaceship enemySpaceship = (Model.EnemySpaceship)model.hazards[i];

                    //Player/Enemy Spaceship bolts collision
                    for (int j = 0; j < enemySpaceship.GetCannon().bolts.Count; j++)
                    {
                        if (model.player.spaceship.CollisionDetection(enemySpaceship.GetCannon().bolts[j].collider, NO_OPERATOR))
                        {
                            Transform modelTransform = model.player.spaceship.gameObject.transform;
                            view.playerSpaceship.explosion.Explode(modelTransform.position, modelTransform.rotation);
                            GameOver();
                            break;
                        }

                        //Enemy Spaceship bolts/Boundary collision
                        if (enemySpaceship.GetCannon().bolts[j].CollisionDetection(model.boundary.collider, NOT_OPERATOR))
                            enemySpaceship.GetCannon().DestroyBolt(j);
                    }

                    //Enemy spaceship control
                  /*  if (Time.time > enemySpaceship.nextMove.x)
                    {
                        enemySpaceship.nextMove.x = Time.time + enemySpaceship.moveRate.x;
                        enemySpaceship.targetManeuver = (enemySpaceship.kind == 0 ? UnityEngine.Random.Range(7, 10) : UnityEngine.Random.Range(4, 6)) * -Mathf.Sign(gameObject.transform.position.x);
                        enemySpaceship.moveRate.x = UnityEngine.Random.Range(enemySpaceship.moveRateMin, enemySpaceship.moveRateMax);
                    }
					*//*
                    if (Time.time > enemySpaceship.nextMove.y)
                    {
                        enemySpaceship.nextMove.y = Time.time + enemySpaceship.moveRate.y;
                        enemySpaceship.targetManeuver = (enemySpaceship.kind == 0 ? UnityEngine.Random.Range(5, 8) : UnityEngine.Random.Range(0, 3)) * -Mathf.Sign(gameObject.transform.position.x);
                        enemySpaceship.moveRate.y = UnityEngine.Random.Range(enemySpaceship.moveRateMin, enemySpaceship.moveRateMax);
                    }*/
					/*
                    float newManeuver = Mathf.MoveTowards(enemySpaceship.rigidbody.velocity.x, enemySpaceship.targetManeuver, 7.5f * Time.deltaTime);
                    enemySpaceship.rigidbody.velocity = new Vector3(newManeuver, 0.0f, enemySpaceship.rigidbody.velocity.z);
					*/

                    if (enemySpaceship.rigidbody != null)
                        enemySpaceship.rigidbody.rotation = Quaternion.Euler(0.0f, 0.0f, enemySpaceship.rigidbody.velocity.x * -7f);

                    if (Time.time > enemySpaceship.cannon.nextFire)
                    {
                        enemySpaceship.cannon.nextFire = Time.time + enemySpaceship.cannon.fireRate;
                        enemySpaceship.cannon.Fire();
                        View.EnemySpaceship enemySpaceshipView = (View.EnemySpaceship)view.hazards[i];
                        enemySpaceshipView.NewBolt(enemySpaceship.cannon.bolts[enemySpaceship.cannon.bolts.Count - 1].gameObject.transform);
                    }
                }
                else
                {
                    //Asteroid control
                    Model.Asteroid asteroid = (Model.Asteroid)model.hazards[i];

                    asteroid.eulerAngles.x += Time.deltaTime * asteroid.rotationSpeed.x;
                    asteroid.eulerAngles.y += Time.deltaTime * asteroid.rotationSpeed.y;
                    asteroid.eulerAngles.z += Time.deltaTime * asteroid.rotationSpeed.z;

                    if (asteroid.gameObject != null)
                        asteroid.gameObject.transform.eulerAngles = asteroid.eulerAngles;
                }

                //Flag hazard for deletion by exit of boundary
           
				if (model.hazards[i].CollisionDetection(model.boundary.collider, NOT_OPERATOR))
                {
                    removeHazards.Add(i);
                }

                //Player/Hazard collision
                if (model.player.spaceship.CollisionDetection(model.hazards[i].GetCollider(), NO_OPERATOR))
                {
                    Transform modelTransform = model.player.spaceship.gameObject.transform;
                    view.playerSpaceship.explosion.Explode(modelTransform.position, modelTransform.rotation);

                    modelTransform = model.hazards[i].GetGameObject().transform;
                    if (view.hazards[i].GetType() == typeof(View.EnemySpaceship))
                    {
                        View.EnemySpaceship enemySpaceship = (View.EnemySpaceship)view.hazards[i];
                        enemySpaceship.explosion.Explode(modelTransform.position, modelTransform.rotation);
                    }
                    else if (view.hazards[i].GetType() == typeof(View.Asteroid))
                    {
                        View.Asteroid asteroid = (View.Asteroid)view.hazards[i];
                        asteroid.explosion.Explode(modelTransform.position, modelTransform.rotation);
                    }

                    model.hazards[i].Destroy();
                    removeHazards.Add(i);

                    GameOver();
                    break;
                }

                //Hazards/Player bolts collision 
                for (int j = 0; j < model.player.spaceship.cannon.bolts.Count; j++)
                {
                    model.player.spaceship.cannon.bolts[j].CollisionDetection(model.hazards[i].GetCollider(), NO_OPERATOR);

                    if (model.hazards[i].CollisionDetection(model.player.spaceship.cannon.bolts[j].GetCollider(), NO_OPERATOR))
                    {
                        Transform modelTransform = model.hazards[i].GetGameObject().transform;
                        if (view.hazards[i].GetType() == typeof(View.EnemySpaceship))
                        {
                            View.EnemySpaceship enemySpaceship = (View.EnemySpaceship)view.hazards[i];
                            enemySpaceship.explosion.Explode(modelTransform.position, modelTransform.rotation);
                        }
                        else if (view.hazards[i].GetType() == typeof(View.Asteroid))
                        {
                            View.Asteroid asteroid = (View.Asteroid)view.hazards[i];
                            asteroid.explosion.Explode(modelTransform.position, modelTransform.rotation);
                        }

                        AddScore(model.hazards[i].GetPoints());
                        model.player.spaceship.cannon.DestroyBolt(j);
                    }
                }
            }
        }

        //Player control
        //Destroy bolts that exits the boundary
        for (int j = 0; j < model.player.spaceship.cannon.bolts.Count; j++)
        {
            if (model.player.spaceship.cannon.bolts[j].CollisionDetection(model.boundary.collider, NOT_OPERATOR))
                model.player.spaceship.cannon.DestroyBolt(j);
        }

        if (!model.gameOver)
        {
            //Clamp player within the screen
            model.player.spaceship.rigidbody.position = new Vector3(
                Mathf.Clamp(model.player.spaceship.rigidbody.position.x, model.player.spaceship.boundary.x, model.player.spaceship.boundary.y),
                0.0f,
                Mathf.Clamp(model.player.spaceship.rigidbody.position.z, model.player.spaceship.boundary.z, model.player.spaceship.boundary.w)
            );

            //Roll player spaceship by sideways velocity
          //  model.player.spaceship.rigidbody.rotation = Quaternion.Euler(0.0f, 0.0f, model.player.spaceship.rigidbody.velocity.x * -7f);
        }

        //Subscribe the ShootEvent ones when possible to fire
        if (!view.ShootEventSubscribed() && Time.time > model.player.spaceship.cannon.nextFire)
        {
            view.OnShoot += ShootEvent;
        }

        //UpdateView(model.player.spaceship.gameObject, view.playerSpaceship.gameObject);

        //Destroy hazards flagged for destroy
        foreach (int i in removeHazards)
        {
            model.hazards[i].Destroy();
        }

        //Reset destroy flag list
        removeHazards = new List<int>();
    }