Você é um agente de desenvolvimento trabalhando no meu projeto Unity. Quero adicionar um **Modo Melhorado**: uma camada de melhorias de ambientação gráfica, sensação de combate (game feel), jogabilidade e fluidez que liga e desliga com uma tecla, sem mudar as regras do jogo. Este pedido vem de um conjunto de melhorias aplicado e medido num jogo 2D top-down em pixel art (Unity 6, URP com 2D Renderer). Meu jogo pode ser diferente: outro gênero, 3D, outra perspectiva, outro pipeline de render. Trate a lista abaixo como um cardápio de recursos da Unity. Adapte cada item ao meu jogo, troque pelo equivalente quando a técnica for de outro tipo de jogo e descarte o que não fizer sentido. As armadilhas descritas aconteceram de verdade; evite repeti-las. Referência de custo: no jogo de referência (RTX 4060, 1080p), o pacote completo levou o jogo de ~950 para ~510 FPS, cerca de 1 ms a mais por quadro. Use só como ordem de grandeza. ## 1. Regras de trabalho 1. **Ponto de volta antes de tudo.** Antes de alterar qualquer coisa, faça um commit ou branch no git. Se o projeto não usa git, me peça para fazer uma cópia. 2. **Não mude as regras do jogo** (dano, vida, velocidade, IA, economia) sem me perguntar. O foco é visual, som, sensação e fluidez. 3. **Tudo atrás de um interruptor.** Cada melhoria fica dentro do Modo Melhorado, ligado por tecla (ex.: F8) e por argumento de linha de comando (ex.: `-enhanced`). Com o modo desligado, o jogo precisa ficar exatamente como era: é a referência para comparar antes e depois. 4. **Código separado.** Coloque as melhorias numa pasta própria (ex.: `Scripts/Enhanced/`), um arquivo por área, ligados por um gerenciador. Nos sistemas existentes, adicione só ganchos (eventos), sem reescrevê-los. 5. **Pergunte antes de:** trocar render pipeline ou espaço de cor, instalar pacotes, baixar ou comprar assets, mudar configurações globais do projeto. Use só assets gratuitos com licença clara (ex.: CC0 da Kenney) e guarde o arquivo de licença junto. 6. **Teste na build**, não só no editor. Shaders, variantes de shader e física se comportam diferente no executável. 7. **Meça** o desempenho antes e depois de cada bloco de melhorias. ## 2. Diagnóstico (sua primeira resposta, sem alterar nada) Leia o projeto e me diga: 1. Versão da Unity, render pipeline (URP com 2D Renderer, URP 3D, HDRP ou Built-in) e espaço de cor (Gamma ou Linear). 2. 2D ou 3D, perspectiva (top-down, lateral, isométrica, primeira ou terceira pessoa) e estilo de arte (pixel art, pintado, low poly...). 3. Como as fases são montadas: cenas, prefabs, tilemaps, dados/JSON ou geração por código. 4. Câmera (Cinemachine? Pixel Perfect?), entrada (Input Manager antigo ou Input System), física e movimento do personagem, áudio e pós-processamento existentes. 5. Desempenho atual numa build: FPS médio, 1% low e pior quadro num trajeto fixo. Em seguida, proponha um plano: quais itens do cardápio se aplicam, como ficam no meu jogo, o custo estimado e a ordem. Espere minha aprovação antes de implementar. ## 3. Estrutura do Modo Melhorado - Um gerenciador (ex.: `EnhancedMode`) com `SetActive(bool)` que liga e desliga cada módulo: luz, sombras, distorção, clima, efeitos de combate, áudio, câmera e números de dano. - Ganchos por eventos estáticos nos sistemas do jogo: projétil criado, impacto, inimigo criado, ataque iniciado, inimigo morto, dano recebido, nível subiu. - Flags de diagnóstico por módulo (ex.: `-enhancedNoShadows`) para medir o custo de cada parte isolada. - Um aviso curto na tela ao ligar e desligar (ajuda em vídeo). - Ao desligar, cada módulo restaura exatamente os valores originais (guarde-os ao ligar). ## 4. Cardápio de melhorias ### 4.1 Luz com relevo (normal maps) - **2D (URP 2D):** gere normal maps a partir dos próprios sprites num script de editor. Use altura = luminância × alfa, suavize uns 2 px, aplique o filtro Sobel e limite a inclinação. Ligue como Secondary Texture `_NormalMap` e use luzes 2D com *Normal Map Quality = Accurate*. A luz das tochas passa a revelar o relevo de pedras, paredes e personagens. - **3D:** normal maps e height maps nos materiais, oclusão de ambiente, light probes. - **Armadilhas:** - um shader de sprite próprio sem o passe `NormalsRendering` fica preto quando a luz usa normal map; - em atlas e tilesets, o filtro não pode ler o tile vizinho: prenda a amostragem dentro de cada célula; - normal map tira luz da cena (fator N·L): compense a intensidade e compare a luminância média com a do modo desligado; - inclinação forte demais vira granulado e escurece tudo. ### 4.2 Sombras - **2D:** Shadow Caster 2D. - Personagens animados: uma forma simples, como um oval do tamanho do corpo. - Objetos parados (árvores, casas, móveis): um caster por objeto, com o contorno convexo dos pixels opacos, calculado uma vez. - **3D:** sombras das luzes locais, com distância e cascatas ajustadas ao tamanho da cena. - **Armadilhas:** - um caster por tile ou célula custou ~1,3 ms por quadro só para atualizar os componentes; - uma luz dentro de um caster fica presa (luz que acompanha o personagem, velas em cima de mesa): tire a sombra dessa luz ou não ponha caster nesse objeto; - criado por código, o Shadow Caster 2D só detecta o SpriteRenderer sozinho no editor; na build é preciso configurar a forma; - silhueta exata por quadro de animação exige textura legível pela CPU e travou ~2 s numa troca de personagem. ### 4.3 Atmosfera - **Feixes de luz:** luz 2D *Freeform* ou *Sprite* com intensidade volumétrica (janelas, frestas). Em 3D: neblina volumétrica ou cones aditivos. - **Distorção:** ar tremendo sobre fogo, onda de choque em explosões, ondulação de água. Em 2D: *Camera Sorting Layer Texture* do Renderer 2D e um shader numa camada de ordenação posterior. Em URP 3D: *Opaque Texture*. - **Clima:** - chuva: partículas esticadas, um sub-emissor de respingo quando cada gota termina e ondulações iluminadas nas poças; - relâmpago: um pulso curto na luz global e o trovão 1–2,5 s depois; - brasas sobre fogueiras, poeira iluminada perto das tochas e folhas. - **Água viva:** brilhos e cristas animadas em coordenadas de mundo (em pixel art, alinhados a blocos de pixels). - **Marcas no chão:** sangue, queimado, flechas cravadas. Use um pool com limite e faça as marcas sumirem depois de 20–30 s. - **Leitura da cena:** telhados e copas ficam transparentes quando o jogador passa atrás (top-down e isométrico). Em 3D: silhueta do personagem atrás de paredes. - **Cor:** bloom com limiar alto, split toning e white balance sutis. - **Armadilhas:** - contraste no pós-processo de uma cena escura deixou tudo ~30% mais escuro: prefira exposição levemente positiva com bloom e meça a luminância; - a HUD precisa ficar numa camada acima da distorção; - ligue a cópia de tela só no Modo Melhorado; - partículas que seguem a câmera precisam crescer com o campo de visão (em tela cheia, a área visível pode ser 4× maior); - clarões de tela inteira (impact frame, relâmpago) precisam de uma opção para desligar, por causa de pessoas fotossensíveis. ### 4.4 Sensação de combate - Rastro em projéteis (Trail Renderer aditivo) e arco de corte nos golpes corpo a corpo. - Faíscas e sangue saindo na direção do golpe; clarão de luz e partículas subindo na morte. - Hitstop, tremor de câmera (Cinemachine Impulse), pulso de aberração cromática e distorção de lente no impacto, vinheta avermelhada ao tomar dano. - Impact frame (1–3 quadros em negativo de alto contraste) no golpe final e câmera lenta curta na última morte da área ou em chefes. - Números de dano com TextMesh Pro: contorno, gradiente e um "salto" maior no crítico. - Vibração do controle proporcional ao golpe. - **Armadilhas:** - câmera lenta frequente parece travamento: reserve para momentos especiais; - o TextMesh Pro precisa dos *Essential Resources* importados e do shader incluído na build. ### 4.5 Áudio - Sons gratuitos CC0 (ex.: Kenney *Impact Sounds*, *RPG Audio*, *Interface Sounds*), com variação de altura e volume, panorama pela posição na tela e limite de vozes simultâneas. - **Ambiente e passos:** - passos por tipo de chão, contados pela distância percorrida; - reverb por área (caverna × rua); - o fundo abaixa nos golpes fortes; - música por área com transição suave e sons de interface. - Se faltar som de chuva, dá para sintetizar: ruído rosa com gotas. - **Armadilha:** música longa em *Streaming*, não em *Decompress On Load*. ### 4.6 Câmera - **Cinemachine com Position Composer:** - zona morta, amortecimento e lookahead; - um leve deslocamento para onde o jogador mira; - o jogador enquadrado junto com o chefe; - Impulse para os tremores. - **Armadilhas:** - com Pixel Perfect Camera, a lente da câmera virtual precisa acompanhar o campo de visão atual, senão a tela cheia fica com zoom 2×; - em teleporte, avise o Cinemachine (`OnTargetObjectWarped`), senão a câmera atravessa o mapa. ### 4.7 Controles - Input System no modo *Both*, para não quebrar o código antigo. Suporte completo a controle (um analógico move, o outro mira, os gatilhos atacam) e vibração. - Buffer de comandos só se existir uma consulta "posso agir agora?" sem efeito colateral. Sem isso, cada tentativa recusada gera mensagem de erro na tela. ### 4.8 Colisão e movimento (confira mesmo fora do Modo Melhorado) - **Teste:** encoste o personagem na diagonal em centenas de faces de parede do mapa e meça quanto ele desliza. Faça também o teste da multidão (inimigos cercando o jogador) e um teleporte andando. - **Armadilha 2D:** `Rigidbody2D.Slide` com configuração de jogo de plataforma (`surfaceUp`, `surfaceSlideAngle`) trava em paredes num jogo top-down. Ele também não desencaixa corpos sobrepostos: inimigos invocados no mesmo ponto ficam presos. A solução foi um movimento próprio no estilo `move_and_slide`, em três passos: 1. desencaixar o corpo de qualquer sobreposição; 2. fazer um BoxCast ou CapsuleCast até o contato, com margem maior que o contact offset; 3. deslizar o restante ao longo da superfície, até 4 vezes. - **3D:** `CharacterController`, ou cast + `Physics.ComputePenetration`. - **Depuração:** uma tecla (ex.: F4) que desenha as caixas de colisão, com cor diferente para corpos sobrepostos. ### 4.9 Fluidez e build - **IL2CPP:** precisa do módulo no Unity Hub e do Visual C++. Use uma pasta de build separada da build Mono. - **Pré-aquecimento de shaders** (`GraphicsStateCollection`, PSO tracing): grave o trace numa build de **desenvolvimento**, salve em `StreamingAssets` e aqueça no carregamento. No jogo de referência, o engasgo inicial caiu de ~380 ms para ~110 ms. - **Armadilhas do URP:** - luzes ou Volumes criados por código, junto com a remoção automática de variantes, deixam a build rosa (magenta) ou escura: desligue *Strip 2D Unused Variants* e *Strip Unused Post Processing*, mas não o strip geral, que faz a build compilar por horas; - um shader usado só por código precisa estar num material referenciado (ex.: em `Resources`) ou em *Always Included*, senão `Shader.Find` devolve nulo na build; - `AssetDatabase.ImportPackage` em modo batch é assíncrono: o editor pode fechar antes de terminar. ## 5. Medição e testes (obrigatório) - **Benchmark:** trajeto fixo (ex.: 30 s, sempre o mesmo caminho), com VSync desligado. - Meça FPS médio, 1% low e pior quadro, nos dois modos, em janela e em tela cheia. - Rode mais de uma vez: a variação entre rodadas pode passar de 10%. - **Capturas A/B:** nos mesmos pontos do mapa, uma foto com o modo desligado e outra com ele ligado. - **Efeitos rápidos:** fotografe por evento (no instante do impacto), não por tempo fixo. Não faça uma transição de estado (teleporte, troca de personagem) no mesmo quadro da captura. - **Regressão:** confirme que o modo desligado continua idêntico ao original. - **Custo por módulo:** meça cada parte com as flags de diagnóstico e otimize o que pesar mais. ## 6. Entrega - Um documento curto com: - o que foi aplicado; - como ligar (teclas e flags); - o custo em FPS de cada parte; - o que ficou de fora e por quê; - as licenças dos assets usados. - Builds testadas com o modo desligado e com ele ligado.