Unity – Spaceship Shooting Game – JS – Game Over

MAIN TOP MENU> GameObject> Create Empty, rename it ‘Display Text’, Inspector> Transform> gear icon> Reset

MAIN TOP MENU> GameObject> Create Other> GUI Text, rename it ‘Restart Text’> Text ‘Restart’

MAIN TOP MENU> GameObject> Create Other> GUI Text, rename it ‘Game Over Text’> Text ‘Game Over’

Hierarchy: Display Text (father)
– Score Text (child)
– Restart Text (child)
– Game Over Text (child)

Game Controller empty object has GameController.js:

#pragma strict

var hazard : GameObject;
var spawnValues : Vector3;
var hazardCount : int;
var spawnWait : float;
var startWait : float;
var waveWait : float;

// GUI Text da assegnare da Inspector
var scoreText : GUIText;
var restartText : GUIText;
var gameOverText : GUIText;

// variabili per il game over, restart, sono booleane VERO O FALSO
private  var gameOver : boolean;
private  var restart : boolean;

private  var score : int;

function Start () {
    // gameover falso all'inizio 
    gameOver = false;
    // restart falso all'inizio
    restart = false;
    // GUIText Restart è vuoto all'inizio
    restartText.text = "";
    // GUI Text Game Over è vuoto all'inizio
    gameOverText.text = "";
    score = 0;
    UpdateScore ();
    StartCoroutine (SpawnWaves ());
}

function Update () {
    // se restart è vero, vedi sopra che è una variabile booleana
    // questo dato è inviato dalla riga - if (gameOver)
    if (restart)
    {
        // resta in ascolto del tasto R da tastiera
        // se viene attivato
        if (Input.GetKeyDown (KeyCode.R))
        {
            // ricarica il livello
            Application.LoadLevel (Application.loadedLevel);
        }
    }
}

function SpawnWaves () {
    yield WaitForSeconds (startWait);
    while (true)
    {
        for ( var i : int= 0; i < hazardCount; i++)
        {
             var spawnPosition : Vector3= new Vector3 (Random.Range (-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
             var spawnRotation : Quaternion= Quaternion.identity;
            Instantiate (hazard, spawnPosition, spawnRotation);
            yield WaitForSeconds (spawnWait);
        }
        yield WaitForSeconds (waveWait);

        // se gameOver è vero, vedi sopra che è una variabile booleana
        if (gameOver)
        {
            // scrivi a video 
            restartText.text = "Press 'R' for Restart";
            // setta restart a vero
            restart = true;
            // interrompi il gioco
            break;
        }
    }
}

function AddScore (newScoreValue : int) {
    score += newScoreValue;
    UpdateScore ();
}

function UpdateScore () {
    scoreText.text = "Score: " + score;
}

// la funzione GameOver() viene richiamata da DestroyByContact.js
function GameOver () {
    // scrivi a video Game Over!
    gameOverText.text = "Game Over!";
    // setta la variabile booleana a vero
    gameOver = true;
}

Inspector, you have to assign:
– Score Text (GUIText)
– Restart Text (GUIText)
– Game over Text (GUIText)

Asteroid prefab has DestroyByContact.js:

#pragma strict

var explosion : GameObject;
var playerExplosion : GameObject;
var scoreValue : int;
private var gameController : GameController;

function Start ()
{
    // Richiama l'oggetto Game Controller e il suo script GameController.js INIZIO
    var gameControllerObject : GameObject = GameObject.FindWithTag ("GameController");
    if (gameControllerObject != null)
    {
        gameController = gameControllerObject.GetComponent (GameController);
    }
    if (gameController == null)
    {
        Debug.Log ("Cannot find 'GameController' script");
    }
    // Richiama l'oggetto Game Controller e il suo script GameController.js FINE
}

function OnTriggerEnter(other : Collider) 
{
    if (other.tag == "Boundary")
    {
        return;
    }
    Instantiate(explosion, transform.position, transform.rotation);
    if (other.tag == "Player")
    {
        Instantiate(playerExplosion, other.transform.position, other.transform.rotation);
        // dopo che è istanziato il VFX per l'esplosione del Player
        // richiama Game Controller oggetto> GameObject.js> funzione Gameover()
        gameController.GameOver ();
    }
    gameController.AddScore (scoreValue);
    Destroy(other.gameObject);
    Destroy(gameObject);
}

In conclusione:

1. Asteroide è un Prefab con associato DestroyByContact.js
a) istanzia l’esplosione del Player
b) richiamala funzione di Gameover() di GameController.js
2. Game Controller è un empty object con associato GameController.js
a) riceve da DestroyByContact.js l’attivazione della funzione Gameover()
b) Gameover() scrive ‘Game Over!’ sul display e setta la variabile booleana gameOver a VERO
c) Se gameOver è VERO scrive a video ‘Press R for Restart’ e setta la variabile booleana restart a VERO, interrompe il ciclo while con break
d) Se restart è VERO resta in attesa che venga premuto ‘R’
e) Se viene premuto R viene ricaricato il livello – Application.LoadLevel (Application.loadedLevel) –