Use um dos algoritmos de particionamento de espaço comum, como uma árvore Quadtree, Octree, BSP ou até mesmo um sistema de grade simples. Cada um tem seus próprios prós e contras para cada cenário específico. Você pode ler mais sobre eles nestes livros .
Geralmente (ou pelo que ouvi dizer, não estou muito familiarizado com o raciocínio por trás disso) um Quadtree ou Octree é mais adequado para ambientes externos, enquanto a árvore BSP se encaixa melhor em cenas internas. E a escolha entre usar um Quadtree ou um Octree depende de quão plano é o seu mundo. Se houver pouca variação no eixo Y usando um Octree, seria um desperdício. Um Octree é basicamente um Quadtree com uma dimensão adicional.
Por fim, não desconsidere a simplicidade da solução Grid. Muitas pessoas ignoram que uma grade simples às vezes pode ser suficiente (e ainda mais eficiente) para seus problemas e, em vez disso, passam diretamente para uma solução mais complexa.
O uso de uma grade consiste simplesmente em dividir o mundo em regiões uniformemente espaçadas e armazenar as entidades na região apropriada do mundo. Então, dada uma posição, encontrar as entidades vizinhas seria uma questão de iterar sobre as regiões que cruzam seu raio de pesquisa.
Digamos que seu mundo variou de (-1000, -1000) a (1000, 1000) no plano XZ. Você poderia, por exemplo, dividi-lo em uma grade de 10x10, assim:
var grid = new List<Entity>[10, 10];
Em seguida, você colocaria entidades em suas células apropriadas na grade. Por exemplo, uma entidade com XZ (-1000, -1000) cairia na célula (0,0) enquanto uma entidade com XZ (1000, 1000) cairia na célula (9, 9). Depois, dada uma posição e um raio no mundo, você pode determinar quais células são interceptadas por esse "círculo" e iterar apenas sobre elas, com um simples duplo para.
De qualquer forma, pesquise todas as alternativas e escolha a que parece se encaixar melhor no seu jogo. Admito que ainda não tenho conhecimento suficiente sobre o assunto para decidir qual dos algoritmos seria melhor para você.
Editar Encontrei isso em outro fórum e pode ajudá-lo com a decisão:
As grades funcionam melhor quando a grande maioria dos objetos se encaixa dentro de um quadrado de grade e a distribuição é bastante homogênea. Por outro lado, os quadríceps funcionam quando os objetos têm tamanhos variáveis ou estão agrupados em pequenas áreas.
Dada a sua vaga descrição do problema, também estou apoiando a solução da grade (ou seja, assumindo que as unidades são pequenas e distribuídas de maneira bastante homogênea).