Unity 3D – Get Axis – rigidbody.AddForce

Unity 3D – Get Axis – rigidbody.AddForce

1. Create a Plane (Ground) with:
– Mesh Collider

2. Create over the plane a Sphere with:
– Mesh Collider
– Rigid Body
– PlayerController.JS:

#pragma strict
 
function Start () {
 
}
// Theese variables are public to make the code easy-reusable
// You can setup theese variables from Inspector
var speed : float;

function FixedUpdate () {
     // Get User Input START
     var moveHorizontal : float= Input.GetAxis ("Horizontal");
     var moveVertical : float= Input.GetAxis ("Vertical");
     // Get User Input END

     var movement : Vector3= new Vector3 (moveHorizontal, 0.0f, moveVertical);
     rigidbody.AddForce (movement * speed * Time.deltaTime); // Time.deltaTime Use this function to make your game frame rate independent
}

Inspector> change ‘speed’ to 500 and Play

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D – Get Axis – rigidbody.AddForce

Unity – JS – Strings Operations

Unity – JS – Strings Operations
Unity uses the .Net System.String class for strings. See the Microsoft MSDN documentation for Strings for more details.

#pragma strict
function Start () {
    var s : String = "hello";
    Debug.Log(s);                    // prints hello
    s = String.Format("{0} {1}", s, "world");
    Debug.Log(s);                    // prints hello world
    s = String.Concat("hello","world");
    Debug.Log(s);                    // prints helloworld
    s = s.ToUpper(); 
    Debug.Log(s);                    // prints HELLOWORLD
    s = s.ToLower();
    Debug.Log(s);                    // prints helloworld
    //Debug.Log(s.CharAt(1));        // CharAt not supported, produces compiler error
                                     // instead use array syntax below
    Debug.Log(s[1]);                 // prints e
    
    var c : char = 'x'[0];           // slight odd JS way of specifying a char
                                     // 'x' is a string and [0] means first character
                                     
    Debug.Log(s.IndexOf(c));         // prints -1 (s does not contain an x)
    
    var i : int = 42;
    s = i.ToString();
    Debug.Log(s);                    // prints 42
    s = "-43";
    i = int.Parse(s);
    Debug.Log(i);                    // prints -43
    
    var f : float = 3.14159265358979f;
    s = f.ToString();
    Debug.Log(s);                    // prints 3.141593 (which is an approximation)
    
    s = "-7.14159265358979";
    f = float.Parse(s);
    Debug.Log(f);                    // prints -7.141593 (which is an approximation)
}
By |Unity3D, Video Games Development|Commenti disabilitati su Unity – JS – Strings Operations

Unity – Spaceship Shooting Game – JS – Game Over

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) –

By |Unity3D, Video Games Development|Commenti disabilitati su Unity – Spaceship Shooting Game – JS – Game Over

Unity – Spaceship Shooting Game – JS – Scores

Unity – Spaceship Shooting Game – JS – Scores

You scores will increase when an Asteroid Explode

Create the GUI Text

MAIN TOP MENU> GameObjects> Create Other> GUI Text, rename it ‘Score Text’

NOTICE:
GUI Text> Transform Component
– it does not use ‘Screen Space’ in Pixels 600x900px
– it use the ‘Viewport Space’ =
– lower left corner 0,0
– upper right corner 1,1
– upper left corner 0,1
– middle of the viewport 0.5,0.5

Perfezioniamo la posizione utilizzando un valore in pixel ammesso da:
GUI Text> GUI Text Component
– Pixel Offset 10,-10

Scripts

Hierarchy> Game Controller> GameController.js

#pragma strict

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

// Hierarchy DRAG E DROP un GUI Text in Inspector
var scoreText : GUIText;
// contatore di punteggio, private perchè non vogliamo che sia modificabile da Inspector
private  var score : int;

function Start () {
    // Il punteggio iniziale è zero
    score = 0;
    // poi viene richiamata ogni frame la funzione UpdateScore()
    // che scrive a video il punteggio
    UpdateScore ();
    StartCoroutine (SpawnWaves ());
}

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);
    }
}

function AddScore (newScoreValue : int) {
    // aggiorna score aggiungendo il valore newScoreValue
    // che gli viene inviato da DestroyByContact.js
    // alla riga:  - gameController.AddScore (scoreValue); -
    score += newScoreValue;
    // e scrive a video il punteggio
    UpdateScore ();
}

function UpdateScore () {
    // a scoreText viene assegnato in Inspector un GUI Text
    // ne modifico la proprietà .text scrivendo il punteggio attuale Score: 10
    scoreText.text = "Score: " + score;
}

NOTICE: tag the Game Controller object – GameController

Inspector> Game Controller (Script)> Score Text> DRAG ANd DROP ‘Score Text’ (GUI Text)

Prefab> Asteroid> DestroyByContact.js

#pragma strict

var explosion : GameObject;
var playerExplosion : GameObject;

