Diagrama mostrando um script C# 'DialogoControlador' na Unity que usa um Array de strings para popular uma caixa de texto da UI com frases de diálogo.

Como Fazer um Sistema de Diálogo na Unity em 5 Minutos (Tutorial Rápido)

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.

  1. Clique com o botão direito na Hierarquia > UI > Canvas.
  2. Dentro do Canvas, clique com o botão direito > UI > Panel. Vamos chamá-lo de Painel_Dialogo.
  3. 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.
  4. Dentro do Painel_Dialogo, clique com o botão direito > UI > Text – TextMeshPro. (Se a Unity pedir para importar o “TMP Essentials”, pode importar).
  5. 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.

  1. Crie um objeto vazio na sua cena. Chame-o de _GerenciadorDeDialogo.
  2. Coloque o script DialogoControlador nesse objeto.
  3. Selecione o _GerenciadorDeDialogo. Você verá os campos públicos no Inspector.
  4. Texto UI: Arraste o objeto Texto_Dialogo (o que está dentro do painel) para este campo.
  5. Painel Dialogo: Arraste o objeto Painel_Dialogo para este campo.
  6. Frases: É aqui que você escreve sua história. No campo Size, coloque o número de frases que você quer (ex: 3).
  7. 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.

Compartilhe !