La classe è una delle strutture fondamentali in C#, un linguaggio di programmazione orientato agli oggetti. Una classe rappresenta un modello per gli oggetti che sono istanze di quel modello. Una classe descrive le proprietà e le metodologie specifiche per un determinato tipo di dati, "incapsulando" le caratteristiche descrittive degli oggetti della classe e i comandi che verranno utilizzati.
La classe quindi è una porzione di codice che descrive il comportamento di determinati oggetti software. Viceversa gli oggetti sono istanze del modello che chiamiamo classe.
Il concetto di classe fu introdotto nel linguaggio di programmazione C++ come evoluzione del linguaggio C, ed è ormai utilizzato dalla maggior parte dei linguaggi di alto livello poiché permette una più efficiente scrittura del codice (è una metodologia veloce in fase di scrittura ed il codice così generato è facilmente leggibile).
Grazie alla sua flessibilità e alla sua capacità di semplificare la scrittura del codice, le classi sono diventate una componente fondamentale della programmazione moderna.
E’ di cardinale importanza comprendere cosa siano le classi, inoltre, dal momento che le richiameremo in continuazione e ne creeremo di nuove ogni qual volta che scriveremo degli script per Unity. Tanto è vero che il linguaggio di programmazione che utilizziamo per compilare gli script, il C# , è un linguaggio orientato ad oggetti ma che potremmo benissimo definire come “un linguaggio orientato alle classi che descrivono oggetti”.
Per comprendere la funzione di una classe, immaginate di voler descrivere una famiglia in C#. Questa descrizione verrà inserita nella classe Famiglia, dove ogni membro della famiglia sarà rappresentato da un oggetto della classe. Variabili come nome, età, sesso, peso, e altezza verranno dichiarate per differenziare gli oggetti l'uno dall'altro, i membri della famiglia. Inoltre, nella classe potrete definire metodi per impartire comandi al microprocessore, come ad esempio stampare l'elenco di tutti i membri della famiglia o la scheda di ogni individuo.
La classe Famiglia potrebbe essere derivata da una classe più generica, come Persone, dalla quale potete richiamare metodi e variabili. A sua volta, una nuova classe Figli potrebbe essere derivata dalla classe Famiglia per descrivere aspetti unici degli oggetti Figli. In un altro script, potrete richiamare un oggetto della classe (ad esempio, un membro della famiglia) utilizzando il punto "." come carattere di accesso.
Bisogna, dopo essersi assicurati di avere i requisiti d’accesso a quella classe (si vedrà più avanti che una classe può bloccare o meno l’accesso dall’esterno della stessa a secondo che si siano dichiarate determinate proprietà), indicare il nome della classe seguito dal punto e poi dal nome dell’oggetto che vogliamo richiamare, in questo modo: nomedellaclasse.oggetto , allo stesso modo si potrebbe richiamare una singola variabile attribuita ad un determinato oggetto, es. famiglia.padre.peso . Così facendo è possibile risparmiare tantissimo tempo a riscrivere porzioni di codice già scritto e come ben si comprende tutto rimane organizzato e diviso nelle classi.
Basti pensare che stesso Unity offre utilissime classi precompilate per tantissimi aspetti del gioco, basterà richiamare nello script le namespace, ovvero le cartelle che contengono determinate classi, utilizzando la parolina using (direttive che vedremo più dettagliatamente in seguito) ciò permette di sfruttare subito un potentissimo motore di gioco senza averne la piena comprensione (il lavoro dietro l’engine è mastodontico) e di andare a richiamare e/o modificare solo quegli oggetti software che ci servono per il nostro gioco.
Quando andremo a creare uno script su Unity, in un file.cs, generalmente si andranno a richiamare i namespace delle classi preesistenti che ci serviranno per quella specifica situazione e si scriverà una e soltanto una nuova classe. Questo è soprattutto vero nella stragrande maggioranza dei casi in cui le nuovi classi sono derivate dalla classe originaria UnityEngine (come la usatissima classe MonoBehaviour) di Unity, in caso di due o più classi su un file si avrebbe un messaggio di errore nella compilazione. Unity, infatti, va a controllare la corrispondenza univoca tra il nome del file dello script ed il nome della classe (se modificate il nome di una classe ricordate sempre di modificare con lo stesso nome anche il nome del file *.cs). In altri ambiti nulla ci vieterebbe in verità di poter scrivere più classi in un singolo file di script. Ma questo non rappresenta un limite di Unity. Oltre ad una questione puramente tecnica, mantenendo gli script bene divisi e organizzati sarà più semplice andarli a ripescare in un secondo momento. O meglio, in caso di lavoro a più mani, chi dovrà interagire con il vostro lavoro sicuramente opererà in maniera più agevole se tutto è ben ordinato e a portata di mano. Ciò vale sia per gli script che per tutti i componenti di Unity: organizzare il lavoro in maniera ordinata Vi consentirà di risparmiare tempo e fatica nei momenti successivi.
Differenza tra gli object di C# e i game object di Unity
A scansi di futuri equivoci dobbiamo già da ora chiarire una cosa fondamentale: anche se il loro nome può creare confusione, gli oggetti in C# non sono la stessa cosa dei game object di Unity.
- Un game object è un elemento creato sulla piattaforma Unity, è un oggetto descritto dalla class GameObject (classe contenuta nel namespace Unity.Engine insieme alla class Transform), che troviamo nella Hiearchy della scena, dotato di coordinate per risultare in un determinato punto nello spazio 3D, a cui si possono attaccare diversi componenti (uno script, un collider, un audio ecc) per diventare: un personaggio, un nemico, un power-up, una piattaforma, un’interfaccia grafica e ogni elemento del nostro videogame ;
- un oggetto (object) di una classe (class) è, invece, una porzione di memoria che rappresenta un’ astrazione di un qualsiasi oggetto del mondo reale definito tramite valori assegnati alle variabili.