# Lezione 03 - Clonare un Oggetto

Per poter creare un oggetto in scena a partire da un prefab, si può utilizzare il metodo *Instantiate*.&#x20;

{% hint style="info" %}
Per questa lezione, si consiglia di utilizzare la scena **Lezione 03 - Clonare un Oggetto** inclusa [nel progetto di supporto](https://github.com/thebitcave/gitbook-guida-bolt/releases).
{% endhint %}

### Aprire la Scena

Una volta aperta la scena di supporto, sarà possibile visualizzare un oggetto *Spawner*:

* Selezioniamo il gameobject *Spawner* e notiamo che è già presente il componente *Flow Machine*.
* Apriamo il grafo cliccando su *Edit Graph* nell'Inspector
* Eliminiamo il nodo *Start* perché non ci servirà

### Intercettare la Pressione di un Tasto

Durante l'evento *Update* andremo a controllare se il giocatore ha premuto un tasto della tastiera e, in caso positivo, andremo a creare un oggetto.

* Selezioniamo il gameobject *Spawner* ed apriamo il grafo (pulsante *Edit Graph*)
* Clicchiamo in una zona libera del grafo e selzioniamo *Add Unit*
* Cerchiamo l'unità Input.GetKeyDown ed aggiungiamola al grafo
* Dal menu key selezionamo *Space*

![L'unità Input.GetKeyDown](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MNN5qbLYnRca7XrHlNM%2F-MNN9SJobKPvXDkKn7G3%2Funit_getkeydown.png?alt=media\&token=1817cd11-62e0-4b40-8601-10cf62b9a66c)

{% hint style="info" %}
L'unità `Input.GetKeyDown` permette di sapere se in un determinato frame è stato premuto un tasto della tastiera: nel caso questo sia avvenuto, verrà restituito al pin di uscita (di tipo *bool*) il valore *true*, altrimenti *false*.
{% endhint %}

### Controllo del Flusso

Vogliamo generare i nostri oggetti solamente se il tasto è stato premuto: collegare quindi l'unità che abbiamo appena creato con l'evento Update sarebbe un errore. Abbiamo quanti bisogno di un sistema per effettuare questo controllo e lo possiamo fare tramite l'unità *Branch*, che ci permette di eseguire una porzione di codice solamente se una condizione è vera.

* Clicchiamo sul pin di uscita di *Update* e rilasciamo in un punto libero del grafo
* Cerchiamo l'unità *Branch* per aggiungerla

![L'unità Branch](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MNN9ZUcbTMhKKWTBmRx%2F-MNNAaurJvbUOdv5nueT%2Fbranch.png?alt=media\&token=9194eaa0-77db-4ad3-8d21-339ba635de79)

{% hint style="warning" %}
L'unità *Branch* apparirà arancione perché non abbiamo ancora aggiunto la condizione di esecuzione
{% endhint %}

* Colleghiamo il valore si uscita dell'unità *GetKeyDown* (pin circolare) con l'elemento dello stesso colore del *Branch*: abbiamo cioè aggiunto la condizione di esecuzione del codice

![La connessione della condizione](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MNN9ZUcbTMhKKWTBmRx%2F-MNNBNIptxQV0z7_Yz16%2Fbranch_2.png?alt=media\&token=9e859fba-a7a6-4d53-b42d-addba1fe6b69)

### Instanziare un Oggetto

Dobbiamo ora creare il nostro oggetto e questo lo possiamo fare tramite l'unità Instantiate che, partendo da un gameobject (ad esempio, un prefab) ne genera un clone e lo aggiunge in scena

* Dal pin di esecuzione *true* del *Branch*, clicchiamo e trasciniamo, rilasciando in un punto libero della scena
* Cerchiamo l'unità *GameObject.Instantiate(original, position, rotation)*, che ci permette di generare un oggetto dal prefab *original* in una determinata posizione e rotazione
* All'interno del campo origina, trasciniamo il prefab *Arrow* che troviamo in *Lezione 03 - Clonare un Oggetto/Prefabs*

![L'unità Instantiate](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MNNBQv-Z6rvcD0qEWho%2F-MNNCasCPdhqDdehI1dI%2Finstantiate.png?alt=media\&token=2b583236-2820-44e8-a778-4139420e9bbd)

Dobbiamo indicare in che punto e a che rotazione vogliamo che l'oggetto venga istanziato in scena. Nel nostro caso utilizzeremo l'oggetto stesso che contiene il grafo, cioè il gameobject *Spawner*:

* *Aggiungiamo una unità Transforom.position (get)*
* *Aggiungiamo una unità Transforom.rotation(get)*
* Colleghiamo all'unità *Instantiate* i pin corrispondenti

![Il grafo completo](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MNNBQv-Z6rvcD0qEWho%2F-MNNDzvf-2B-tOob8shj%2Fspawner_complete.png?alt=media\&token=4930ff54-ed8d-40f6-8144-387baf19945e)

### Testare il Grafo

Mandando in Play la scena, dovrebbe essere possibile lanciare una freccia ogni volta che si preme il tasto Space

### Esercizi Integrativi

Come esercizi addizionali, completare:

* L'**Esercitazione 03 - Spawner Multipli**
* L'**Esercitazione 04 - Spawner Prefab**
