# Gli Stati

Uno **Stato** rappresenta un tipo di comportamento che il gameobject dovrebbe mantenere ad quando vi entra, fino a che non ne esce. Una serie di stati collegati vengono spesso utilizzati per realizzare una sorta di intelligenza artificiale.

Bolt permette di creare tre tipi di Stati:

* **Flow States**
* **Super States**
* **Any State**

Gli stati sono connessi tra di loro tramite [Transizioni](https://thebitcave.gitbook.io/guida-a-unity-bolt/gli-state-graph/le-transizioni), che regolano il passaggio da uno stato all'altro.

Durante l'esecuzione di uno *State Graph*, uno o più stati dovranno essere definiti come quelli di partenza (*Start State*): uno stato di questo genere viene individuato dal colore verde. Se più stati sono selezionati come quelli di partenza, questi verranno tutti eseguiti in parallelo.

![Uno State Graph con due stati (uno contrassegnato come Start State) ed una transizione.](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MOCZ7VGbKYSZfToUNwV%2F-MOCahtkEfrnpr4OF-hk%2Fstate-graph.png?alt=media\&token=bbfec883-c140-428a-86c2-8204e75212ee)

### I Flow States

Un **Flow State** contiene un [Flow Graph](https://thebitcave.gitbook.io/guida-a-unity-bolt/i-flow-graph-1): questo vuole dire che al suo interno potrete utilizzare le unità nello stesso identico modo.

Per creare un *Flow State*, è sufficiente cliccare con il pulsante  destro in una zona libera del grafo e scegliere *Create Flow State*.

Per modificare il comportamento di un *Flow State*, è sufficiente effettuare un doppio click su di esso.

#### Struttura di un Flow State

All'interno di un *Flow State*, il comportamento è molto simile ad una *Flow Machine*.

![](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MOCbokGLcaNZVHFNr6z%2F-MOCgSI4TokULntguZTw%2Fstate-graph.png?alt=media\&token=de6fe9c9-2cdf-4015-a290-501ddbcac5b1)

Solitamente sono presenti tre eventi:

* **Update**: viene eseguito una volta per frame
* **On Enter State**: viene eseguito non appena si entra in questo stato
* **On Exit State**: viene eseguito appena prima di uscire da questo stato

Ovviamente è possibile aggiungere qulsiasi altro evento, come nei Flow States.

{% hint style="warning" %}
I valori di Input ed Output vengono solamente utilizzati per le Super Unit e non hanno un valore effettivo in questo caso
{% endhint %}

### I Super States

Un **Super State** è uno stato che contiene altri *State Graph*, permettendo una organizzazione gerarchica delle *State Machines*.

Per creare un *Super State*, è sufficiente cliccare con il pulsante  destro in una zona libera del grafo e scegliere *Create Super State*.

Per modificare la struttura di un *Super State*, è sufficiente effettuare un doppio click su di esso.

### Any State

Lo stato **Any State** permette di creare una transizione da un qualsiasi stato (indifferentemente da quale sia) ad un altro specifico stato.

Per creare un *Any State*, è sufficiente cliccare con il pulsante  destro in una zona libera del grafo e scegliere *Create Any State*.

### State Units

Una **State Unit** si comporta in modo molto simile ad una [Super Unit](https://thebitcave.gitbook.io/guida-a-unity-bolt/i-flow-graph-1/le-unita-di-un-grafo#innestare-i-grafi-super-units): permettono di innestare un grafo in una singola unità di un grafo genitore.

![Una State Unit](https://3114886391-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKUGiR4TokVYSH1_yh6%2F-MOCk0pNQ0WrgxHzOjaw%2F-MOCmPmgTjRYzmoLl3EC%2Fstate-unit.png?alt=media\&token=abccacd3-cecf-4c43-89c5-988750c5cec0)

Per creare una *State Unit*, è sufficiente cliccare con il pulsante destro in una zona libera del grafo e selezionare *Nesting > State Unit*.

Una *State Unit* possiede due ingressi, che definiscono quando entrare e quando uscire dal nodo e due uscite che definiscono cosa fare, rispettivamente.
