Imparare C#Imparare Unity

Dichiarazione e Inizializzazione

Tra qualche lezione vedremo le classi più usate in Unity, i vector2 (punti in una spazio 2D) i vector3 (punti in uno spazio 3D) e molti altri.
Per usarle dovremmo dichiararle ed inizializzarle, come abbiamo fatto per le variabili viste fin’ora.

Prima però dobbiamo fare una precisazione in termini;
Dichiarare e Inizializzare sono cose differenti.

Dichiarare una variabile significa specificare “la sua esistenza”.  Ovvero, dichiariamo che quella variabile esisterà e la utilizzeremo nel nostro script.

int Pippo;


Inizializzare
significa invece assegnargli un valore e può essere fatto solo dopo la sua dichiarazione (oppure contemporaneamente).

pippo=2;

Come detto potremmo fare entrambe le cose contemporaneamente, su un’unica riga:

int pippo=2;

Ma attenzione, perché quando faremo la dichiarazione di una variabile, quella variabile sarà disponibile solo all’interno dello scopo (o contesto) in cui l’abbiamo dichiarata.

Che cos’è lo Scopo?
Semplicemente, lo spazio racchiuso tra le parentesi graffe. Si tratta del contesto in di un certo pezzo di codice delimitato dalle parentesi graffe. Dunque una classe ha il suo scopo, un metodo ha il suo scopo.

Facciamo un esempio dove dichiariamo una variabile nel contesto (scopo) della classe.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NuovoScript : MonoBehaviour { //Apertura scopo della classe

	int pippo; //Dichiariamo una variabile di tipo int
	
	void Start () {//Apetura scopo del metodo Start
	
		pippo = 2; //Inizializiamo la variabile
		
	}//Chiusura scopo del metodo Start
	

	void Update () { //Apetura scopo del metodo Update
	    
	    pippo= 5;//Cambiamo il valore della variabile
		
	}//Chiusura scopo del metodo Update
	
} //Chiusura scopo della classe

In questo esempio abbiamo dichiarato la variabile pippo fuori da ogni metodo, direttamente nello scopo della classe NuovoScript.
In questo modo la variabile sarà accessibile per tutta la calsse e in ogni metodo di essa.
Infatti nell’esempio l’abbiamo richiamata nel metodo Start e poi cambiata dentro il metodo Update senza ricevere nessun errore. La variabile pippo sarà disponibile in ogni punto della classe, che sia in un metodo, in un’iterazione (per esempio un if) o altro.

Se invece avessimo dichiarato la variabile dentro il metodo Start, non avremmo potuto usarla dentro il metodo Update.
Tipo:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NuovoScript : MonoBehaviour { //Apertura scopo della classe


	
	void Start () {//Apetura scopo del metodo Start
	
		int pippo = 2; //Dichiariamo e Inizializiamo la variabile
		
	}//Chiusura scopo del metodo Start
	

	void Update () { //Apetura scopo del metodo Update
	    
	    pippo= 5;//Cambiamo il valore della variabile
		
	}//Chiusura scopo del metodo Update
	
} //Chiusura scopo della classe

Ci sarebbe ritornato un errore che ci informa appunto che la variabile pippo non esiste in quel contesto.

Dunque ricordiamoci di dichiarare le nostre variabili appena aperta la classe, così da poterla usare per l’intero script senza problemi.

La porola chiave new

Non l’abbiamo incontrata, ma lo faremo presto.
Quando dovremmo creare un nuovo oggetto di una determinata classe, dovremmo usare la parola chiave  new. Questo appunto, solo se la variabile è “nuova”, cioè non è stata mai inizializzata nell’ambito della classe.

Prendiamo per esempio la classe proprietaria di Unity Vector3, ovvero una classe che identifica un punto nello spazio ed ha bisogno delle tre coordinate X,Y,Z.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NuovoScript : MonoBehaviour {

	Vector3 posizione; //Dichiariamo una variabile di tipo Vector3
	
	void Start () {
		posizione = new Vector3(10, 10, 10); //Inizializiamo la variabile
	}
	

	void Update () {
		
	}
	
}

Vedremo in seguito come gestire i Vector3, sappiate sin da ora che sono di fondamentale importanza in Unity (e qualsiasi altro engine 3D) perché identificano la posizione di qualunque oggetto nella scena, oltre che alla scala di un oggetto. Dunque sarà necessario anche per muovere i gameObjects.
Potremmo vedere il valore della posizione di ciascun’oggetto anche  all’interno del componente Transform.

Position è appunto un Vector3 composto dalle tre componenti X,Y,Z.

Conclusioni finali sulla dichiarazione e l’inizializzazione

Non abbiamo finito di parlare di quest’argomento. Dovremmo vedere nel dettaglio i modificatori d’accesso come pubblic e private, così come il modificatore static.
Li vedremo con un approfondimento sulle variabili.

