Используйте один из распространенных алгоритмов разделения пространства, таких как Quadtree, Octree, BSP tree или даже простая Grid System. У каждого есть свои плюсы и минусы для каждого конкретного сценария. Вы можете прочитать больше о них в этих книгах .
Как правило (или, как я слышал, я не слишком знаком с причинами этого), Quadtree или Octree лучше подходят для наружной среды, в то время как дерево BSP лучше подходит для внутренних сцен. И выбор между использованием Quadtree или Octree зависит от того, насколько плоский ваш мир. Если есть небольшая разница в оси Y, использование Octree было бы расточительным. Octree - это в основном Quadtree с дополнительным измерением.
Наконец, не пренебрегайте простотой решения Grid. Многие люди игнорируют, что простой сетки иногда может быть достаточно (и даже более эффективным) для своих проблем, и вместо этого переходят прямо к более сложному решению.
Использование сетки состоит просто в разделении мира на равномерно распределенные регионы и хранении сущностей в соответствующем регионе мира. Затем, с учетом позиции, поиск соседних объектов будет происходить путем итерации по регионам, которые пересекают ваш радиус поиска.
Допустим, ваш мир варьировался от (-1000, -1000) до (1000, 1000) в плоскости XZ. Например, вы можете разделить его на сетку 10x10, например, так:
var grid = new List<Entity>[10, 10];
Затем вы поместите сущности в соответствующие ячейки сетки. Например, объект с XZ (-1000, -1000) попадет в ячейку (0,0), а объект с XZ (1000, 1000) попадет в ячейку (9, 9). Затем, учитывая положение и радиус в мире, вы можете определить, какие ячейки пересекаются этим «кругом», и выполнять итерацию только по ним с простым двойным значением для.
В любом случае, изучите все альтернативы и выберите ту, которая лучше всего подходит для вашей игры. Я признаю, что до сих пор не достаточно разбираюсь в предмете, чтобы решить, какой из алгоритмов будет для вас наилучшим.
Находите это на другом форуме, и это может помочь вам с решением:
Сетки работают лучше всего, когда подавляющее большинство объектов помещается в квадрат сетки, и распределение является довольно однородным. И наоборот, квадродерево работает, когда объекты имеют переменные размеры или сгруппированы в небольших областях.
Учитывая ваше расплывчатое описание проблемы, я склоняюсь и к сеточному решению (то есть если предположить, что единицы являются небольшими и довольно однородно распределены).