Voltar para o Blog
Quest Log

Tilemap Collider na Unity: Composite e Personagem Preso

Fase 2D em pixel art com contornos verdes de colisão desenhados sobre os blocos e um personagem correndo pela plataforma

Unity Tilemap Collider sem personagem preso: Tilemap Collider 2D com Composite Collider 2D, Rigidbody2D Static, Outlines ou Polygons e plataforma one-way.

Ferramenta:Unity

Tilemap Collider na Unity: Composite e Personagem Preso

Para um Unity Tilemap Collider que não prende o personagem, use três componentes no Tilemap de chão: Tilemap Collider 2D, Composite Collider 2D e um Rigidbody2D com Body Type Static, e coloque o Composite Operation do Tilemap Collider 2D em Merge. Isso junta os colliders de todos os tiles num contorno contínuo. Sem essa junção, cada tile tem uma caixa própria e o personagem engasga ou trava na fronteira entre dois tiles, mesmo num chão perfeitamente reto.

Aqui você monta a colisão do Tilemap no Unity 6.3 LTS, escolhe entre Outlines e Polygons, resolve o personagem grudando em parede e cria plataformas one-way que dá para atravessar por baixo e descer apertando para baixo.

Tilemap Collider na Unity: por que um collider por tile dá problema

O Tilemap Collider 2D gera automaticamente uma forma de colisão para cada tile. Num chão de 50 tiles, são 50 caixas encostadas.

O problema aparece no encontro entre duas caixas. A física 2D resolve colisões forma por forma. Quando o collider do personagem desliza de uma caixa para a próxima, existe um instante em que ele toca a quina vertical da caixa seguinte. Para o solver, aquilo é uma parede de altura quase zero. O resultado varia conforme a velocidade e o formato do collider do personagem: um tranco, um pulinho, ou o personagem parado no meio do chão até você soltar e apertar de novo.

Collider de personagem em formato de caixa sofre mais. Cápsula sofre menos, mas não está imune. A correção de verdade é eliminar as quinas internas, e é isso que o Composite faz.

Adicionar Composite Collider 2D corretamente

No Tilemap que deve colidir (o Ground, se você separou as camadas como no post sobre Tilemap na Unity):

  1. Add Component > Tilemap Collider 2D. A Scene mostra contornos verdes em volta de cada tile.
  2. Add Component > Composite Collider 2D. A Unity adiciona um Rigidbody2D junto, porque o Composite precisa de um corpo para pertencer.
  3. No Tilemap Collider 2D, troque Composite Operation para Merge.
  4. Olhe a Scene: os contornos individuais viram um contorno único em volta de cada bloco de terreno.

A documentação do Unity 6.3 descreve o Composite como uma forma de reduzir quantas formas a física precisa calcular por atualização. Ou seja: além de resolver o engasgo, fica mais leve.

Rigidbody2D Static e a propriedade de composição

O Rigidbody2D que veio junto nasce como Dynamic. Se você der Play assim, o chão inteiro cai com a gravidade. Troque Body Type para Static.

Static é o certo para chão e parede: o corpo não se move, não recebe gravidade e a física trata como cenário. Se você precisa de plataforma que se move, ela não deve estar no Tilemap do chão; faça um GameObject separado com Rigidbody2D Kinematic.

Sobre Composite Operation, o campo do Unity 6 que aparece em todo Collider2D:

  • None: o collider não participa do Composite.
  • Merge: junta (lógica OU). É o que você quer no Tilemap.
  • Intersect: mantém só a área de sobreposição.
  • Difference: subtrai a forma.
  • Flip: mantém só as áreas cobertas por exatamente uma forma.

Tutoriais anteriores ao Unity 6 falam de uma caixa Used By Composite. O equivalente no 6.3 é o Composite Operation em Merge.

Com o Composite ativo, Material, Is Trigger e Used By Effector valem os do Composite Collider 2D, não os do Tilemap Collider 2D. Configure no Composite.

Outlines vs Polygons: quando usar cada

O campo Geometry Type do Composite Collider 2D tem duas opções:

  • Outlines: contorno oco, igual a um Edge Collider 2D. Só a borda colide.
  • Polygons: formas sólidas, iguais a um Polygon Collider 2D.

