Esistono diversi modi per farlo, ma dipendono da dove avrai una grande quantità di interazioni o una popolazione molto densa.
Sfortunatamente, se vuoi che la tua simulazione mantenga una buona precisione, dovrai gestire la maggior parte degli eventi generati da tutti gli attori e trovare tutti / la maggior parte degli attori che richiedono una notifica.
Collisioni economiche
Per quanto riguarda il problema con le aree di consapevolezza, è possibile risolverlo utilizzando un semplice rilevamento delle collisioni.
In un mondo 2d, il rilevamento delle collisioni sui cerchi è "economico". Ad esempio, l'operazione per rilevare se un punto si trova in un cerchio richiede solo 2 sottrazioni, 2 moltiplicazioni e un'aggiunta. Non è necessario eseguire la radice quadrata poiché è possibile memorizzare e confrontare direttamente il raggio quadrato della propria area con la distanza quadrata.
Se usi il cerchio 2d in un mondo 3d, funzionerà sostanzialmente come un cilindro. Può essere un modo conveniente per creare aree se l'altezza non è molto importante.
Raggio orientato agli eventi
Se il volume degli eventi (antincendio, movimento ...) è basso, puoi provare a rilevare ogni attore interessato da ciascun evento. I tuoi eventi genereranno aree (dove possono essere ascoltati).
Questo è il metodo più semplice da implementare, è anche il più flessibile in quanto è possibile raccogliere gli impatti di proiettili / proiettili provenienti da attori al di fuori di un'area di consapevolezza.
D'altra parte, una volta aumentato il volume degli eventi, potrebbe essere necessario ridurre il numero di eventi che attivano le scansioni dell'area o il numero di attori scansionati per evento.
-> È inoltre possibile creare piccole zone (di eventi) in cui tutti gli eventi vengono registrati insieme ed elaborati in blocco (ovvero 2 impatti di proiettili e un passo in corso in una zona utilizzeranno solo una scansione e verranno inviati a tutte le entità interessate). <-
Aree orientate all'attore
È possibile utilizzare il principio "area di consapevolezza". Ad esempio, se un attore si scontra con l'area di consapevolezza (cerchia) di un altro attore, aggiungi semplicemente l'attore in collisione a un elenco di attori potenzialmente interagenti. A seconda di come viene costruito il tuo motore, puoi quindi registrarti per messaggi sonori e altri eventi provenienti dagli attori nell'elenco.
Per verificare il contatto visivo, è anche possibile eseguire scansioni visive solo nell'elenco degli attori registrati.
Non è necessario verificare la presenza di cambiamenti nell'area di consapevolezza ad ogni tick. Puoi farlo di volta in volta, ad esempio ogni 5-30 tick.
Se gli elenchi iniziano a crescere, puoi limitarli a una dimensione massima. Ma poi dovrai dare la priorità agli attori da aggiungere / scambiare nelle liste.
Approccio misto
Puoi mescolare entrambi gli approcci. È possibile registrare attori in aree di consapevolezza per eventi come passi del piede, nasi del motore, ecc ... E altri eventi (impatti di proiettili, esplosioni, ecc ...) possono innescare scansioni in base alla loro importanza. C'è una probabilità molto più alta che qualcuno ascolti un'esplosione di granate rispetto all'impatto di un proiettile, quindi l'esplosione di granata dovrebbe innescare una scansione più ampia dell'impatto del proiettile.
Ti consiglio di iniziare a implementare prima il raggio dell'evento. Una volta che questo funziona e sei in grado di ridurre / aumentare la precisione di questo metodo, puoi iniziare a implementare le aree di consapevolezza dell'attore. In questo modo sarai in grado di iniziare a spostare alcuni eventi sul secondo sistema.
Pool di contesti
Non tutti gli attori devono essere informati di tutti gli eventi. Ad esempio, una torretta antiaerea non deve essere informata degli impatti dei proiettili e dei passi attorno ad essa, anche la presenza di unità di terra potrebbe essere ignorata per alcune unità.
Se trovi molti casi speciali, puoi creare diversi pool di aree di consapevolezza. Un attore può rendere attiva la propria area di consapevolezza in più pool. Ad esempio, potresti voler che le tue unità terrestri reagiscano alle unità terrestri solo mentre alcune unità missilistiche e dotate di laser potrebbero reagire anche alle unità aeree. Gli aeromobili non devono mai essere informati di impatti al suolo diversi dalle esplosioni ...
Ovviamente non è necessario creare più "elenchi" per i pool. Puoi semplicemente usare una maschera di bit e impostare la maschera giusta per ogni attore / area. In questo modo è possibile filtrare con un semplice o prima di controllare la distanza.
Aggregazione
Se vedi le liste in ogni area di consapevolezza crescere e la memoria è scarsa, puoi aggregare aree di consapevolezza per gruppi di nemici (squadre, squadre, plotoni, stormi, sciami ...) purché rimangano vicini gli uni agli altri. In questo modo un'intera squadra può registrarsi per eventi o altri attori / gruppi che entrano nella sua area di consapevolezza.
Fondamentalmente l'entità del gruppo diventa un sostituto / proxy per tutte le scansioni mentre tutti i membri del gruppo vengono rimossi dai pool.
Questo principio può essere applicato anche a tutte le unità all'interno di un veicolo.
Attivazioni di prossimità
Se il server è davvero sovrappopolato di bot (e hai davvero bisogno di tenerli tutti in vita), puoi solo attivare la consapevolezza / AI su quelli all'interno di una speciale "area di attivazione attorno a ciascun giocatore". In questo modo i robot (o gruppi) all'interno di una o più aree di attivazione si mantengono attivi e la loro area di consapevolezza attiva (nel pool di collisioni). Altrimenti la loro area di consapevolezza viene rimossa dal pool (s) di aree attive.
La frequenza con cui tali "aree di attivazione" cercano "aree di consapevolezza" può variare a seconda della velocità del lettore. Un giocatore che viaggia a velocità più alta innescherà più attivazioni di un giocatore che accampa una zona (necessario almeno per attivare i robot in roaming e disattivare i robot che lasciano l'area).
Inoltre puoi disattivare l'area di attivazione di un giocatore se sale a bordo di un veicolo e assegnare un'area di attivazione al veicolo se non ne ha una. In questo modo 10 giocatori che viaggiano nello stesso veicolo non devono avere 10 aree di attivazione.
Delegazione
Se non si temono imbroglioni e altri produttori di problemi, è possibile delegare parte del rilevamento degli eventi all'applicazione client.
Il server può inviare periodicamente un elenco di attori vicini (robot e giocatori) che verranno avvisati dalle app client. L'applicazione client dovrà eseguire la scansione e il rilevamento degli eventi per tutti gli eventi generati dal lettore. Ad esempio, può inviare l'elenco degli attori per avvisare di un colpo, di un impatto di proiettile o di passi.
Questa è un'opzione, può essere valida a seconda del tipo di gioco che stai realizzando. Questa è un'idea teorica e non consiglierei di farlo finché non avrai il pieno controllo sui client delegati (server bot o client sicuri).
Spero che questo possa essere d'aiuto.