Oltre all'approccio visuale, che abbiamo esaminato introducendo GameObject e componenti, possiamo operare sui componenti attaccati ai gameObject anche da codice. Vediamo come.
Aggiungere componenti a runtime
Può capitare di voler aggiungere componenti a un gameObject a runtime, piuttosto che collegarli dentro l'editor. Tra i diversi motivi abbiamo che metodi come OnCollisionEnter
vengono sempre eseguiti al lancio del gioco, anche se il componente è disabilitato (togliendo la spunta alla casellina apposita). Per evitare che certi metodi vengano prima del tempo, l'unico modo è rimuovere o aggiungere il componente a runtime solo nel momento in cui diventa davvero necessario.
Per aggiungere un componente, basta utilizzare il metodo AddComponent. Questa funzione è un "template": possiamo chiamarla in congiunzione col tipo del componente per fare in modo che ci restituisca un riferimento al componente appena creato, su cui operare subito o di cui possiamo salvare un riferimento.
Ad esempio, aggiungiamo un Rigidbody ad un cubo di nome cube1
:
Rigidbody newRigidbody = cube1.AddComponent<Rigidbody>();
newRigidbody.drag = 0.1f;
Quando questa riga di codice viene eseguita sarà aggiunto un Rigidbody
al cubo e questo inizierà a cadere secondo la gravità e con un drag di 0.1
, ed eventualmente a collidere con altri oggetti (ammesso che abbia un Collider
attivo!).
Allo stesso modo è possibile usare la funzione AddComponent in maniera generica, così:
Rigidbody newRigidbody = (Rigidbody) cube1.AddComponent(typeof(Rigidbody));
Chiaramente, come si vede nell'esempio, dovremo effettuare un cast per far capire a Unity che tipo di componente stiamo aggiungendo.
Accedere ai componenti di un oggetto
Una volta aggiunti (sia da editor che in programmazione), possiamo avere accesso a qualunque componente di un oggetto mediante la funzione GetComponent. Anche questa può essere tipizzata, in questo modo:
cube1.GetComponent<Collider>();
Rimuovere componenti
Così come è possibile aggiungere componenti, è possibile rimuoverli. Tuttavia, non esiste una funzione dedicata: si usa la funzione Destroy (utile anche per distruggere altri tipi d'oggetti). Due esempi:
Destroy(rigidbody);
//qui recuperiamo al volo un altro componente di tipo Player
Destroy(gameObject.GetComponent<Player>());
Abilitare e disabilitare componenti
Continuando il parallelo con l'editor, come possiamo abilitare e disabilitare componenti spuntando la casellina vicino al loro nome, così si può farlo in programmazione, semplicemente cambiando la proprietà enabled
del componente (e i componenti possono anche disabilitarsi da soli):
rigidbody.enabled = false;
collider.enabled = true;
gameObject.GetComponent<Player>().enabled = false;
Nota: l'aggiunta di un componente fa scattare le funzioni Start
ed Awake
di quel componente, a meno che questo non venga disabilitato subito dopo la sua aggiunta, così:
OtherComponent n = gameObject.AddComponent<OtherComponent>();
n.enabled = false;