Finite State Machines [Part 1] – Unity Development Resources from TKoU
Finite State Machines potrebbe essere qualcosa che tutti gli sviluppatori potrebbero aver sentito almeno una volta nei loro pochi anni di sviluppo di giochi in Unity.
Cos’è una Finite State Machine comunque? Beh, c’è molto da coprire, ecco perché faremo almeno 3 parti. Fondamentalmente, una Finite State Machine (o FSM) è un pattern di progettazione in cui entra in gioco l’automazione. Comunemente usato nelle implementazioni dell’IA per certi comportamenti. Cioè: camminare, attaccare, oziare, ecc. La FSM può essere implementata anche nei PNG ed è più comune negli RPG Open World.
Trattiamo la FSM come un supervisore:
Ora, il supervisore controlla lo stato di una IA. A seconda dello stato, l’IA reagirà su di esso. Inoltre, a seconda del tipo di IA (se è un tipo di volo, o di terra, o di nuoto) è l’azione che l’IA farà. In questo scenario, l’FSM dice all’IA che si trova nello “Stato di pattuglia”, e le dirà di “Camminare da A a B”. A meno che non ci sia un cambiamento di stato, l’IA camminerà solo da A a B.
Per cambiare stato, prima dobbiamo avere una condizione. Nell’immagine a sinistra, l’IA vede il giocatore e lo dice al supervisore. Ora il sorvegliante cambierà lo stato dell’IA, e inizierà ad attaccare.
Ancora una volta, l’IA inizia a pattugliare di nuovo poiché il giocatore non è nella sua linea di vista.
Come si vede in questi disegni fatti male, ogni stato ha le sue condizioni prima di passare ad altri stati.
Guardiamo il diagramma qui sotto.
Ecco un diagramma degli stati di una IA normale. Le linee rosse rappresentano false sulla condizione che è richiesta per cambiare di stato. Il diagramma è abbastanza semplice. L’IA sarà in stato di inattività se raggiunge la sua destinazione, e viceversa. Se vede un nemico, inizierà ad attaccare. L’FSM ora gestisce tutte le transizioni tra gli stati e aiuta l’IA a fare l’azione che è disponibile per quello stato.
Ora scomponiamo il nostro sistema FSM.
- Sistema FSM principale – Questo è sarà quello che controllerà gli stati dell’IA e controlla se le condizioni tra gli stati. L’FSM principale conterrà tutti gli stati, e gestirà le chiamate di eventi dall’FSM Actions.
- FSM State – Questo determina lo stato corrente dell’IA e contiene tutte le azioni che è posto sull’IA.
- FSM Action – Questa sarà l’azione che l’IA farà quando è in uno stato specifico.
Ora come lo faremo? Mappiamo tutto.
Questo sarà il ciclo del nostro FSM. Prima inizializziamo il FSM, creiamo gli stati, creiamo le azioni e le mappiamo tutte insieme. Dopo averli mappati, ora avvieremo il FSM e indicheremo lo stato in cui l’IA inizierà. Ora, l’IA passerà a uno stato specifico, e l’FSM inizializzerà l’azione, la aggiornerà finché l’azione non finirà e invierà un evento che indica che l’azione è finita. Infine, l’FSM tornerà indietro e cambierà lo stato.
Un’altra cosa che causerà un cambiamento di stato è quando un evento viene chiamato al di fuori della logica dell’IA. Come quando creiamo un comandante e diciamo a tutti i soldati di smettere di muoversi.
Questo conclude la prima parte del nostro tutorial FSM. Spero di avervi spiegato bene il FSM. Se ancora non lo capite, probabilmente avrete bisogno di vedere prima tutto in azione, e vedere la scansione di tutto da soli. È così che ho imparato.
Nella prossima parte, discuteremo di nuovo alcune semplici implementazioni FSM della vita reale, e inizieremo a scrivere il nostro intero motore FSM da zero!