Un buon modo per gestire l'IA offscreen?


16

Per esempio amor:

  • Diciamo che ci sono 10 stanze nel mondo.
  • E diciamo che il mondo è abitato da 10 entità.
  • E ogni entità ha la sua "routine quotidiana" in cui compie determinate azioni nella stanza e potrebbe anche navigare tra le stanze.

Dato che il giocatore può essere solo in una stanza alla volta, qual è un buon modo per tenere traccia delle azioni che le altre entità stanno compiendo in altre stanze fuori dallo schermo?

  1. L'opzione più semplice è quella di controllare ognuna delle 10 entità su ogni frame, controllare la loro posizione / stato e determinare se l'entità dovrebbe trovarsi o meno nella stanza in cui si trova il giocatore in un dato momento. (Questo tuttavia sembra molto pesante in termini di risorse, specialmente quando aumenta la quantità di stanza / entità.)
  2. Un'altra opzione è quella di tenere traccia del tempo trascorso dall'inizio del gioco, quindi ciascuna entità verifica se il suo modello si interseca con la stanza in cui si trova il giocatore e se lo fa controlla in base al tempo se il si suppone che l'entità si trovi nella stessa stanza in questo particolare momento, le entità i cui schemi non si intersecano con la stanza corrente in cui si trova il giocatore non fanno nulla finché il giocatore non entra in una stanza in cui i loro schemi si intersecano e solo a quel punto calcola se dovrebbero rendere. (Ma se interagiscono con la stanza, dovranno sempre controllare lo stato delle stanze che intersecano il loro percorso al fine di determinare la loro posizione in quel momento, il che non è eccezionale.)

  3. La terza opzione a cui sono arrivato sarebbe innanzitutto guardare solo le rotte che intersecano la posizione del giocatore (come descritto in precedenza), in secondo luogo entrando in una stanza, controllare se il giocatore è in quella stanza, se non poi controllare solo il stato della stanza e quanto tempo ci vorrà per passare alla stanza successiva. Ad esempio un NPC bidello entra nella stanza, controlla lo stato della stanza, vede che c'è una fuoriuscita fatta dal giocatore, calcola quanto tempo ci vorrà per ripulirlo e quanto tempo impiegherà il percorso ecc. E fino a quando menzionato il tempo è dovuto per entrare nella stanza successiva controlliamo solo se il giocatore è nella stanza. La posizione esatta dell'NPC ai fini del rendering sarebbe calcolata solo quando il giocatore entra nella stanza.

Dopo un po 'di brainstorming sono arrivato alla terza opzione, ma mi chiedevo se forse c'è un modo noto o migliore per gestire cose come queste?


1
Questa domanda mi ricorda un dev-blog che ho letto per un gioco chiamato Project Zomboid.
Sumurai8

Risposte:


12

Un approccio molto semplice consiste nell'utilizzare "Livello di dettaglio AI". In parole povere, ciò significa che aggiorni l'intelligenza artificiale più frequentemente più si avvicina al lettore / fotocamera. È inoltre possibile ridurre la complessità dei calcoli AI più lontani, esp. per trovare il percorso. Dopotutto, se il giocatore non riesce a vedere bene o per niente il personaggio, non ha senso fare un sacco di sforzi per simulare il personaggio con la massima precisione.

Nel tuo esempio, la stanza in cui si trova il giocatore potrebbe ottenere la massima precisione (AI aggiorna ogni fotogramma, piena risoluzione). Le sale adiacenti potrebbero ottenere la massima precisione successiva (aggiornamenti ogni 10 tick, rimozione del livellamento del percorso e animazioni). Tutte le altre stanze possono ottenere la precisione più bassa (aggiornamenti ogni secondo, ricerca di percorsi a bassa risoluzione, eliminazione delle interazioni non essenziali da NPC a NPC).

I giochi più grandi e complessi possono (e hanno) usato approcci simili. Potrebbero semplificare i calcoli del combattimento, teletrasportare i personaggi piuttosto che cercarli sul percorso quando devono muoversi, ecc.

Se il tuo gioco è abbastanza grande da non poter tenere tutto in memoria in ogni momento, una buona soluzione è quella di memorizzare l'ultimo tempo di aggiornamento nei dati salvati della stanza e riprodurre la sua simulazione fuori dallo schermo (alla sua risoluzione più bassa) quando è caricato di nuovo.

Se ti aspetti che l'IA si sposti in aree "vive" da aree "addormentate" scaricate in base a una pianificazione, ti consigliamo di creare dati a bassissima fedeltà per quelle regioni da tenere sempre in memoria (ad esempio, solo le più grossolane livello di dettaglio navmesh e posizioni chiave di oggetti / personaggi) o vorrai periodicamente scorrere quelle aree (ad esempio, mantenere X aree "addormentate" in memoria e simulazione a bassa fedeltà con aggiornamenti rari e quindi round-robin attraverso tutte le " "aree addormentate" che contengono NPC attivi chiave in esse, scaricando e caricando le aree mentre lo fai).


1

Memorizzerei le entità che si trovano attualmente in una stanza in quell'istanza della stanza, l'oggetto stanza inoltre terrebbe traccia di quando quali entità devono essere aggiornate (ad es. Viaggiare in un'altra stanza o cambiare qualcosa in quella stanza, ecc.). E aggiornerei anche una (o più) stanze al secondo (forse in un altro thread).

Quando aggiorni una stanza, le posizioni degli NPC dovrebbero essere aggiornate e tutte le azioni che hanno eseguito che interagiscono con la stanza dall'ultimo aggiornamento dovrebbero essere gestite anche, infine il tempo del prossimo aggiornamento necessario dovrebbe essere controllato / aggiornato.

Se un'entità viaggia da una stanza all'altra, la sua istanza deve essere memorizzata nell'altra stanza e anche il prossimo aggiornamento dell'entità deve essere aggiornato.

In questo modo devi solo aggiornare la stanza attuale e le stanze che hanno un aggiornamento programmato in quel momento, l'aggiornamento delle altre stanze è solo facoltativo (ma consigliato se hai un'intelligenza artificiale che si aggiorna ogni volta che il giocatore si muove o fa qualcosa) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.