Estou criando um jogo usando um mapa de peças composto por muitos milhares de quadrados da grade. No momento, cada quadrado possui um colisor para verificar colisões.
No entanto, com muitos milhares de blocos minúsculos, verificar todos por colisões é ineficiente. Se eu soubesse que o tilemap ficaria assim com antecedência, poderia ter usado apenas 3 ou 4 grandes colisores em vez de milhares de minúsculos:
Existe algum tipo de algoritmo padrão para combinar muitos blocos adjacentes pequenos em blocos maximamente grandes? Nesse caso, alguém poderia descrevê-lo aqui ou apontar para a literatura sobre tais algoritmos?
Como alternativa, talvez o pré-processamento dos coletores de ladrilhos dessa maneira seja completamente a abordagem errada. Em caso afirmativo, qual é o correto para lidar com a eficiência de um número extremamente grande de coletores?
fonte
Respostas:
Achei útil esse algoritmo para o mecanismo love2d ( linguagem lua )
https://love2d.org/wiki/TileMerging
Aqui segue o exemplo do love2d no meu projeto atual. Em vermelho, você pode ver meus coletores de parede.
fonte
Se você deseja criar terrenos destrutíveis, a maneira como fiz isso no Unity é colocar apenas coletores nos limites do seu mundo. Então, por exemplo, é isso que você gostaria de realizar:
Todos esses blocos verdes contêm um colisor e o restante não. Isso economiza muito em cálculos. Se você destruir um bloco, poderá ativar os colisores em blocos adjacentes com bastante facilidade. Lembre-se de que ativar / desativar um colisor é caro e deve ser feito com moderação.
Portanto, o recurso Tile é assim:
É um objeto de jogo padrão, mas também pode ser agrupado. Observe também que o colisor de caixa está definido para ser desativado por padrão. Somente ativaríamos se for um bloco de borda.
Se você está carregando estaticamente seu mundo, não há necessidade de juntar seus ladrilhos. Você pode carregar todos eles de uma só vez, calcular a distância da borda e aplicar um colisor, se necessário.
Se você estiver carregando dinamicamente, é melhor usar um pool de blocos. Aqui está um exemplo editado do meu loop de atualização. Carrega blocos com base na visualização atual da câmera:
Idealmente, eu escreveria um post muito mais detalhado, pois há muito mais nos bastidores. No entanto, isso pode ajudá-lo. Se houver perguntas, não hesite em perguntar ou entrar em contato comigo.
fonte