> For the complete documentation index, see [llms.txt](https://thebitcave.gitbook.io/guida-a-unity-bolt/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://thebitcave.gitbook.io/guida-a-unity-bolt/lezioni/lezione-2-spostare-un-oggetto.md).

# Lezione 02 - Spostare un Oggetto

Esistono diverse possibilità nel caso si volesse spostare un oggetto in scena: una di queste è quella di traslarlo intervenendo sul suo *Transform* (in particolare, i valori di *position*).

{% hint style="info" %}
Per questa lezione, si consiglia di utilizzare la scena **Lezione 02 - Spostare 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 una freccia:

* Selezioniamo il gameobject Arrow 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à

### L'Evento Update

L'evento che rimane, *Update* permette di eseguire del codice *una volta* per frame: per fare un esempio, se il nostro gioco gira a 100FPS (*Frame per Secondo*), Update verrà eseguito approssimativamente cento volte in un secondo (gli FPS non sono mai costanti).

Il nostro intento è quello di spostare di un breve passo la freccia ad ogni esecuzione.

### L'Attributo Position

La posizione (**position**) di un oggetto è data da tre valori (x, y, z) che indicano, rispettivamente la posizione nello spazio rispetto alle direzioni *destra/sinistra*, *su/giù*, *avanti/indietro*. Per identificare una serie di valori di questo genere, si utilizza l'elemento [Vector3](https://docs.unity3d.com/ScriptReference/Vector3.html).

{% hint style="success" %}
Se volessi spostare verso l'alto un oggetto, dovrei sommare al valore *y* della *position* un numero positivo, ad esempio *(0, 4, 0)* Se invece volessi spostarlo verso il basso, dovrei utilizzare un valore negativo, ad esempio *(0, -6, 0)*.
{% endhint %}

### Muovere l'Oggetto

Per poter muovere la nostra freccia, utilizzeremo l'unità *Translate*, che permette di spostare un oggetto un una determinata direzione (data da un valore *Vector3*).

* Aggiungiamo nel grafo l'unità *Transform.Translate(translation)*
* Colleghiamola con l'uscita di *Update*
* Nel campo *translation*, inseriamo i valori *0, 0, 1*
* Salviamo e premiamo *Play*

Una volta in esecuzione, noterete che la freccia si sposta in avanti in modo estremamente veloce (un metro per frame).

![](/files/-MLsQndRCHgx81kIrn-g)

### Controllare la Velocità

Al momento la velocità della freccia è stata inserita all'interno dei campi. Possiamo però cercare di controllare il tutto inserendo un valore esterno. Ci servono i seguenti elementi:

* [ ] Una direzione dove muoverci
* [ ] L'indipendenza dal framerate
* [ ] Una velocità di movimento

#### Impostare la direzione

La prima cosa che dobbiamo fare è "portare fuori" dall'unità il valore inserito.

* Clicchiamo sulla porta di *translation* e trasciniamo rilasciando in un punto libero del grafo
* Cerchiamo e selezioniamo *Transform.forward (get)*

L'operazione appena effettuata non cambia nulla della nostra scena (provare per credere), ma ci permette di modificare il valore in ingresso

![](/files/-MLsS6YW7_2lLda2DXLO)

#### Indipendenza dal Framerate

Al momento, lo spostamento della freccia è dipendente dai frame per secondo della nostra applicazione: infatti l'oggetto si muove di un metro per frame. Devo cercare di rendere il movimento indipendente dal tempo intercorso tra un frame e l'altro.

* Aggiungiamo una unità *Time.deltaTime (get)*
* Aggiungiamo una unità *Multiply (in Math/Generic)*
* Colleghiamo le unità come in figura
* Lanciamo l'applicazione

![](/files/-MLsT8PY58BWNEROOuAb)

Quello che noteremo è che ora la freccia si muove molto lentamente: questo avviene perché abbiamo moltiplicato la nostra direzione per un numero estremamente basso: questo numero, chiamato *deltaTime*, è il tempo intercorso tra un frame e l'altro.

Abbiamo quindi ottenuto l'indipendenza dal framerate: dobbiamo solamente permettere di gestire la velocità di movimento.

#### Velocità di Movimento

Per aumentare (o diminuire) la velocità con cui l'oggetto viene traslato, è sufficiente moltiplicare il valore per un numero:

* Aggiungiamo un altro nodo *Multiply (in Math/Generic)*
* Aggiungiamo anche un nodo *float Literal* che ci permette di inserire un numero decimale (nel mio caso ho utilizzato 15)
* Colleghiamo i nodi come in figura
* Lanciamo l'applicazione (non dimentichiamoci di salvare!)&#x20;

![](/files/-MLsUg4FHQ3FsQYADRHJ)

Noterete che la freccia ora si sposta ad una determinata velocità: modificando il valore decimale potrete rendere il movimento più veloce o più lento.

### Esercizi Integrativi

Come esercizio addizionale, completare:

* L'**Esercitazione 02 - Muovere e Ruotare un Oggetto**
