Використовуйте один із загальноприйнятих алгоритмів розподілу простору, таких як Quadtree, Octree, BSP дерево або навіть проста система Grid. У кожного є свої плюси і мінуси для кожного конкретного сценарію. Ви можете прочитати більше про них у цих книгах .
Взагалі (або я так чув, я не надто знайомий з міркуваннями цього) Квадрат або Октре краще підходять для зовнішнього середовища, тоді як дерево BSP краще підходить для приміщень. А вибір між використанням квадрату чи октре залежить від того, наскільки рівним є ваш світ. Якщо в осі Y мало різниць, використовуючи Октре, було б марно. Октре - це в основному Квадрат з додатковим виміром.
Нарешті, не ігноруйте простоту рішення Grid. Багато людей ігнорують, що простої сітки іноді може бути достатньо (і навіть ефективніше) для їх проблем, а натомість переходять до більш складного рішення.
Використання сітки полягає в простому поділі світу на рівномірно розподілені регіони та зберіганні сутностей у відповідному регіоні світу. Тоді, з огляду на позицію, пошук сусідніх об'єктів було б питанням перегляду регіонів, які перетинають ваш радіус пошуку.
Скажімо, ваш світ коливався від (-1000, -1000) до (1000, 1000) у площині XZ. Ви можете, наприклад, розділити його на 10x10 сітку, наприклад:
var grid = new List<Entity>[10, 10];
Тоді ви розміщуєте об'єкти у відповідних клітинках у сітці. Наприклад, сутність з XZ (-1000, -1000) впаде на комірку (0,0), тоді як сутність з XZ (1000, 1000) потрапить на комірку (9, 9). Тоді, задавши положення та радіус у світі, ви могли визначити, які клітинки перетинаються цим "колом", і повторити лише ті, простий подвійний для.
У будь-якому разі вивчіть всі альтернативи та виберіть ту, яка, здається, краще відповідає вашій грі. Зізнаюся, я все ще недостатньо обізнаний з цього питання, щоб вирішити, який з алгоритмів був би найкращим для вас.
Редагувати Знайдено це на іншому форумі, і це може допомогти вам у прийнятті рішення:
Сітки найкраще працюють тоді, коли об'єкти переважної більшості розміщуються в межах сіткової площі, а розподіл досить однорідний. І навпаки, квадрати працюють, коли об'єкти мають змінні розміри або кластеризовані на невеликих ділянках.
З огляду на ваш розпливчастий опис проблеми, я також схиляюся до сітчастого рішення (це, якщо припустити, що одиниці невеликі та досить однорідно розподілені).