// Assegnato in Inspector è l'incremento di punteggio per ogni esplosione
var scoreValue : int;
// variabile privata, non visibile in Inspector
private var gameController : GameController;

function Start ()
{
    // inserisco in una variabile l'oggetto con tag GameController
    var gameControllerObject : GameObject = GameObject.FindWithTag ("GameController");
    // se l'oggetto con tag GameController esiste lo inserisco in una variabile
    if (gameControllerObject != null)
    {
        gameController = gameControllerObject.GetComponent (GameController);
    }
    // se l'oggetto con tag GameController non esiste restituisce un messaggio di errore
    if (gameController == null)
    {
        Debug.Log ("Cannot find 'GameController' script");
    }
}

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);
    }
    // se la collisione è presente e viene istanziata l'esplosione
    // dello script taggato GameController richiama la funzione AddScore
    // e gli invia il parametro scoreValue, cioè l'incremento di punteggio per ogni asteroide esploso
    gameController.AddScore (scoreValue);
    
    Destroy(other.gameObject);
    Destroy(gameObject);
}

Inspector> Destroy By Contact (Script)> Score Value 10, every asteroid explosion you win 10+ scores

Riassumendo funziona nel seguente modo:

1. Asteroide è un Prefab, ed include lo script DestroyByContact.js

2. DestroyByContact.js
a) istanzia il VFX dell’esplosione
b) distrugge l’asteroide e l’oggetto chge lo ha urtato
c) invia a GameController.js la variabile ‘scoreValue’ alla funzione AddScore()

3. Game Controller è un oggetto vuoto con associato GameController.js
a) riceve il valore ‘scoreValue’ da DestroyByContact.js
b) ‘scoreValue’ viene ricevuto dalla funzione AddScore() e storato nella variabile ‘newScoreValue’
c) viene sommato il valore a quello esistente
d) la funzione UpdateScore() cambia il valore dell’oggetto GUIText assegnato in Inspector nella variabile ‘scoreText’

By |Unity3D, Video Games Development|Commenti disabilitati su Unity – Spaceship Shooting Game – JS – Scores

Unity – Spaceship Shooting Game – JS – Audio

Unity – Spaceship Shooting Game – JS – Audio

Asteroid Explosion

Project> Assets> Audio> explosio_asteroid.wav DRAG AND DROP over Prefabs> VFX> Explosions> explosion_asteroid

Prefabs> VFX> Explosions> explosion_asteroid> Inspector> Audio Source> check ‘Play on Awake’, the wav it will be played automatically.

When the VFX explosion_asteroid is instanced the Audio Sopurce Component will play xplosio_asteroid.wav automatically.

Player Explosion

The same procedure as above

Weapon Player

Project> Assets> Audio> weapon_player.wav DRAG AND DROP over Hierarchy> Player

Hierarchy> Player> Audio Source> uncheck ‘Play on Awake’

Hierarchy> Player> PlayerController.js

#pragma strict

class Boundary
{
    // Theese variables are public to make the code easy-reusable
    // You can setup theese variables from Inspector
    var xMin : float;
    var xMax : float;
    var zMin : float;
    var zMax : float;
}

var speed : float;
var tilt : float;
var boundary : Boundary;

var shot : GameObject;     // Inspector -> assign Bolt Prefab
var shotSpawn : Transform; // Inspector -> assign Shot Spawn Empty Object
var fireRate : float;      // Inspector -> 0.25 (seconds) = 4 shot per second

private var nextFire : float;

function Update () {
    // Get Input Fire button
    if (Input.GetButton("Fire1") && Time.time > nextFire)
    {
        nextFire = Time.time + fireRate;
        // Return the clone of the GameObject, position, rotation if user click Fire button 
        Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
        audio.Play ();
    }
}

function FixedUpdate () {
     // Get User Input START
     var moveHorizontal : float= Input.GetAxis ("Horizontal");
     var moveVertical : float= Input.GetAxis ("Vertical");
     // Get User Input END

     // Move the GameObject
     var movement : Vector3= new Vector3 (moveHorizontal, 0.0f, moveVertical);
    rigidbody.velocity = movement * speed;

    // Limitate movement inside the screen START
    rigidbody.position = new Vector3 
    (
        Mathf.Clamp (rigidbody.position.x, boundary.xMin, boundary.xMax), 
        0.0f, 
        Mathf.Clamp (rigidbody.position.z, boundary.zMin, boundary.zMax)
    );
    // Limitate movement inside the screen END

    // Tilt movement START
    rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
    // Tilt movement END
}

Notice:

if (Input.GetButton("Fire1")...
...
audio.Play ();
}
...

Audio play… if fire button is pressed!

Background Music

Project> Assets> Audio> music_background.wav DRAG AND DROP over Hierarchy> Game Controller

Hierarchy> Game Controller> Audio Source> check ‘Play on Awake’, check ‘Loop’

Balacing Audio

To setup audio volume open the Audio Source Component> Volume, setup this.

By |Unity3D, Video Games Development|Commenti disabilitati su Unity – Spaceship Shooting Game – JS – Audio