Para chão e parede de plataforma, Outlines é a escolha estável e é a que uso por padrão. Polygons passa a valer quando você precisa saber se algo está dentro da área: um Physics2D.OverlapPoint para checar se dá para nascer um item ali, ou um objeto que pode aparecer sobreposto à parede e precisa ser empurrado para fora. Com Outlines, o interior é vazio para a física, e um objeto que nasce dentro da parede fica preso lá dentro.

Outras propriedades úteis:

  • Generation Type: Synchronous (regenera ao mudar) ou Manual (só quando você pede pelo botão Regenerate Geometry ou por CompositeCollider2D.GenerateGeometry).
  • Offset Distance: junta vértices próximos ao compor. A documentação recomenda não passar de 1% do tamanho do sprite.
  • Edge Radius: arredonda as quinas, útil para o personagem não enganchar em degraus de um tile.

Personagem preso na parede: Physics Material 2D sem atrito

Mesmo com o Composite, existe um segundo "preso" clássico: o personagem pula, encosta na parede segurando a direção e fica grudado no ar. Isso não é bug do Tilemap, é atrito. Enquanto o script empurra o jogador contra a parede, o atrito entre os dois colliders segura a queda.

  1. Create > 2D > Physics Material 2D. Nomeie NoFriction. Friction: 0, Bounciness: 0.
  2. Arraste para o campo Material do collider do personagem.

A desaceleração no chão passa a ser responsabilidade do seu script, que é como deve ser num jogo de plataforma. Movimento de plataforma bom é controlado por código, não por atrito. O post sobre movimento de personagem de plataforma 2D aprofunda aceleração, desaceleração e coyote time.

No Rigidbody2D do personagem, duas configurações completam o quadro: Collision Detection: Continuous (evita atravessar parede fina em alta velocidade) e Interpolate: Interpolate (movimento liso na tela). E use linearVelocity para mover; o nome antigo velocity não é o do Unity 6.

Colisão é uma das partes em que tudo parece certo isolado e quebra quando o jogo cresce: o pulo funciona na fase de teste, mas na fase real o personagem prende num degrau, atravessa uma plataforma que se move ou cai no vão entre dois tiles. Montar movimento, colisão e level design juntos, num jogo completo, é exatamente o que o curso de Unity faz com você.

Curso de Unity
Quer fazer seu primeiro jogo na Unity?

No curso de Unity 6 da CursoGame.Dev você vai do zero ao primeiro jogo, com um desafio prático em cada level e suporte individual no WhatsApp quando travar.

Conhecer o curso de Unity
Suporte no WhatsAppAcesso vitalícioGarantia de 7 dias

Plataformas one-way com Platform Effector 2D

Plataforma que o jogador atravessa pulando de baixo e na qual pousa por cima:

  1. Crie um Tilemap separado, OneWay, dentro do mesmo Grid. Pinte as plataformas finas nele.
  2. Add Component: Tilemap Collider 2D, Composite Collider 2D (Rigidbody2D em Static), Composite Operation Merge.
  3. Add Component: Platform Effector 2D. Deixe Use One Way ligado.
  4. No Composite Collider 2D, marque Used By Effector. É no Composite, não no Tilemap Collider 2D.
  5. Ajuste Surface Arc no effector se o personagem estiver prendendo na lateral da plataforma: o arco define em que ângulo a superfície é sólida, e o padrão de 180 graus trata o topo inteiro como chão.

Para descer da plataforma apertando para baixo e pulo, gire o effector por um instante.

Arquivo OneWayPlatformDrop.cs (coloque no personagem):

using System.Collections;
using UnityEngine;
using UnityEngine.InputSystem;

public class OneWayPlatformDrop : MonoBehaviour
{
    [SerializeField] private PlatformEffector2D oneWayEffector;
    [SerializeField] private float dropDuration = 0.3f;

    private bool isDropping;

