Voltar para o Blog
Quest Log

Material Rosa na Unity: Por Que Fica Pink e Como Corrigir

Cena de jogo 3D com vários objetos em magenta chapado e uma lupa revelando a textura original em um deles

Unity materials are pink? Diagnóstico em 5 minutos: shader de outro pipeline, asset da Built-In, pipeline asset ausente, shader com erro ou stripping na build.

Ferramenta:Unity

Material Rosa na Unity: Por Que Fica Pink e Como Corrigir

Quando Unity materials are pink, a engine está dizendo que não consegue desenhar aquele material com o shader que ele usa. As quatro causas são: shader feito para outro render pipeline, asset da Asset Store feito para a Built-In, Render Pipeline Asset não atribuído e shader com erro de compilação. Se acontece só na build, é uma quinta: o shader foi removido no stripping. Este guia mostra como descobrir qual é em menos de 5 minutos e a correção de cada uma, no Unity 6.3 LTS.

Antes de tudo: se a cor é ciano (azul claro) e some depois de alguns segundos, não é erro. O editor mostra ciano enquanto compila um shader em segundo plano. O problema é o magenta que fica.

Por que o material fica rosa na Unity

A Unity tem um shader de erro interno. Quando um material não pode ser renderizado (o shader não existe, não compila ou não é compatível com o pipeline ativo), ela troca pelo shader de erro, que pinta tudo de magenta chapado. É de propósito: a cor é feia o bastante para ninguém deixar passar.

O diagnóstico rápido, nesta ordem:

  1. Selecione o material rosa e olhe o campo Shader no topo do Inspector.
  2. Se o nome é Standard, Legacy Shaders/..., Mobile/... ou Particles/Standard..., é shader da Built-In num projeto URP: causas 1 e 2.
  3. Se o nome é Hidden/InternalErrorShader, o shader original sumiu ou quebrou: causa 4, ou um pacote que foi removido.
  4. Se o shader é do URP (Universal Render Pipeline/Lit, por exemplo) e mesmo assim tudo está rosa, inclusive objetos novos: causa 3.
  5. Se no editor está certo e na build fica rosa: última seção.

Causa 1: shader de outro render pipeline

Cada render pipeline tem seus shaders. O Standard da Built-In não funciona no URP, e o Universal Render Pipeline/Lit do URP não funciona na Built-In. O mesmo vale para o HDRP. Num projeto URP, todo material com shader da Built-In aparece rosa.

Isso acontece quando você:

  • Segue um tutorial antigo, feito na Built-In, e cria material com o shader que ele mostra.
  • Copia materiais de outro projeto.
  • Importa modelo 3D (FBX) com materiais embutidos gerados para a Built-In em versões antigas.

A correção para um material: selecione, clique no campo Shader e escolha Universal Render Pipeline > Lit (ou Simple Lit, Unlit, conforme o caso). Arraste de novo a textura para Base Map se ela não vier junto.

Para muitos materiais, não faça na mão: use o conversor, na seção mais abaixo.

Causa 2: asset da Asset Store feito para Built-In

É o caso mais comum de quem pega pacote gratuito. Muitos assets antigos, inclusive os bons, foram feitos para a Built-In, e os materiais vêm com Standard ou com shaders próprios do autor.

O roteiro:

  1. Leia a página do asset. Veja as versões da Unity e os render pipelines suportados. Muitos trazem um .unitypackage extra para URP dentro da pasta, com nome como URP_Support ou URP Materials. Importe esse pacote.
  2. Se os materiais usam Standard, o Render Pipeline Converter resolve.
  3. Se usam shader próprio do autor (nome como AuthorName/Foliage), o conversor não mexe. Troque por um shader do URP ou refaça o efeito no Shader Graph.
  4. Se nada disso der certo, procure uma alternativa já compatível com URP. O post sobre onde encontrar assets gratuitos para jogos lista fontes confiáveis e o que conferir antes de baixar.

