Far sì che l'IA segua percorsi diversi tra loro


16

Ho un gioco 2d dall'alto verso il basso in cui l'IA si genera ai bordi della mappa e corre verso il centro.

Sto usando A * e una mesh di nodo per fare il pathfinding.

In questo momento, l'IA si genera in un punto sul bordo della mappa e tutti prendono lo stesso percorso che è il percorso più breve verso il centro.

Ora voglio che siano più sorprendenti e interessanti e che prendano strade diverse l'una verso l'altra.

Posso immediatamente pensare a due idee per farlo, ma volevo sapere se ci sono altri modi o modi migliori che le persone usano spesso?

  1. Quando un nemico si genera e genera un percorso verso il centro, aumenta temporaneamente il costo di tutti i nodi su quel percorso, quindi diminuiscili lentamente nel tempo. Quindi l'IA nemica che si genererà in seguito sarà costretta a intraprendere un percorso più ampio.

  2. L'approccio di cui sopra porterà l'IA a seguire un percorso sempre più ampio e sarà comunque molto prevedibile. Quindi ho pensato di introdurre anche una serie di nodi obiettivo intermedi intorno alla mappa. Quando si genera l'IA, scelgono casualmente uno degli obiettivi intermedi e si dirigono lì prima di dirigersi al centro della mappa. Combinando questo con l'approccio di cui sopra per aumentare i costi potrebbe sembrare abbastanza buono?

Quali approcci hanno trovato le persone che funzionano meglio per far sì che l'IA possa variare i percorsi che prendono, apparire convincente e sorprendente?

Risposte:


7

La tua seconda opzione suggerisce un approccio più fondamentale: garantire che i nemici si avvicinino al tuo giocatore da direzioni diverse. La domanda è: fino a che punto devono viaggiare per "aggirare" il tuo giocatore? L'ideale per questo sarebbe un mix di

  • generare dinamicamente punti che circondano da vicino (cioè seguono) la posizione del giocatore;
  • ciò che Nevermind ha suggerito in termini di percorsi randomizzati verso questi punti circostanti, in misura maggiore o minore.

In questo modo, puoi assicurarti che le IA non facciano deviazioni inutilmente lunghe solo per ottenere variazioni realistiche del percorso quando convergono sul giocatore.

La diffusione collaborativa fa ciò che vuoi implicitamente come parte dell'algoritmo. Ma non è banale da implementare.


La diffusione collaborativa è solo un'alluvione con un certo peso. È banale da implementare, forse più facile di A *. Richiede solo una visione diversa del tuo mondo - un cambiamento concettuale non banale, forse, ma nessun problema di implementazione.

È ancora banale da implementare perché è un punto di vista non standard in termini di gestione delle entità AI :)
Ingegnere

Grazie Nick. Penso che impostare alcuni waypoint che circondano il giocatore al centro della mappa sarà la strada principale da percorrere. Non sono sicuro in questa fase se saranno generati dinamicamente o saranno coinvolti alcuni lavori manuali per ciascun livello per la mia situazione particolare. Grazie ancora!
TerryB

12

Come prima idea, prova ad aggiungere un piccolo valore casuale al peso di ciascun nodo durante l'individuazione del percorso. In questo modo, ogni agente cercherà un percorso in un ambiente leggermente diverso. Non sono sicuro che funzionerà nel tuo caso, ma dovrebbe essere davvero facile da provare.


I nemici finiranno per correre come polli, e in un ambiente a grana fine i percorsi non saranno comunque così diversi. È una buona aggiunta ad altre soluzioni, ma non una soluzione in sé
Coyote,

@Coyote Questo dipende molto dalla struttura della nav-mesh e dalle relazioni tra pesi del nodo, velocità e componente casuale. Ecco perché ho definito la risposta come un suggerimento da provare, non come una risposta definitiva.
Nevermind,

Anzi :) Di solito sono un fan dell'entropia. Ma il risultato finale è raramente eccezionale.
Coyote,

In realtà credo che la risposta di Nick Wiggill sia molto meglio della mia. Ma in qualche modo non sta ottenendo i voti che merita.
Nevermind,

È ... Ma il tuo è il primo e più semplice ... potremmo provare a votarlo in basso: P
Coyote,

3

Mi piace la risposta di Nevermind , tuttavia, data la limitazione descritta nei commenti, questo è quello che vorrei provare:

  1. L'algoritmo per una singola unità al centro registra la distanza totale percorsa.
  2. Per ogni unità successiva assegnarla una distanza che è casuale e una piccola quantità più lunga di questa.
  3. Mentre esegui la A * per ogni unità, aggiungi un peso extra in base a quanto sei vicino e fino a dove "vuoi" viaggiare. Questo sarebbe probabilmente qualcosa di simile (distanceToGoal) + Max(0, desiredDistance - distanceTravelled)).

