spacehash
Описание
Языки
- C#100%
Space Hash
Реализация хеширования конечного 2D/3D пространства для быстрого поиска объектов в определенном радиусе.
ВАЖНО! Требует C#9 (или Unity >=2021.2).
ВАЖНО! Не забывайте использовать
-версии билдов для разработки иDEBUG-версии билдов для релизов: все внутренние проверки/исключения будут работать только вRELEASE-версиях и удалены для увеличения производительности вDEBUG-версиях.RELEASE
ВАЖНО! Проверено на Unity 2021.3 (не зависит от нее) и содержит asmdef-описания для компиляции в виде отдельных сборок и уменьшения времени рекомпиляции основного проекта.
Социальные ресурсы
Официальный блог: https://leopotam.ru
Установка
В виде unity модуля
Поддерживается установка в виде unity-модуля через git-ссылку в PackageManager или прямое редактирование :
"ru.leopotam.spacehash": "https://gitverse.ru/leopotam/spacehash.git",
В виде исходников
Код так же может быть склонирован или получен в виде архива со страницы релизов.
Прочие источники
Официальная работоспособная версия размещена по адресу https://gitverse.ru/leopotam/spacehash, все остальные версии (включая nuget, npm и прочие репозитории) являются неофициальными клонами или сторонним кодом с неизвестным содержимым.
Основные типы
SpaceHash2
Представляет собой хеширование конечного 2D-пространства регулярной сеткой для быстрого поиска объектов в определенном радиусе. Экземпляр создается с явным указанием шага сетки и размеров пространства (все объекты вне этого пространства будут автоматически включаться в пограничные клетки, ухудшая производительность в поиске по ним):
ВАЖНО! Идентификатор объекта задается пользователем в качестве типа обобщения (может быть любым типом), в примерах будет использоваться тип
.string
Объекты являются точками без размеров и могут добавляться в любом количестве в хеш:
После добавления всех объектов можно выполнять поиск объектов, находящихся в указанной точке с определенным радиусом:
ВАЖНО! Рекомендуется держать размер радиуса поиска в пределах 1-2 размеров шага сетки пространства. Это не ограничение, а рекомендация, размер сетки следует подбирать под задачу и проводить замеры производительности и потребления памяти.
Для уменьшения аллокаций список результатов может быть использован повторно, для этого его следует передать опциональным параметром:
Если нужен только один самый ближайший объект, то можно воспользоваться следующим методом:
В этом случае вернется успешность операции (найден объект или нет) и информация о нем.
Если нужно только узнать наличие любого объекта в радиусе без определения самого ближнего, то можно воспользоваться следующим методом:
После запросов хеш можно очистить и переиспользовать для нового наполнения и запросов:
ВАЖНО! Заполнение и очистка хеша не потокобезопасны и должны выполняться из основного потока. Запросы объектов из хеша потокобезопасны и могут выполняться из нескольких потоков.
Так же поддерживается поиск в пределах кольца, ограниченного внешним и внутренним радиусами - методы , и - функционал аналогичен , и , в параметрах внутренний радиус , а внешний радиус .
SpaceHash3
Представляет собой хеширование конечного 3D-пространства регулярной сеткой для быстрого поиска объектов в определенном радиусе.
Весь функционал идентичен за исключением поиска по кольцу, в параметры координат добавляется третья ось (Z).
Лицензия
Расширение выпускается под лицензией MIT-ZARYA, подробности тут.