9 pensieri su “Dichiarazione e Inizializzazione

  1. Ciao, grazie per il tuo ottimo lavoro, purtroppo mi sono bloccato, non riesco a continuare le lezioni in quanto sullo script mi da il seguente errore: No monoBehaviour scripts in the file, or they names do not matches the file name.
    Non so proprio cosa fare in quanto ho copiato ed incollato il tuo script sul vector3 .
    Sto usando visual studio che mi da la seguente finestra d’errore: Some projects have trouble loading. Please review the output for more details.
    Non so proprio cosa fare

  2. Aggiungo che nell’Ispector, nella sezione Script appare: Missing Monoscript
    The associated script can not be loaded.
    Please fix any comiled errors and assign a validscript

    1. Non so se ho capito bene, forse non l’hai creato dentro unity. Nella finestra project vai sulla cartella assets, tasto dx -> create -> c# script e metti il nome definitivo, se poi provi a cambiare nome darà problemi. Quando aprirai il file .cs, ti andrà direttamente su visual studio.
      Ritorna in Unity, prendi lo script e trascinalo sull’oggetto a cui lo vuoi associare, nella finestra Hierarchy.

  3. Ciao e complimenti per le descrizioni. Io ho effettuato i seguenti passaggi:
    – Ho aggiunto il Componente “Sfera” come nel video;
    – Ho aggiunto un nuovo componente script come nel video;
    – Ho modificato il codice dello script rendendolo identico al testo dell’ultimo codice in questa pagina (quello dove c’è la variabile del tipo Vector3).

    Non ho errori nell’esecuzione ma mi aspettavo di leggere nel componente transform dell’inspector la posizione 10 10 10, esattamente come nell’immagine che hai riportato in questa pagina, e invece mi ritrovo con le coordinate che l’oggetto sfera aveva nel momento della sua creazione ovvero -0,06 -0,21 e -9,62.. Ho come l’impressione che non vengono aggiornate a 10 10 10. Cosa sbaglio?

    1. Ciao Angelo, se ho capito bene non hai assegnato la variabile “posizione” al transform.position.
      Quindi nello script associato alla sfera
      transform.position = posizione;
      e ti ritroverai la sfera in 10,10,10. Ciao

      1. Ciao Angelo.
        Lo script in questione è solo un esempio sull’uso dell’inizializzazione delle variabili, in realtà non viene menzionata la posizione della sfera. Dunque è giusto che a te appaia dove l’hai messa in origine.

        Per far “apparire” la sfera sulle coordinate 10,10,10 dovremmo dire allo script “metti la sfera sulle coordinate della variabile posizione “. Cosa che nello script non c’è. Infatti per come è scritto lo script, la variabile posizione è sono una variabile senza scopo e fine a se stessa.

        Come ti ha suggerito anche fiortrackers (che ringrazio per il supporto), basta aggiungere una riga che imposti la posizione alla sfera uguale a quella della variabile posizione .
        transform.position=posizione;

  4. Ho un problema , in Visual Studio non riesco a dichiarare la variabile Vectror3 , non è proprio presente nell’archivio del programma, che in automatico mi “consiglia” BitVector32 !
    Come lo risolvo?
    Grazie

  5. ciao prima di tutto volevo farti i complimenti, se sto ancora cercando di imparare a programmare e usare unity e’ merito tuo e del sito che hai creato.
    Detto questo volevo farti un paio di domande inerenti a new:
    1- Che cos’e’ “new” ? Da quello che ho capito non e’ nulla di quello che hai spiegato in precedenza (variabile, funzione, etc…)
    2- A cosa serve “new” ? Ho provato piu’ volte a rileggere la spiegazione che hai dato ma non sono riuscito a capire, piu’ che altro non mi torna una cosa, se ho capito bene, vector3 e’ un tipo di variabile tipo int, bool, etc., ma all’interno della funzione start e’ utilizzato come variabile e non come un tipo di variabile.
    Se c’e’ qualcuno che sa una delle risposte va benissimo, non serve per forza che mi risponda WILEz.

    1. Ciao, la parola new sta a significare “nuovo” e si usa quando di crea una nuova istanza di una classe. Non è una variabile o un tipo, ma è una parola chiave del linguaggio.
      In realtà può avere due scopi diversi: è un operatore che richiede una nuova istanza della classe identificata dal suo argomento oppure un modificatore che nasconde esplicitamente un membro. Questi sono concetti avanzati di polimorfismo che non ho trattato a fondo nella guida. In realtà si tratta di una parola che viene usata raramente quando si sviluppa in Unity.

      In pratica, se crei una classe di nome Dog, quando ne vorrai usare una sua istanza, puoi dire che bobby è uguale ad un nuovo oggetto di tipo Dog in questo modo:

      public class Dog
      {
      public void FaiQualcosa() { }
      }

      Poi su un qualsiasi altro script puoi creare una nuova istanza della tua classe:

      Dog bobby = new Dog();

      Scrivendo:
      bobby.FaiQualcosa();
      Chiamerai il metodo FaiQualcosa() della classe Dog.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.