Sorting Layer e Order in Layer: Quem Fica na Frente no 2D

Unity Sorting Layer na prática: Sorting Layer, Order in Layer, distância, Sorting Group para personagem em partes e Transparency Sort Axis (0,1,0) no top-down.
Sorting Layer e Order in Layer: Quem Fica na Frente no 2D
Na Unity, quem fica na frente num jogo 2D é decidido nesta ordem: primeiro a Sorting Layer (o grupo, desenhado na ordem da lista), depois o Order in Layer (número dentro do grupo, menor fica atrás) e, quando os dois empatam, a distância calculada pelo Transparency Sort Mode. Entender essa cadeia resolve quase todo "sprite aparecendo na frente do que não devia", e o resto se resolve com Sorting Group e com o Transparency Sort Axis em jogos top-down.
Aqui você monta as camadas de um jogo 2D no Unity 6.3 LTS com URP, troca ordem por script, agrupa um personagem feito de várias partes e configura o top-down em que o pé define a profundidade.
Como a Unity decide a ordem de desenho no 2D
A documentação do Unity 6.3 descreve os critérios de ordenação para renderers 2D (Sprite Renderer, Tilemap Renderer, partículas):
- Sorting Layer: as camadas são desenhadas na ordem da lista. A primeira da lista fica atrás de todas.
- Order in Layer: dentro da mesma Sorting Layer, valores menores são desenhados antes, ou seja, ficam atrás.
- Render queue do material: materiais 2D usam 3000 por padrão. Raramente você mexe nisso.
- Distância até a câmera: quando tudo acima empata, a Unity usa a distância, calculada conforme o Transparency Sort Mode.
O Sorting Group entra por cima dessa lista: ele faz um conjunto de renderers ser ordenado como uma unidade.
A regra prática para memorizar: Layer decide o grupo, Order decide dentro do grupo, distância desempata. Quando dois sprites "brigam" e piscam, é porque empataram em tudo e a distância está praticamente igual.
Sorting Layer na Unity: criar e organizar camadas
- Edit > Project Settings > Tags and Layers, seção Sorting Layers.
- Clique no + para criar e arraste para reordenar. Novas camadas entram no fim da lista, e a ordem da lista é a ordem de desenho: de cima (atrás) para baixo (na frente).
Uma estrutura que funciona para a maioria dos jogos 2D:
Background: céu, montanhas, parallax.Environment: Tilemap de chão e paredes, objetos de cenário.Characters: jogador, inimigos, NPCs, itens no chão.Effects: partículas, projéteis, números de dano.Foreground: folhagem e elementos que passam na frente de tudo.
Não crie uma Sorting Layer para cada coisa. Camada demais vira um quebra-cabeça de ordem que ninguém lembra. Use poucas camadas largas e o Order in Layer para os detalhes.
Sorting Layer não tem nada a ver com a Layer do GameObject (aquela usada por física e câmera). São dois sistemas separados com nomes parecidos.
Order in Layer e quando mudar por script
O Order in Layer é um número inteiro, positivo ou negativo. Dentro da camada Environment, o chão pode ser 0, a decoração do chão 1, a parede 2.
Mudar por script faz sentido quando a relação de profundidade muda durante o jogo. Exemplo clássico de top-down: uma ponte. Embaixo dela, o jogador deve ficar atrás; em cima, na frente. Dois triggers nas entradas da ponte trocam a camada do personagem.
Arquivo SortingLayerSwitcher.cs (no jogador):
using UnityEngine;
using UnityEngine.Rendering;
public class SortingLayerSwitcher : MonoBehaviour
{
[SerializeField] private SortingGroup characterGroup;
[SerializeField] private string groundLayerName = "Characters";
[SerializeField] private string bridgeLayerName = "Foreground";
[SerializeField] private string enterBridgeTag = "BridgeEnter";
[SerializeField] private string exitBridgeTag = "BridgeExit";
private void Awake()
{
if (characterGroup == null)
{
characterGroup = GetComponent<SortingGroup>();
}
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag(enterBridgeTag))
{
SetLayer(bridgeLayerName, 10);
}
else if (other.CompareTag(exitBridgeTag))
{
SetLayer(groundLayerName, 0);
}
}
private void SetLayer(string layerName, int order)
{
characterGroup.sortingLayerName = layerName;
characterGroup.sortingOrder = order;
}
}
O script muda o Sorting Group do personagem, não cada Sprite Renderer: arma, sombra e cabelo vão juntos. Num sprite único, as propriedades equivalentes são SpriteRenderer.sortingLayerName e SpriteRenderer.sortingOrder. Crie as tags BridgeEnter e BridgeExit e marque os colliders das entradas como Is Trigger. A física da ponte (colisão das bordas) é outro assunto e muda junto, normalmente trocando quais colliders estão ativos.
Sorting Group para personagem em partes
Personagem feito de partes (corpo, cabeça, braço, arma) ou personagem com sombra separada tem um problema: cada Sprite Renderer é ordenado sozinho contra a cena inteira. A arma do inimigo A aparece entre o corpo e o braço do inimigo B quando eles se cruzam.
- Selecione o objeto raiz do personagem.
- Add Component > Sorting Group.
- Defina a Sorting Layer e o Order in Layer no Sorting Group.
- Nos filhos, o Order in Layer passa a valer só dentro do grupo: sombra -1, corpo 0, cabeça 1, arma 2.
Agora cada personagem é ordenado como um bloco contra os outros, e as partes ficam na ordem certa entre si. Em top-down, o Sorting Group usa a posição do objeto raiz para calcular a distância, então deixe o raiz nos pés.
Top-down: Transparency Sort Axis e pivot no pé
Em jogo top-down, a profundidade é a posição vertical na tela: quem está mais em cima está mais longe, e deve ficar atrás. O personagem passa atrás da árvore quando está acima da base dela e na frente quando está abaixo.
Configurar no URP (2D Renderer):
- Selecione o asset do Renderer 2D usado pelo URP Asset.
- Transparency Sort Mode: Custom Axis.
- Transparency Sort Axis: (0, 1, 0). É o valor que a documentação indica para top-down, e é o mesmo que ela indica para Tilemap isométrico.
Na Built-In Render Pipeline, o mesmo campo fica em Project Settings > Graphics. Com URP e 2D Renderer, a configuração que vale é a do asset do Renderer 2D. Tutorial antigo mandando ir em Graphics é o motivo número um de "configurei e nada mudou".
Pivot no pé. A distância é calculada a partir do pivot. Se o pivot do personagem está no centro e o da árvore também, o personagem fica "atrás" da árvore quando a cabeça dele passa da metade do tronco, o que parece errado. Pivot nos pés do personagem e na base do tronco da árvore: a troca acontece exatamente onde o pé cruza a raiz. O post sobre o Sprite Editor na Unity mostra como acertar o pivot no fatiamento.
Mesma camada, mesma ordem. Para a ordenação por eixo funcionar, personagem e árvore precisam estar na mesma Sorting Layer e no mesmo Order in Layer. Se a árvore estiver numa camada acima, ela sempre fica na frente, e o eixo nem é consultado.
Tilemap de objetos altos. Se as árvores estão pintadas num Tilemap, o Tilemap Renderer em modo Chunk ordena o Tilemap inteiro como um bloco. Troque Mode para Individual, para cada tile ser ordenado pela própria posição.
Ordem de desenho é uma daquelas coisas que funcionam na cena de teste e desmontam quando o jogo cresce: entra inimigo com arma, partícula de golpe, ponte, Tilemap de árvores, e cada sistema puxa para um lado. Organizar um jogo 2D inteiro de forma que essas peças convivam é o tipo de estrutura que o curso de Unity monta com você em projeto completo.
Partículas, UI e Tilemap na mesma ordem
Todo renderer 2D entra no mesmo sistema de Sorting Layer:
- Tilemap Renderer: tem Sorting Layer e Order in Layer próprios. Chão em
Environment0, decoração emEnvironment1. - Particle System: no módulo Renderer, campos Sorting Layer e Order in Layer. Faísca de golpe em
Effects. Partícula que deve se misturar com personagens em top-down vai na mesma camada deles. - UI: um Canvas em Screen Space - Overlay é desenhado por cima de tudo, fora desse sistema. Canvas em Screen Space - Camera ou World Space tem Sorting Layer e Order in Layer no componente Canvas. Barra de vida sobre o inimigo, em World Space, vai em
EffectsouForeground. - Luz 2D: cada Light 2D tem Target Sorting Layers. Se você cria uma Sorting Layer nova, confira se as luzes estão incluindo ela, ou os sprites dessa camada ficam escuros.
Erros comuns: sprite piscando atrás/na frente
Dois sprites piscando, um hora na frente, hora atrás. Empate total: mesma Sorting Layer, mesmo Order e distância praticamente igual. Dê Order diferente ou mova um deles levemente no eixo de ordenação.
Personagem passa na frente da árvore mesmo estando atrás. Pivots no centro, camadas diferentes, ou Transparency Sort Axis configurado no lugar errado (Graphics em vez do Renderer 2D).
Partes do personagem se misturando com outro personagem. Falta Sorting Group no raiz.
Árvores do Tilemap sempre na frente ou sempre atrás. Tilemap Renderer em modo Chunk. Troque para Individual.
Mudei o Order por script e nada aconteceu. O objeto tem Sorting Group no pai: o grupo manda. Mude no Sorting Group.
Partícula some atrás do cenário. Sorting Layer padrão (Default) abaixo das outras. Coloque em Effects.
Próximo passo
Monte uma cena top-down com um Tilemap de chão, três árvores com pivot na base, um personagem com sombra e arma em Sorting Group, e ande em volta das árvores. Quando a troca de profundidade acontecer exatamente no pé, a configuração está certa.
Se você também usa Godot, o post sobre Y-Sort e profundidade 2D na Godot resolve o mesmo problema com outro nome, e o de jogo isométrico com TileMap na Godot mostra o caso isométrico, que na Unity também usa o eixo (0, 1, 0).
Perguntas frequentes
Qual a diferença entre Sorting Layer e Order in Layer na Unity?
Sorting Layer é o grupo grande (Fundo, Cenário, Personagens, Frente), desenhado na ordem da lista em Tags and Layers. Order in Layer é a posição dentro do grupo: número menor fica atrás. A Unity só olha o Order in Layer quando dois sprites estão na mesma Sorting Layer.
Como fazer o personagem passar atrás de árvores num jogo top-down?
Coloque personagem e árvores na mesma Sorting Layer e Order in Layer, ponha o pivot dos dois na base (pés e tronco) e configure Transparency Sort Mode como Custom Axis com Transparency Sort Axis (0, 1, 0). Quem está mais acima na tela fica atrás.
Onde fica o Transparency Sort Axis no URP?
Com o URP e o 2D Renderer, a configuração fica no asset do Renderer 2D, não em Project Settings > Graphics. Na Built-In Render Pipeline, ela fica em Graphics. Por isso tutoriais antigos mandam procurar num lugar onde o campo não aparece mais no seu projeto.
Por que as partes do meu personagem se misturam com outros sprites?
Cada parte é ordenada sozinha. Adicione um Sorting Group no objeto raiz do personagem: as partes passam a ser ordenadas entre si dentro do grupo, e o grupo inteiro é ordenado como uma coisa só contra o resto da cena.


