Public vs [SerializeField]: Qual a diferença e quando usar?
Você programou o pulo do seu personagem. Definiu a força como 10. Deu o Play. O pulo foi fraco. Você volta no código, muda para 20. Salva. Espera a rodinha da Unity girar. Dá o Play. O pulo foi forte demais, o boneco foi pra lua. Você volta no código…
Pare. Sério, pare agora.
Se você está “hardcodando” (escrevendo fixo no código) valores que precisam de ajuste, você está programando como se estivesse nos anos 80. A Unity tem uma janela linda chamada Inspector feita exatamente para evitar isso.
Mas existe um jeito certo e um jeito “perigoso” de fazer isso. Vamos entender a briga entre public e [SerializeField].
1. A Tentação do “Public”
A primeira coisa que todo tutorial ensina é: “Coloque a variável como pública para ver no editor”.
public float velocidade = 10f;
Funciona? Funciona. A variável velocidade aparece no Inspector e você pode mudar o número arrastando o mouse. Mágico.
O Problema: Em programação, public significa “Qualquer um pode mexer”. Se você deixar a velocidade pública, um script de Inimigo, de Menu ou de Placar pode, acidentalmente, acessar e mudar a velocidade do seu jogador.
Imagine que sua casa tem paredes de vidro (Inspector). Você quer que quem está fora veja os móveis, mas não quer que qualquer estranho entre e mude o sofá de lugar. Usar public é deixar a porta da frente destrancada.
2. O Herói Discreto: [SerializeField]
Para manter seu código seguro e profissional, a variável deve ser private (só esse script mexe nela). Mas variáveis privadas não aparecem no Inspector… a não ser que a gente force.
É aqui que entra o atributo mágico: [SerializeField].
[SerializeField] private float velocidade = 10f;
O que isso faz?
- No Código: A variável continua
private. Ninguém de fora pode bagunçar ela. Segurança garantida. - Na Unity: A Unity “serializa” (lê) a variável e mostra no Inspector.
É o melhor dos dois mundos. Você tem a segurança do código fechado e a flexibilidade da interface visual.
3. O Poder do “Game Design” em Tempo Real
Agora que sua variável está no Inspector com [SerializeField], acontece a mágica da produtividade.
Dê o Play no jogo. Enquanto o boneco corre, vá no Inspector e mude o valor da velocidade. O boneco acelera e desacelera na hora. Sem pausar, sem recompilar.
Você pode testar 50 velocidades diferentes em 1 minuto. Isso é o que diferencia um jogo “duro” de um jogo “gostoso de jogar”. Você ajusta o feeling na unha.
⚠️ Aviso Importante: Alterações feitas no Inspector durante o Play Mode são resetadas quando você dá Stop. Isso é ótimo para testes (se você quebrar o jogo, ele volta ao normal), mas lembre-se de copiar o valor ideal antes de parar o jogo (Botão direito no componente > Copy Component), e depois colar quando o jogo estiver parado (Paste Component Values).
Conclusão
Pare de ter medo de variáveis privadas e pare de usar public por preguiça. Use [SerializeField] private.
Seu “eu do futuro” vai agradecer quando o projeto crescer e os scripts não estiverem todos bagunçados um interferindo no outro. E o seu jogo vai ficar muito mais polido porque você testou os valores em tempo real.
Agora que seu jogo está ajustado, falta só um detalhe técnico. Sabe quando o jogo roda liso no seu PC gamer, mas parece câmera lenta no notebook do seu amigo? Vamos resolver isso no próximo e último post sobre Time.deltaTime.


![Código C# na Unity usando [SerializeField] para expor variáveis privadas no Inspector.](https://perai.dev/wp-content/uploads/2025/11/unity-serializefield-vs-public-inspector-tutorial-1.png)