Ciò indurrebbe le unità a tentare di andare oltre, il che è probabilmente un percorso diverso, il che porterebbe eventualmente a intraprendere percorsi diversi.

Potresti anche aggiungerlo al tuo huerestic iniziale per ogni unità, ma l'intervallo casuale dovrebbe essere probabilmente un po 'più ampio.


2

Come indicato da Nick Wiggill, l'approccio più semplice sarebbe quello di ottenere un cerchio attorno all'obiettivo.

  • assegnare in modo casuale un punto vicino a questo cerchio come waypoint.
  • elimina tutti i percorsi nel cerchio dal percorso iniziale (o aumenta notevolmente il valore di questi punti)
  • quindi da quel waypoint ottenere il percorso verso l'obiettivo.

La parte importante è eliminare tutti i percorsi nel cerchio per il waypoint originale poiché probabilmente finiresti con i nemici che attraversano il cerchio per raggiungere il loro waypoint iniziale.

Da ciò puoi ottenere qualsiasi variante giocando con più valori aggiungendo waypoint secondari nel cerchio vicino a quello iniziale ecc.


se la tua mappa lo supporta, trova posizioni "interessanti" attorno a questo cerchio (porte, copertura, alberi, rocce, edifici; qualsiasi nodo con qualche vantaggio tattico) e fai in modo che i tuoi nemici si dirigano verso quelle posizioni prima che siano disponibili e escano solo in all'aperto se devono. Questo sembrerà molto più intelligente del semplice colpire un punto casuale sul bordo del cerchio.
DampeS8N,

Grazie Coyote, sì, probabilmente andrò con la soluzione Nicks e, come suggerito da DampeS8N, alcune posizioni chiave di interesse come waypoint. Per evitare il problema dell'intelligenza artificiale "attraversare il cerchio", aumenterò notevolmente il costo dei nodi nel cerchio, quindi A * dovrebbe
aggirarlo

2

Il tuo problema qui è essenzialmente che A * è un algoritmo per trovare la strada più veloce verso un obiettivo. Se questo è il tuo criterio principale per un percorso "buono", non sorprende che tutti i tuoi attori prendano le stesse decisioni.

Quello che devi fare è modificare i criteri di qualità per il percorso, in modo che "il più breve è il migliore" non sia l'unico fattore. L'elemento di casualità è la chiave in questo, ma non così tanto da sminuire l'intelligenza di ricerca del percorso (cioè gli attori intraprendono stupidamente rotonde rotte verso l'obiettivo).

Un * pathfinding è innatamente ingenuo, poiché di solito assume che l'attore abbia una perfetta conoscenza dell'intero percorso prima che inizi. Sembrerà sempre irrealistico. La soluzione ha suggerito che gli obiettivi intermedi scelti sono a un passo da quello: l'IA sta cercando di avvicinarsi all'obiettivo, ma cerca solo di navigare in piccole sezioni alla volta (questo è analogo alla vita reale in cui puoi navigare solo fino a lontano come puoi vedere e mentre attraversi più del percorso, puoi vedere più avanti).

Consiglierei forse un modo più semplice di vederlo. Quando stai cercando un percorso, non mantieni solo un singolo percorso migliore che ho trovato finora. Invece, raccogli una serie dei migliori 5 o 10 percorsi. Usa una soglia per scartare ovvi valori anomali. Ad esempio, se il percorso migliore attraversa 20u per raggiungere l'obiettivo, il successivo migliore attraversa 21u e il successivo dopo attraversa 50u. Imposta una soglia del 20% più grande del percorso migliore, quindi scarta il percorso 50u perché è stupidamente più lungo. Ora hai diversi percorsi tra cui scegliere e selezionando casualmente da quel set di percorsi, i tuoi attori prenderanno decisioni diverse.

Tuttavia non otterrai questo tipo di informazioni con la ricerca A * standard, quindi penso che dovresti modificare l'algoritmo o usare qualcos'altro per raccogliere l'insieme di possibili percorsi.


1

Se hai un piccolo gruppo di nemici ricorrenti (o tipi di nemici), potresti provare a dare loro personalità che influenzano i loro movimenti. Non devono essere grandi cose, solo cose che emergono di tanto in tanto. Un buon esempio di questo sono i fantasmi di Pac-Man. Trasforma la tua A * in diversi obiettivi intermedi. Forse un nemico è davvero stupido e si perde facilmente, andando in una direzione casuale ogni terzo nodo (tranne che direttamente all'indietro). Essere creativo.

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.