Я создаю игру, используя плитку-карту, составленную из многих тысяч квадратов сетки. На данный момент каждый квадрат имеет квадратный коллайдер для проверки столкновений.
Тем не менее, для многих тысяч крошечных блоков проверка их всех на наличие коллизий неэффективна. Если бы я знал, что плитка будет выглядеть так, я бы просто использовал 3 или 4 больших коллайдера, а не тысячи крошечных:
Существует ли какой-то стандартный алгоритм объединения множества маленьких соседних плиток в максимально большие? Если да, может ли кто-нибудь описать это здесь или указать литературу по таким алгоритмам?
В качестве альтернативы, возможно, предварительная обработка мозаичных коллайдеров таким образом является совершенно неправильным подходом. Если да, то как правильно бороться с эффективностью чрезвычайно большого числа коллайдеров?
источник
Ответы:
Я нашел этот алгоритм полезным для двигателя love2d ( lua language )
https://love2d.org/wiki/TileMerging
Вот следуйте примеру love2d на моем текущем проекте. В красном вы можете увидеть мои стены коллайдеров.
источник
Если вы хотите создать разрушаемую местность, то, как я это сделал в Unity, - это устанавливать коллайдеры только на краевые блоки вашего мира. Например, вот что вы хотели бы достичь:
Все эти зеленые блоки содержат коллайдер, а остальные нет. Это экономит массу вычислений. Если вы уничтожите блок, вы можете легко активировать коллайдеры на соседних блоках. Имейте в виду, что активация / деактивация коллайдера является дорогостоящей и должна выполняться экономно.
Итак, ресурс Tile выглядит так:
Это стандартный игровой объект, но он также может быть объединен. Также обратите внимание, что коллайдер бокса по умолчанию отключен. Мы активируем только если это край плитки.
Если вы статически загружаете свой мир, вам не нужно объединять свои плитки. Вы можете просто загрузить их все за один выстрел, рассчитать их расстояние от края и при необходимости применить коллайдер.
Если вы загружаете динамически, лучше всего использовать пул плиток. Вот отредактированный пример моего цикла обновления. Он загружает плитки в зависимости от текущего вида камеры:
В идеале я бы написал гораздо более подробный пост, поскольку за кулисами происходит гораздо больше. Тем не менее, это может помочь вам. Если есть вопросы, не стесняйтесь спрашивать или свяжитесь со мной.
источник