Vale criar o hábito de testar asset novo num projeto vazio de URP antes de importar no projeto principal. Dez minutos de teste evitam uma tarde limpando material quebrado.

Causa 3: Render Pipeline Asset não atribuído

Se tudo está rosa, inclusive cubos novos com o material padrão, o projeto provavelmente está sem pipeline ativo ou com pipeline errado.

  1. Abra Edit > Project Settings > Graphics. O campo Default Render Pipeline precisa ter um URP Asset.
  2. Abra Edit > Project Settings > Quality. Cada nível de qualidade tem um campo Render Pipeline Asset, que sobrescreve o padrão. Selecione cada nível e confira. Um nível vazio usa o padrão do Graphics; um nível apontando para outro asset muda o pipeline quando o jogo troca de qualidade.

Se o URP Asset não existe, crie no Project com Create > Rendering > URP Asset (with Universal Renderer) e atribua. Isso acontece muito quando alguém apaga a pasta Settings achando que era lixo, ou num projeto que foi criado em Built-In e teve o pacote do URP instalado sem configurar.

O sintoma invertido também existe: projeto Built-In (campo vazio) com materiais do URP, que vieram de um pacote ou de um tutorial novo. Aí a solução é decidir o pipeline do projeto, e não trocar material por material.

Esse tipo de problema, em que o projeto quebra visualmente por uma configuração escondida, é o que mais faz quem aprende sozinho perder dias. No curso de Unity o projeto nasce em URP configurado, e você entende o papel de cada asset de pipeline antes de precisar consertar um.

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

Causa 4: shader com erro de compilação

