Użyj jednego z typowych algorytmów partycjonowania przestrzeni, takich jak Quadtree, Octree, drzewo BSP, a nawet prosty system grid. Każdy ma swoje zalety i wady dla każdego konkretnego scenariusza. Możesz przeczytać więcej o nich w tych książkach .
Ogólnie (przynajmniej tak słyszałem, nie jestem zbyt zaznajomiony z uzasadnieniem tego) Quadtree lub Octree lepiej pasują do środowisk zewnętrznych, podczas gdy drzewo BSP lepiej pasuje do scen w pomieszczeniach. Wybór między użyciem Quadtree lub Octree zależy od tego, jak płaski jest twój świat. Jeśli istnieje niewielka zmiana w osi Y, użycie Octree byłoby marnotrawstwem. Octree to w zasadzie Quadtree z dodatkowym wymiarem.
Wreszcie, nie lekceważ prostoty rozwiązania Grid. Wiele osób ignoruje fakt, że prosta siatka może czasem wystarczyć (a nawet bardziej wydajna) dla ich problemów, i zamiast tego przejść od razu do bardziej złożonego rozwiązania.
Korzystanie z siatki polega po prostu na podzieleniu świata na równomiernie rozmieszczone regiony i przechowywaniu bytów w odpowiednim regionie świata. Następnie, biorąc pod uwagę pozycję, znalezienie sąsiednich bytów byłoby kwestią iteracji po regionach, które przecinają twój promień poszukiwań.
Powiedzmy, że twój świat wahał się od (-1000, -1000) do (1000, 1000) w płaszczyźnie XZ. Możesz na przykład podzielić go na siatkę 10x10, tak jak:
var grid = new List<Entity>[10, 10];
Następnie umieściłbyś byty w odpowiednich komórkach w siatce. Na przykład byt z XZ (-1000, -1000) spadłby na komórkę (0,0), podczas gdy byt z XZ (1000, 1000) spadłby na komórkę (9, 9). Następnie, biorąc pod uwagę pozycję i promień na świecie, możesz określić, które komórki przecinają to „koło” i iterować tylko nad nimi, z prostym podwójnym dla.
W każdym razie poszukaj wszystkich alternatyw i wybierz tę, która wydaje się lepiej pasować do Twojej gry. Przyznaję, że wciąż nie mam wystarczającej wiedzy na ten temat, aby zdecydować, który z algorytmów będzie dla Ciebie najlepszy.
Edytuj Znalazłem to na innym forum i może ci pomóc w podjęciu decyzji:
Siatki działają najlepiej, gdy większość obiektów mieści się w kwadracie siatki, a rozkład jest dość jednorodny. I odwrotnie, czworoboki działają, gdy obiekty mają zmienne rozmiary lub są skupione w małych obszarach.
Biorąc pod uwagę twój niejasny opis problemu, również opieram się na rozwiązaniu sieciowym (tzn. Zakładając, że jednostki są małe i dość jednorodnie rozmieszczone).