Usa uno dei più comuni algoritmi di partizionamento dello spazio, come Quadtree, Octree, albero BSP o anche un semplice sistema a griglia. Ognuno ha i propri pro e contro per ogni specifico scenario. Puoi leggere di più su di loro in questi libri .
Generalmente (o almeno così ho sentito, non ho troppa familiarità con il ragionamento alla base di questo) un Quadtree o Octree si adatta meglio agli ambienti esterni, mentre l'albero BSP si adatta meglio alle scene indoor. E la scelta tra l'uso di un Quadtree o un Octree dipende da quanto è piatto il tuo mondo. Se c'è una piccola variazione nell'asse Y usando un Octree sarebbe uno spreco. Un Octree è fondamentalmente un Quadtree con una dimensione aggiuntiva.
Infine, non trascurare la semplicità della soluzione Grid. Molte persone ignorano che una semplice griglia a volte può essere sufficiente (e persino più efficiente) per i loro problemi e invece passano direttamente a una soluzione più complessa.
L'uso di una griglia consiste semplicemente nel dividere il mondo in regioni equidistanti e nel conservare le entità nella regione appropriata del mondo. Quindi, data una posizione, trovare le entità vicine sarebbe una questione di iterare sulle regioni che intersecano il raggio di ricerca.
Diciamo che il tuo mondo variava da (-1000, -1000) a (1000, 1000) nel piano XZ. Ad esempio, potresti dividerlo in una griglia 10x10, in questo modo:
var grid = new List<Entity>[10, 10];
Quindi posizioneresti le entità nelle loro celle appropriate nella griglia. Ad esempio un'entità con XZ (-1000, -1000) cadrebbe sulla cella (0,0) mentre un'entità con XZ (1000, 1000) cadrebbe sulla cella (9, 9). Quindi, data una posizione e un raggio nel mondo, potresti determinare quali celle sono intersecate da questo "cerchio" e iterare solo su quelle, con un semplice doppio per.
In ogni caso, cerca tutte le alternative e scegli quella che sembra adattarsi meglio al tuo gioco. Ammetto di non essere ancora abbastanza informato sull'argomento per decidere quale degli algoritmi sarebbe meglio per te.
Modifica Trovato su un altro forum e potrebbe esserti di aiuto nella decisione:
Le griglie funzionano meglio quando gli oggetti della stragrande maggioranza si adattano all'interno di un quadrato della griglia e la distribuzione è abbastanza omogenea. Al contrario, i quadrifici funzionano quando gli oggetti hanno dimensioni variabili o sono raggruppati in piccole aree.
Data la tua vaga descrizione del problema, mi appoggio anche alla soluzione della griglia (ovvero, supponendo che le unità siano piccole e distribuite in modo abbastanza omogeneo).