Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Formas de colisão (2D)

Este guia explica:

  • Os tipos de formas de colisão disponíveis em 2D no Godot.

  • Usando uma imagem convertida em polígono como forma de colisão.

  • Considerações de desempenho em relação a colisões 2D.

O Godot fornece muitos tipos de formas de colisão, com diferentes compromissos entre desempenho e precisão.

Você pode definir a forma de um PhysicsBody2D adicionando um ou mais CollisionShape2Ds ou CollisionPolygon2Ds como nós filhos diretos. Nós filhos indiretos (ou seja, filhos de nós filhos) serão ignorados e não serão usados como formas de colisão. Além disso, observe que você deve adicionar um recurso Shape2D aos nós de forma de colisão na aba do Inspetor.

Nota

Quando você adiciona múltiplas formas de colisão a um único PhysicsBody2D, você não precisa se preocupar com a sobreposição entre elas. Elas não vão "colidir" umas com as outras.

Formas primitivas de colisão

Godot fornece os seguintes tipos de formas primitivas de colisão:

Você pode representar a colisão da maioria dos objetos menores usando uma ou mais formas primitivas. No entanto, para objetos mais complexos, como um grande navio ou um nível inteiro, você pode precisar de formas convexas ou côncavas. Mais sobre isso abaixo.

Recomendamos priorizar formas primitivas para objetos dinâmicos, como RigidBodies e CharacterBodies, pois seu comportamento é o mais confiável. Elas também costumam oferecer melhor desempenho.

Formas de colisão convexas

Aviso

O Godot atualmente não oferece uma maneira integrada de criar formas de colisão convexas em 2D. Esta seção está aqui principalmente para fins de referência.

As formas de colisão convexas são um meio-termo entre formas de colisão primitivas e formas de colisão côncavas. Elas podem representar formas de qualquer complexidade, mas com uma ressalva importante. Como o nome indica, uma forma individual só pode representar uma forma convexa. Por exemplo, uma pirâmide é convexa, mas uma caixa oca é côncava. Para definir um objeto côncavo com uma única forma de colisão, você precisa usar uma forma de colisão côncava.

Dependendo da complexidade do objeto, você pode obter um melhor desempenho usando múltiplas formas convexas em vez de uma forma de colisão côncava. O Godot permite que você use a decomposição convexa para gerar formas convexas que correspondam aproximadamente a um objeto oco. Note que essa vantagem de desempenho deixa de ser válida após uma certa quantidade de formas convexas. Para objetos grandes e complexos, como um nível inteiro, recomendamos o uso de formas côncavas.

Formas de colisão côncavas ou trimesh

As formas de colisão côncavas, também chamadas de formas de colisão trimesh, podem assumir qualquer formato, desde alguns triângulos até milhares de triângulos. As formas côncavas são a opção mais lenta, mas também são as mais precisas no Godot. Você só pode usar formas côncavas dentro de StaticBodies. Elas não funcionar block com CharacterBodies ou RigidBodies, a menos que o modo do RigidBody seja Static.

Nota

Mesmo que as formas côncavas ofereçam a colisão mais precisa, o relatório de contato pode ser menos preciso do que nas formas primitivas.

Quando não estiver usando TileMaps para o design de níveis, as formas côncavas são a melhor abordagem para a colisão de um nível.

Você pode configurar o modo de construção (build mode) do nó CollisionPolygon2D no inspetor. Se estiver definido como Solids (o padrão), as colisões incluirão o polígono e sua área contida. Se estiver definido como Segments, as colisões incluirão apenas as arestas do polígono.

Você pode gerar uma forma de colisão côncava a partir do editor selecionando um Sprite2D e usando o menu Sprite2D no topo do viewport 2D. O menu suspenso do Sprite2D expõe uma opção chamada Create CollisionPolygon2D Sibling. Assim que você clica nela, um menu com 3 configurações é exibido:

  • Simplification: Valores mais altos resultarão em uma forma menos detalhada, o que melhora o desempenho ao custo da precisão.

  • Shrink (Pixels): Valores mais altos encolherão o polígono de colisão gerado em relação às arestas do sprite.

  • Grow (Pixels): Valores mais altos expandirão o polígono de colisão gerado em relação às arestas do sprite. Note que definir Grow e Shrink para valores iguais pode produzir resultados diferentes do que deixar ambos em 0.

Nota

Se você tiver uma imagem com muitos pequenos detalhes, é recomendável criar uma versão simplificada e usá-la para gerar o polígono de colisão. Isso pode resultar em melhor desempenho e sensação de jogo, já que o jogador não será bloqueado por pequenos detalhes decorativos.

Para usar uma imagem separada para a geração do polígono de colisão, crie outro Sprite2D, gere um polígono de colisão irmão a partir dele e, em seguida, remova o nó Sprite2D. Dessa forma, você pode excluir pequenos detalhes da colisão gerada.

Ressalvas de desempenho

Você não está limitado a uma única forma de colisão por PhysicsBody. Ainda assim, recomendamos manter o número de formas o menor possível para melhorar o desempenho, especialmente para objetos dinâmicos como RigidBodies e CharacterBodies. Além disso, evite transladar, rotacionar ou escalonar CollisionShapes para se beneficiar das otimizações internas do motor de física.

Ao usar uma única forma de colisão não transformada em um StaticBody, o algoritmo de broad phase do mecanismo pode descartar PhysicsBodies inativos. A narrow phase então só terá que levar em conta as formas dos corpos ativos. Se um StaticBody tiver muitas formas de colisão, o broad phase falhará. A narrow phase, que é mais lenta, deve então realizar uma verificação de colisão contra cada forma.

Se você se deparar com problemas de desempenho, pode ser necessário fazer concessões em termos de precisão. A maioria dos jogos por aí não possui uma colisão 100% precisa. Eles encontram maneiras criativas de escondê-la ou torná-la imperceptível durante a jogabilidade normal.