Unity 3D Game Engine – JavaScript – Inheritance (Ereditarietà)

Unity 3D Game Engine – JavaScript – Inheritance (Ereditarietà)

L’ereditarietà fra le classi serve per creare una relazione forte tra classi con rapporto padre-figlio.
La classe figlio potrà accedere a tutti i costruttori della classe padre.

Le classi potranno essere:
– padre public -> il figlio e anche tutte le altre classi non imparentate potranno accedere ai costruttori di funzione del padre
– padre private -> i costruttori nel padre postranno esistere ma il figlio non vi potrà accedere
– padre protected -> solo il figlio potrà accedere ai costruttori del padre

Un esempio tratto dal mondo dei videogiochi potrebbe essere:

Humanoid class

– Player class

– Enemies class
— Orc class
— Goblins class

Fruit Class


#pragma strict

public class Fruit (Frutta)
{
    public var color: String;
    
    //This is the first constructor for the Fruit class
    //and is not inherited by any derived classes.
    public function Fruit()
    {
        color = "orange";
        Debug.Log("1st Fruit Constructor Called");
    }
    
    //This is the second constructor for the Fruit class
    //and is not inherited by any derived classes.
    public function Fruit(newColor : String)
    {
        color = newColor;
        Debug.Log("2nd Fruit Constructor Called");
    }
    
    public function Chop()
    {
        Debug.Log("The " + color + " fruit has been chopped.");     
    }
    
    public function SayHello()
    {
        Debug.Log("Hello, I am a fruit.");
    }
}

Apple Class (Mele)


#pragma strict

//This is the derived class whis is
//also know as the Child class.
public class Apple extends Fruit 
{
    
    //This is the first constructor for the Apple class.
    //It calls the parent constructor immediately, even
    //before it runs.
    public function Apple()
    {
        //Notice how Apple has access to the public variable
        //color, which is a part of the parent Fruit class.
        color = "red";
        Debug.Log("1st Apple Constructor Called");
    }
    
    //This is the second constructor for the Apple class.
    //It specifies which parent constructor will be called
    //using the "base" keyword.
    public function Apple(newColor : String)
    {
        super(newColor);
    
        //Notice how this constructor doesn't set the color
        //since the base constructor sets the color that
        //is passed as an argument.
        Debug.Log("2nd Apple Constructor Called");
    }
    
}

FruitSalad Class (Insalata di frutta)


#pragma strict
    
function Start () 
{   
    //Let's illustrate inheritance with the 
    //default constructors.
    Debug.Log("Creating the fruit");
    var myFruit = new Fruit();
    Debug.Log("Creating the apple");
    var myApple = new Apple();
        
    //Call the methods of the Fruit class.
    myFruit.SayHello();
    myFruit.Chop();
        
    //Call the methods of the Apple class.
    //Notice how class Apple has access to all
    //of the public methods of class Fruit.
    myApple.SayHello();
    myApple.Chop();
        
    //Now let's illustrate inheritance with the 
    //constructors that read in a string.
    Debug.Log("Creating the fruit");
    myFruit = new Fruit("yellow");
    Debug.Log("Creating the apple");
    myApple = new Apple("green");
        
    //Call the methods of the Fruit class.
    myFruit.SayHello();
    myFruit.Chop();
        
    //Call the methods of the Apple class.
    //Notice how class Apple has access to all
    //of the public methods of class Fruit.
    myApple.SayHello();
    myApple.Chop();
}

Come funziona?

1. Fruit Class
– creo una classe pubblica perchè devo poter accedere ai dati da altre classi esterne
– creo una funzione pubblica Fruit() con all’interno la variabile ‘color’

2. Apple Class
– creo la classe pubblica Apple() figlia di Fruit()


... Apple extends Fruit  ...

– accede alla variabile pubblica ‘color’ della classe Fruit() e gli assegna il valore ‘red’
– ‘red’ viene inviato come una stringa a ‘newColor’ di public function Fruit(newColor : String)

3. FruitSalad Class (macedonia)
Per fare la macedonia dobbiamo mischiare il frutto ‘orange’ di Fruit() e quello ‘red’ di Apple().
– nella funzione Start() che viene eseguita all’avvio del programma richiamo:

– la classe Fruit(). funzione SayHello()
-> “Hello, I am a fruit.”

– la classe Fruit(). funzione Chop()
-> “The ” + orange + ” fruit has been chopped.”

– la classe Apple(). funzione SayHello() della classe padre
-> “Hello, I am a fruit.”

– la classe Apple(). funzione Chop() della classe padre
-> “The” + yellow + ” fruit has been chopped.”