    private void Update()
    {
        Keyboard keyboard = Keyboard.current;
        if (keyboard == null || isDropping)
        {
            return;
        }

        bool holdingDown = keyboard.sKey.isPressed || keyboard.downArrowKey.isPressed;
        if (holdingDown && keyboard.spaceKey.wasPressedThisFrame)
        {
            StartCoroutine(DropRoutine());
        }
    }

    private IEnumerator DropRoutine()
    {
        isDropping = true;
        oneWayEffector.rotationalOffset = 180f;

        yield return new WaitForSeconds(dropDuration);

        oneWayEffector.rotationalOffset = 0f;
        isDropping = false;
    }
}

Com rotationalOffset = 180, o lado sólido da plataforma passa a ser o de baixo, e o personagem cai através dela. Depois de 0,3 segundo volta ao normal. O exemplo lê o teclado direto pelo Input System para ficar curto; num projeto real, ligue isso às mesmas Input Actions do pulo, para funcionar com controle também. Se o seu script de pulo também escuta Espaço, faça ele ignorar o pulo quando o jogador está segurando para baixo em cima de uma plataforma one-way.

Erros comuns: colisão sumindo, flickering, tile sem forma

O chão cai quando dou Play. O Rigidbody2D que veio com o Composite está Dynamic. Troque para Static.

Os contornos não se juntam. Composite Operation do Tilemap Collider 2D está em None. Troque para Merge.

Colisão sumiu depois de adicionar o Composite. Geometry Type em Outlines e o personagem nasceu dentro da parede, ou o collider ficou com Is Trigger marcado no Composite. Confira as propriedades no Composite, não no Tilemap Collider.

Personagem tremendo ou piscando encostado no chão. Geralmente é movimento por transform.position brigando com a física. Mova pelo Rigidbody2D (linearVelocity ou MovePosition) e ligue Interpolate.

Tile decorativo colidindo. Está no Tilemap de chão. Mova para o Tilemap de decoração, ou selecione o asset do Tile e troque Collider Type para None.

Tile com forma errada (rampa vira quadrado). O Collider Type do Tile está em Grid. Troque para Sprite para usar a forma física do sprite, e ajuste a forma no Sprite Editor, módulo Custom Physics Shape.

Pintei tiles por script e a colisão não atualizou na hora. O Tilemap Collider 2D processa mudanças em lote no LateUpdate. Se precisa da colisão no mesmo frame, chame ProcessTilemapChanges() no Tilemap Collider 2D.

Próximo passo

Monte uma fase de teste com chão longo, uma parede alta, uma rampa e duas plataformas one-way. Corra de ponta a ponta, pule na parede segurando a direção e desça das plataformas. Se tudo passa liso, a base de colisão está pronta para receber inimigos e itens.

Se você também usa Godot, o post sobre física de jogos na Godot mostra como a outra engine lida com corpos estáticos, cinemáticos e dinâmicos, e a comparação deixa mais claro por que o chão precisa ser Static aqui.

Perguntas frequentes

Por que meu personagem engasga andando sobre o Tilemap?

Sem Composite Collider 2D, cada tile tem o próprio collider, e a física detecta a quina entre dois tiles vizinhos como um degrau minúsculo. Com o Composite Collider 2D e o Composite Operation em Merge no Tilemap Collider 2D, as formas viram um contorno contínuo e a quina some.

Onde foi parar o Used By Composite no Unity 6?

No Unity 6 o Collider2D usa o campo Composite Operation. Em None, o collider não participa do Composite. Em Merge, ele se junta aos outros, que é o equivalente ao antigo Used By Composite marcado. Também existem Intersect, Difference e Flip para combinações mais avançadas.

Composite Collider 2D: Outlines ou Polygons?

Outlines gera só o contorno oco, como um Edge Collider 2D, e é o mais estável para chão e parede de plataforma. Polygons gera formas sólidas, necessárias quando você precisa detectar se algo está dentro da área, como OverlapPoint ou objetos que podem nascer dentro da parede.

Por que meu personagem gruda na parede ao pular?

É atrito. Enquanto o jogador empurra contra a parede no ar, o atrito impede a queda. Coloque um Physics Material 2D com Friction 0 no collider do personagem e trate a desaceleração no script de movimento.