Se o shader é compatível com o pipeline e ainda assim o material está rosa, o shader não compila.

  1. Selecione o shader (não o material) no Project. O Inspector mostra os erros de compilação, com linha.
  2. Para Shader Graph, abra o grafo: o nó com problema fica com contorno vermelho, e passar o mouse mostra o erro. Uma causa comum é o grafo sem o target Universal em Graph Inspector > Graph Settings > Active Targets.
  3. Shader escrito à mão para a Built-In com surface shader (#pragma surface) não compila no URP. Precisa ser reescrito para o URP ou refeito no Shader Graph.

Também aparece rosa quando o shader depende de um arquivo .hlsl ou .cginc que foi apagado, ou de um pacote que foi removido. O Console mostra o erro de include com o caminho que falta.

Corrigindo em massa com o Converter

Para dezenas ou centenas de materiais com shaders padrão da Built-In, use o Render Pipeline Converter:

  1. Commit no Git antes. A conversão é irreversível.
  2. Window > Rendering > Render Pipeline Converter, escolha Built-In Render Pipeline to URP.
  3. Marque Material Upgrade e Read-only Material Converter.
  4. Initialize Converters, revise a lista, Convert Assets.

O Material Upgrade troca Standard e os shaders padrão pelos equivalentes do URP e copia cores e texturas. Ele não converte materiais com shader customizado. Para a migração completa de um projeto (post-processing, luzes, configurações), o passo a passo está no guia de como converter um projeto Built-In para URP.

Para achar o que sobrou rosa depois do conversor, este script de editor lista os materiais suspeitos. Ele precisa ficar numa pasta chamada Editor.

Arquivo Assets/Editor/PinkMaterialFinder.cs:

using UnityEditor;
using UnityEngine;

public static class PinkMaterialFinder
{
    private static readonly string[] BuiltInPrefixes =
    {
        "Standard", "Legacy Shaders/", "Mobile/", "Nature/", "Particles/Standard"
    };

    [MenuItem("Tools/Listar materiais incompatíveis")]
    private static void ListIncompatibleMaterials()
    {
        string[] guids = AssetDatabase.FindAssets("t:Material", new[] { "Assets" });
        int found = 0;

        foreach (string guid in guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            Material material = AssetDatabase.LoadAssetAtPath<Material>(path);
            if (material == null)
            {
                continue;
            }

            Shader shader = material.shader;
            if (IsSuspicious(shader))
            {
                string shaderName = shader != null ? shader.name : "(sem shader)";
                Debug.LogWarning($"{path} usa '{shaderName}'", material);
                found++;
            }
        }

        Debug.Log($"Materiais suspeitos encontrados: {found}");
    }

    private static bool IsSuspicious(Shader shader)
    {
        if (shader == null || shader.name == "Hidden/InternalErrorShader")
        {
            return true;
        }

        if (ShaderUtil.ShaderHasError(shader))
        {
            return true;
        }

        foreach (string prefix in BuiltInPrefixes)
        {
            if (shader.name.StartsWith(prefix))
            {
                return true;
            }
        }

        return false;
    }
}

Rode pelo menu Tools > Listar materiais incompatíveis. Cada aviso no Console, ao ser clicado, destaca o material no Project.

Rosa só na build: shader removido no stripping

No editor está tudo certo e, na build, um efeito aparece rosa. A causa clássica: a Unity só inclui na build os shaders usados por materiais que estão nas cenas da build ou em pastas Resources. Um shader carregado só por código, com Shader.Find("Custom/MeuEfeito"), não tem nenhum material apontando para ele, então fica de fora.

Correções:

  • Always Included Shaders. Em Edit > Project Settings > Graphics, adicione o shader à lista Always Included Shaders. Use com moderação: cada shader dessa lista vai para a build com todas as variantes, o que aumenta tamanho e tempo de build.
  • Referência por material. Em vez de Shader.Find, guarde um material num campo [SerializeField] de um componente da cena. O material puxa o shader para a build.

Existe um primo desse problema, o stripping de variantes. A Unity remove da build as variantes de shader que acha que não serão usadas (as opções da seção Shader stripping das Graphics settings, mais o que o URP Asset desliga). Se você liga uma keyword por código em tempo de jogo, como material.EnableKeyword("_EMISSION"), e nenhum material da build usava essa variante, o efeito some ou aparece errado. Deixe um material na build com a opção já ligada, ou registre as variantes numa Shader Variant Collection.

Por fim, confira a plataforma: um shader escrito sem suporte à API gráfica do alvo (OpenGL ES num Android antigo, WebGL) compila no editor do Windows e falha no aparelho.

Próximo passo

Da próxima vez que o magenta aparecer, abra o material e leia o nome do shader antes de qualquer outra coisa: ele aponta para a causa em segundos. Se o seu projeto ainda está na Built-In, considere a migração para URP com calma; o contexto do anúncio está no post sobre o Unity 6.5 e a Built-In descontinuada. E guarde o script de editor deste guia no seu projeto: ele vira o primeiro passo de toda importação de asset novo.

Perguntas frequentes

Por que o material fica rosa na Unity?

Rosa (magenta) é a cor que a Unity usa quando não consegue renderizar um material com o shader dele. As causas mais comuns são shader feito para outro render pipeline, como um shader da Built-In num projeto URP, render pipeline asset não atribuído e shader com erro de compilação.

Como corrigir textura rosa de asset da Asset Store?

Veja se o asset tem versão para URP e importe essa versão. Se os materiais usam o shader Standard, rode o Render Pipeline Converter (Window > Rendering > Render Pipeline Converter) com o Material Upgrade. Se o shader é próprio do asset, troque por um shader do URP ou refaça no Shader Graph.

Por que o material fica rosa só na build?

Geralmente o shader foi removido da build porque nenhum material incluído o referencia, por exemplo um shader carregado com Shader.Find. Coloque o shader em Always Included Shaders nas Graphics settings ou garanta que um material incluído na build o use.

Qual a diferença entre o objeto rosa e o objeto azul ciano no editor?

Ciano é temporário: o editor mostra essa cor enquanto compila o shader em segundo plano, e ela some sozinha. Magenta indica que o shader não pode ser usado e não some sem correção.