Un’altro sistema consiste nell’inviare dellew stringhe alle classiu padre-figlio come segue:


    //Now let's illustrate inheritance with the 
    //constructors that read in a string.
    Debug.Log("Creating the fruit");
    myFruit = new Fruit("yellow");
    Debug.Log("Creating the apple");
    myApple = new Apple("green");
        
    //Call the methods of the Fruit class.
    myFruit.SayHello();
    myFruit.Chop();

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D Game Engine – JavaScript – Inheritance (Ereditarietà)

Unity 3D Game Engine – Method Overloading

Unity 3D Game Engine – Method Overloading

Metodo di sovraccarico.
Permette una funzione in grado di trattare definizioni multiple.
NOTA BENE: la natura dei dati passati alla funzione deve coincidere altrimenti verrà restituito un errore.

SomeClass


#pragma strict

public class SomeClass
{
    //The first Add method has a signature of
    //"Add(int, int)". This signature must be unique.
    function Add(num1 : int, num2 : int) : int
    {
        return num1 + num2;
    }
    
    //The second Add method has a sugnature of
    //"Add(string, string)". Again, this must be unique.
    function Add(str1 : String, str2 : String) : String
    {
        return str1 + str2;
    }
}

SomeOtherClass


#pragma strict

function Start () 
{
    var myClass = new SomeClass();
        
    //The specific Add method called will depend on
    //the arguments passed in.
    myClass.Add (1, 2);
    myClass.Add ("Hello ", "World");
}

Come funziona?

1. SomeOtherClass

– la variabile myClass richiama la classe pubblica SomeClass()
– SomeClass().Add richiama la funzione Add (o possiamo dire il metodo Add), spedendo o numeri o variabili

2. SomeClass

– viene richiamata la classe, poi il metodo numerico o stringa a seconda del tipo di variabile che arriva.

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D Game Engine – Method Overloading

Unity 3D Game Engine – JavaScripts – Statics

Unity 3D Game Engine – JavaScripts – Statics

Solitamente se una stessa variabile si trova all’interno di classi diverse, questa assume valori diversi per ogni classe.
Se una variabile è statica invece ha avrà lo stesso valore anche se appartiene a classi differenti.
Cambiare il valore di una variabile statica all’interno di una classe equivale a cambiarne il valore all’interno di tutte le altre classi.

Vediamo un esempio

Enemy


#pragma strict

public class Enemy
{
    //Static variables are shared across all instances
    //of a class.
    public static var enemyCount : int = 0;
    
    function Enemy()
    {
        //Increment the static variable to know how many
        //objects of this class have been created.
        enemyCount++;
    }
}

Game


#pragma strict

public class Game
{
    function Start () 
    {
        var enemy1 = new Enemy();
        var enemy2 = new Enemy();
        var enemy3 = new Enemy();
        
        //You can access a static variable by using the class name
        //and the dot operator.
        var x : int = Enemy.enemyCount;
    }
}

Player


#pragma strict

public class Player extends MonoBehaviour 
{
    //Static variables are shared across all instances
    //of a class. 
    public static var playerCount : int = 0;
    
    function Start()
    {
        //Increment the static variable to know how many
        //objects of this class have been created.
        playerCount++;
    }
}

PlayerManager


#pragma strict

function Start () 
{
    //You can access a static variable by using the class name
    //and the dot operator.
    var x : int = Player.playerCount;
}

Come funziona?

1. Enemy
– definisco una classe pubblica ‘Enemy’ perchè sia accessibile da qualunque script
– definisco una variabile statica ‘enemyCount’
– incremento di +1 ‘enemyCount’

2. Game
– definisco una classe pubblica ‘Game’
– all’inizio del gioco si avvia la funziona Start(), ogni variabile enemy1-2-3 avvia l’incremento del conteggio
– accedo alla variabile statica semplicemente con var x : int = Enemy.enemyCount; -> nomeclasse.nomevariabilestatica

3. Player
Funziona come Enemy definisce la variabile statica playerCount, poi la incrementa playerCount++

4. PlayerManager
– accedo alla variabile statica semplicemente con var x : int = Player.playerCount; -> nomeclasse.nomevariabilestatica

5. Utilities

Altri esempi

Utilities


#pragma strict

public static class Utilities 
{
    //A static method can be invoked without an object
    //of a class. Note that static methods cannot access
    //non-static member variables
    public static function Add(num1 : int, num2 : int) : int
    {
        return num1 + num2;
    }
}

UtilitiesExample


#pragma strict

function Start () 
{
    //You can access a static method by using the class name
    //and the dot operator.
    var x : int = Utilities.Add (5, 6);
}

Come funziona?

1. Utilities
– definisce una funzione statica

