Intelligenza artificiale parte 3

In questo articolo spiegherò come avviene l’attacco del nemico, ti ricordo che ogni gioco ha le sue specifiche e che trattarle tutte è impossibile, ma cercherò di darti un’infarinatura generale sui principi base di questa parte dell’AI in modo che da solo puoi svilupparne una ad hoc per il tuo gioco. Per questo tutorial userò il file della seconda lezione modificato in modo che l’AI faccia una ronda su un percorso, puoi scaricare il file da QUI

Come già detto il metodo con cui il nostro nemico ci attacca è determinato principalmente dal tipo di gioco, mostrerò solo tre esempi differenti sulle modalità che innescano un’inseguimento da parte del nemico.

Esempio 1, raggio d’azione

In questo esempio vedrai come l’Ai del nemico inizierà il suo inseguimento quando il player entrerà in uno spazio e quindi verrà intercettato dal nemico. Anche qui la modalità dell’inseguimento dipende da te, nel mio esempio darò un limite di spazio in modo che quando il player lo supera l’inseguimento finisce e l’AI torna alla sua ronda. 

Seleziona l’AI e inserisci un Sensor Near, se non conosci questo Sensor ti ricordo che lo puoi trovare nel manuale di questo sito QUA. Siccome per innescarsi il Sensor Near ha bisogno di intercettare una Property, seleziona il player e inserisci una Property che lo identifica (io ho usato la parola player). Riseleziona l’AI e inserisci la Property nell’apposito campo, adesso bisogna inserire una distanza che serve come diametro di una sfera entro la quale il player viene identificato, nel mio esempio inserisco 5 in entrambi i campi del Sensor e lo collego, tramite un Controller And, ad un’Actuator State selezionando il secondo State Mask, questo perchè voglio che smetta di fare la ronda e insegua il player. Vai al secondo State Mask e inserisci un Sensor Always e collegalo tramite un Controller And ad un’Actuator Steering che avrà come opzione quelle in figura

Adesso bisogna dire all’AI che quando il player esce da un determinato raggio può tornare a fare la ronda, userò anche in questo caso un Sensor Near con gli stessi parametri di quello precedente ma con la differenza che attiverò il pulsante Invert perchè deve avere un comportamento opposto, cioè deve inviare un impulso positivo quando il player esce dalla sfera. Collega il Sensor Near tramite un Controller And ad un’Actuator State e clicca sul primo State Mask, in modo che quando arriva l’impulso l’AI torna a fare la ronda. Per facilitare la prova è meglio visualizzare la sfera che Blender crea con il Sensor Near, per farlo basta mettere la spunta su Show Physics Visualization dal menù Game nella barra principale del menù di Blender, come da figura

Salva e prova il gioco. L’AI si comporta esattamente come pianificato, esegue la ronda, quando il player entra nella sfera del Sensor Near inizia l’inseguimento, quando il player esce dalla sfera l’Ai torna a fare la ronda. 

Esempio 2, Ai vede il player

Come prima cosa inserisci una nuova scena facendo un Full Copy, in questo modo evito passaggi inutili. Cancella il Sensors Near nel primo State Mask perchè in questo esempio (come da titolo) voglio simulare che l’AI veda il player come se avesse degli occhi. Inserisci un Sensor Radar, QUA la scheda del Sensor Radar, e come per il Near inserisci la Property nel campo apposito e metti 45° come Angle e 10 come Distance, collegalo all’Actuator State, il comportamento del secondo State Mask è identico, devi solo cambiare numeri della Distance e Reset Distance da 5 a 10, questo perchè una volta innescato l’inseguimento se i parametri sono minori della Distance del Sensor Radar l’Ai va in blocco, puoi anche decidere tu i parametri da inserire facendo varie prove. Salva e prova il gioco. In questo modo puoi andare dietro l’AI e ucciderlo in modalità stealth.

Questi due metodi sono molto interessanti ma hanno delle imperfezioni, perchè i due Sensors (Near e Radar) leggono le informazioni attraverso gli oggetti della scena, se il player si trova dietro un muro verrà rilevato lo stesso, si può ovviare a questo problema facendo in modo che i Sensor rilevino anche i muri, e quindi evitino di oltrepassarli, basta creare diversi State Mask in modo che quando viene rilevato un muro si cambia in uno State dove il Sensor è ridotto, in modo da evitare che oltrepassi con il suo raggio d’azione l’oggetto, ma questa pratica richiede tempo e varie prove, certo è fattibile e può essere anche molto stimolante, l’importante è che tutti i Sensor di rilevamento non si trovino nello stesso State Mask del movimento, come ho usato io nei due esempi, e che vengano alternati usando le varie opzioni dell’Actuator State.

Esempio 3, trigger

Come nell’esempio precedente crea una Full copy della scena. Ho già spiegato un pò cosa è un Trigger nella parte finale della creazione di un prototipo, altro non è che un oggetto invisibile che innesca un’azione, nel caso dell’AI fa partire l’inseguimento. Come prima cosa cancella il Sensor Radar perchè non serve, quello che ci serve è un’area più o meno grande dove se il player vi entra scatta come un’allarme. Inserisci un cubo, io lo scalo in modo da fargli coprire la parte centrale della scena, come mostro nella figura di seguito, gli ho dato un materiale rosso per identificarlo in fase di editing della scena.

Tu puoi inserire il cubo dove preferisci. Dalle opzioni della fisica dell’oggetto metti le spunte su Actor e Ghost, così farà parte della fisica del gioco ma gli oggetti lo possono attraversare. Quello che voglio ottenere è che quando il player entra dentro il cubo (che ho rinominato trigger) l’AI inizi l’inseguimento usando il comportamento già impostato nello State Mask 2. Inserisci un Sensor Collision al trigger, seleziona il True Level Trigger (i tre puntini in alto) e inserisci la Property player nell’apposito spazio, quando il Sensor invia l’impulso positivo bisogna farlo sapere all’AI, in questa situazione l’unico Actuator da usare è il Message (QUA la scheda), inseriscilo e collegalo al Sensor Collision tramite un Controller And. Se vuoi mandare un messaggio a tutti gli oggetti della scena basta scrivere solo il Subject nell’Actuator, ma in questo caso lo inviamo direttamente all’AI che si chiama AI.002 (perchè copiando la scena Blender assegna un numero progressivo ai vari oggetti), il Subject è semplicemente go, inserisco un’immagine del mattone

Adesso seleziona l’AI e inserisci un Sensor Message scrivendo sul Subject go, o il soggetto che hai usato tu. Collegalo all’Actuator State che punta allo State Mask 2 dove si trova il comportamento dell’inseguimento, salva e prova il gioco. Se ti sembra eccessiva la sfera del Sensor Near puoi ridurla.

Conclusioni

Questi sono solo alcuni esempi di come si può comportare un’AI in un gioco, ripeto, le possibilità sono tantissime e provare a spiegarle tutte è molto difficile, in ogni caso più comportamenti vuoi che la tua AI ha più State Mask devi riempire di mattoni che eseguono una determinata azione, hai visto come si passa da uno State all’altro, essendo questi dei tutorial mirati alla logica non sono presenti animazioni di nessun tipo, ma se tu hai delle AI con personaggi puoi inserire le animazioni nei vari State Mask. Ti ricordo inoltre che sperimentare aiuta a capire meglio come funziona il motore di gioco di blender e che fare pratica non guasta. Buon divertimento.