O Sistema de Diálogo de 10 Linhas que a Unity Já Tem (e Você Não Sabia)
Você quer que seu personagem fale. Você cria um Canvas, um Panel, um Text, e aí… você trava. Como você gerencia as frases? Como você troca o texto? Como você fecha a janela?
Você começa a procurar tutoriais e só encontra sistemas de quest, integração com Ink, ou vídeos de 45 minutos.
Esqueça isso. Vamos resolver o problema agora com um único script.
O “Hardware”: Preparando a UI
Antes do código, precisamos do visual. Isso é o básico do básico.
- Clique com o botão direito na Hierarquia > UI > Canvas.
- Dentro do Canvas, clique com o botão direito > UI > Panel. Vamos chamá-lo de
Painel_Dialogo. - Estilize esse painel. Geralmente, ele fica na parte de baixo da tela. No Inspector, clique no quadrado de Âncoras, segure Shift + Alt e clique na opção “bottom-stretch” (a que ancora embaixo e estica dos lados). Ajuste a altura (
Height) para algo como 150. - Dentro do
Painel_Dialogo, clique com o botão direito > UI > Text – TextMeshPro. (Se a Unity pedir para importar o “TMP Essentials”, pode importar). - Chame esse objeto de
Texto_Dialogo. Ajuste-o para preencher o painel, deixando uma margem (padding).
É isso. Você tem sua “caixa de texto”. Agora, vamos fazê-la funcionar.
O “Software”: O Script de Diálogo
Crie um novo script C# chamado DialogoControlador.
Abra e cole este código. Vou explicar linha por linha o que ele faz.
using UnityEngine;
using TMPro; // Precisamos disso para falar com o TextMeshPro
public class DialogoControlador : MonoBehaviour
{
// --- REFERÊNCIAS DA UI ---
// Arraste o objeto TextMeshPro aqui
public TextMeshProUGUI textoUI;
// Arraste o Panel que segura o texto aqui
public GameObject painelDialogo;
// --- OS DADOS DO DIÁLOGO ---
// [TextArea] deixa o campo de texto maior no Inspector
[TextArea(3, 5)]
public string[] frases; // A lista de frases que o NPC vai falar
// --- CONTROLE INTERNO ---
private int indiceAtual = 0; // Qual frase estamos mostrando
private bool dialogoAtivo = false; // O diálogo está acontecendo?
// Vamos começar com o diálogo escondido
void Start()
{
painelDialogo.SetActive(false);
}
// A mágica acontece aqui
void Update()
{
// Se o diálogo NÃO estiver rolando, ouça a tecla para COMEÇAR
if (!dialogoAtivo)
{
// Pressione "E" para INICIAR
// (Isso é só um exemplo. Você pode chamar IniciarDialogo()
// de um trigger de colisão, por exemplo)
if (Input.GetKeyDown(KeyCode.E))
{
IniciarDialogo();
}
return; // Sai do Update se o diálogo não começou
}
// Se o diálogo ESTIVER rolando, ouça a tecla para AVANÇAR
if (Input.GetKeyDown(KeyCode.E) || Input.GetMouseButtonDown(0))
{
ProximaFrase();
}
}
public void IniciarDialogo()
{
dialogoAtivo = true;
indiceAtual = 0; // Começa da primeira frase
painelDialogo.SetActive(true); // Mostra a caixa de diálogo
textoUI.text = frases[indiceAtual]; // Mostra a primeira frase
}
void ProximaFrase()
{
indiceAtual++; // Avança para a próxima frase
// Verificamos se as frases ACABARAM
if (indiceAtual >= frases.Length)
{
EncerrarDialogo();
}
else // Se ainda tem frase, mostra a próxima
{
textoUI.text = frases[indiceAtual];
}
}
void EncerrarDialogo()
{
dialogoAtivo = false;
painelDialogo.SetActive(false); // Esconde a caixa de diálogo
}
}
A Montagem: Conectando as Peças
Você tem a UI. Você tem o Script. Vamos ligar os pontos.
- Crie um objeto vazio na sua cena. Chame-o de
_GerenciadorDeDialogo. - Coloque o script
DialogoControladornesse objeto. - Selecione o
_GerenciadorDeDialogo. Você verá os campos públicos no Inspector. - Texto UI: Arraste o objeto
Texto_Dialogo(o que está dentro do painel) para este campo. - Painel Dialogo: Arraste o objeto
Painel_Dialogopara este campo. - Frases: É aqui que você escreve sua história. No campo Size, coloque o número de frases que você quer (ex: 3).
- Novos campos (Element 0, Element 1, Element 2) vão aparecer. Escreva seu diálogo ali:
- Element 0: “Olá, aventureiro.”
- Element 1: “O mundo está em perigo. Você precisa ser rápido.”
- Element 2: “Agora vá! E pressione ‘E’ para fechar isso.”
Testando
Dê Play.
O painel de diálogo deve começar escondido.
Aperte “E”.
O painel aparece, mostrando “Olá, aventureiro.”. Aperte “E” de novo. O texto muda. Aperte “E” mais uma vez. O painel desaparece.
É isso.
Você tem um sistema de diálogo funcional.
Conclusão: Simples e Eficaz
Isso é tudo que você precisa. Não tem node, não tem JSON, não tem máquina de estado complexa. É um Array de strings e um índice que controla qual frase mostrar.
Isso resolve 90% dos seus problemas de diálogo.
O que fazer agora? Em vez de começar o diálogo com Input.GetKeyDown(KeyCode.E) no Update, você pode querer que ele comece quando o jogador entra numa área.
Para isso, basta criar um script de trigger (gatilho) separado, que chama a função IniciarDialogo() do seu DialogoControlador. Mas o sistema central, o “motor” do diálogo, já está pronto. E ele é simples assim.