2. tilitiesExample
– spedisce i valori 5,6 alla classe pubblica statica Utilities.funzionepubblicastatica -> ritorna la somma 5+6 -> X = 11

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D Game Engine – JavaScripts – Statics

Unity 3D Game Engine – JavaScript – Properties

Unity 3D Game Engine – JavaScript – Properties

Una pratica comune consiste nel poter accedere ad una variabile definita in una classe pubblica esterna.
Per fare questo si può creare una variabile pubblica – public – ed accedervi direttamente, ma c’è un sistema migliore, usare le – Properties –
Incapsulare i dati tramite le Properties fornisce un maggiore controllo sulla struttura del codice.

Vediamo il codice:

Player.js, applicato al Player


#pragma strict

public class Player
{
    //Member variables can be referred to as
    //fields.
    //definisco la variabile
    var experience : int;
    
    //Experience is a basic property
    //Experience è la proprietà di base
    // Chiamo la proprietà con il nome della variabile, con la lettera maiuscola
    public function get Experience() : int
    {
	// altro codice aggiuntivo per fare altre operazioni
        return experience;
    }
    
    public function set Experience(value : int)
    {
	// altro codice aggiuntivo per fare altre operazioni
        experience = value;
    }
    
    //Level is a property that converts experience
    //points into the leve of a player automatically
    public function get Level() : int
    {
        return experience / 1000; // il livello è uguale experience/1000
    }
    
    public function set Level(value : int)
    {
        experience = value * 1000;
    }
    
    //Auto-implemented properties are not a feature of the
    //Javascript language.
}

Game.js, applicato ad un Empty Object


#pragma strict

function Start () 
{
    var myPlayer = new Player();
    
    //Properties can be used just like variables
    myPlayer.Experience = 5;
    var x : int = myPlayer.Experience;
    
    print(x);
}

Come funziona?

Game.js:

1. Al caricamento del gioco si avvia la funziona Start() prima du qualunque altra funzione

2. Uso la classe pubblica Player() come una variabile e la dichiaro – var myPlayer = new Player(); –

3. La Proprietà della classe pubblica Player().Experience ha un valore iniziale di 5, poi varierà il suo valore in base alle operazioni eseguite all’interno di essa

4. Visualizzo – print – in valore della Proprietà .Experience

Player.js

1. Definisco una classe pubblica Player(), pubblica significa che posso accedere ai valori delle sue proprietà da qualsiasi script all’interno del gioco!

Definisco la variabile integer experience, che cambia in base ai bonus raccolti, le ore di gioco etc…, con operazioni che ora non adiamo a definire, ci basti sapere che varia durante il gioco.

2. All’interno della classe Player() c’è la proprietà Experiance() (Notare che per convenzione si utilizza il nome della variabile scritta in minuscolo, e quello della Proprietà con lo stesso nome ma con l’iniziale in Maiuscolo) che restituisce in uscita – return – il valore della variabile experiance:


public function get Experience() : int
    {
        return experience;
    }

3. La proprietà Experiance() setta il valore – value – integer della Proprietà uguale al valore della variabile experience

in:


  public function set Experience(value : int)
    {
        experience = value;
    }

experience = value; -> il valore in uscita della proprietà Experiance (value : int) è uguale alla variabile experiance.
value è una keyword!!!

4. Altre considerazioni:
all’interno delle 2 funzioni che compongono una Proprietà (set + get -> return) si possono applicare delle operazioni matematiche come ad esempio:


 public function get Level() : int
    {
        return experience / 1000;
    }
    
    public function set Level(value : int)
    {
        experience = value * 1000;
    }

se volessi richiamare questi valori da Game.js scriverei:


#pragma strict

function Start () 
{
    var myPlayer = new Player();
    
    //Properties can be used just like variables
    myPlayer.Level = 1;
    var y : int = myPlayer.Level;
    
    print(y);
}

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D Game Engine – JavaScript – Properties

Unity 3D Game Engine – JavaScript – Ternary Operator

Unity 3D Game Engine – JavaScript – Ternary Operator

Ternary Operator è una forma condensata di una dichiarazione – if –

Ad esempio:


#pragma strict

function Start () 
{
    var health : int = 10;
    var message : String;
        
    //This is an example Ternary Operation that chooses a message based
    //on the variable "health".
    // variabile = Booleano ? SE VERO : SE FALSO
    message = health > 0 ? "Player is Alive" : "Player is Dead";
}

Notare:


// variabile = Booleano ? SE VERO : SE FALSO
message = health > 0 ? "Player is Alive" : "Player is Dead";

La variabile ‘message’ sarà = Player is Alive se è VERO che health > 0
La variabile ‘message’ sarà = Player is Dead se è FALSO che health > 0

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D Game Engine – JavaScript – Ternary Operator