Añade diálogos funcionales y elegantes en Unity con una caja inferior, texto legible y un indicador claro para avanzar. Verás cómo crear un único Dialogue Manager que centraliza todos los textos, ajustar la UI para máxima lectura y controlar la visibilidad con un script en C# usando Input.GetKeyDown(KeyCode.Space).
¿Cómo preparar el layout en el canvas para el diálogo?
Para centralizar la lógica visual, se crea un único Dialogue Manager dentro del Canvas. Este objeto gestionará todos los diálogos, aunque cada personaje tenga el suyo, y los mostrará siempre en el mismo lugar.
Crear un GameObject vacío como hijo del Canvas y nombrarlo Dialogue Manager.
Añadir una imagen de UI como fondo de la caja de diálogo.
Usar un color gris oscuro, no negro absoluto, para contrastar con el texto blanco.
Aplicar ligera transparencia: permite ver el escenario de fondo y evita una interfaz pesada.
Ajustar el anclaje con Shift + Alt en el RectTransform: anclar al borde inferior.
Expandir la imagen para que ocupe todo el espacio del padre: ancho y alto del manager.
La posición y tamaño del Dialogue Manager definen el área del diálogo. Si mueves el manager, el contenido interior se ajusta automáticamente y la interfaz “respira” mejor con márgenes.
¿Qué ajustes de UI mejoran la legibilidad?
El texto principal debe ser claro, con buen contraste y márgenes internos. El indicador de avance es secundario y discreto, preferiblemente alineado abajo a la derecha.
Añadir un objeto de UI tipo texto para el contenido del diálogo.
Elegir color de fuente blanco o claro y la fuente del proyecto.
Ajustar el RectTransform con las manecillas azules para dejar márgenes en todos los bordes.
Crear un segundo texto pequeño para la ayuda: «Pulsa espacio para continuar».
Alinear este texto a la derecha y abajo; reducir el tamaño de la fuente.
Priorizar el diálogo sobre el indicador: si falta espacio, reducir el texto de ayuda o ampliar la caja.
Opcional: aplicar efectos de UI como borde negro o sombreado para mejorar la lectura.
Consejo de jerarquía: colocar los dos textos como hijos de la imagen de fondo. Al ocultar la imagen, desaparecerán también los textos.
¿Cómo programar el DialogueManager en C# para mostrar y ocultar?
La lógica se basa en una variable de estado que sincroniza la UI con el código. Cuando el diálogo está activo, la caja se muestra; si se pulsa espacio, se oculta.
usingUnityEngine;usingUnityEngine.UI;publicclassDialogueManager:MonoBehaviour{publicGameObject DialogBox;// imagen/fondo que contiene todo.publicText DialogueText;// texto principal del diálogo.publicbool DialogueActive;// estado: mostrar/ocultar.voidUpdate(){if(DialogueActive && Input.GetKeyDown(KeyCode.Space)){ DialogueActive =false; DialogBox.SetActive(false);}}publicvoidShowDialogue(string text){ DialogueActive =true; DialogBox.SetActive(true); DialogueText.text = text;}}
Puntos clave del flujo:
Librería: usar UnityEngine.UI para acceder a Text.
Referencias públicas: asignar en el Inspector la caja (imagen) y el texto.
Estado: DialogueActive sincroniza lo visual con el código.
Interacción: Input.GetKeyDown(KeyCode.Space) avanza o cierra el diálogo.
Método ShowDialogue(string text): activa la caja y coloca el contenido.
Nota práctica: si al pulsar espacio no se cierra, revisa el estado del booleano. Debe estar en true cuando el diálogo está visible, y pasar a false al cerrarse.
¿Te gustaría que en próximos pasos conectemos este Dialogue Manager con la detección de proximidad del NPC y el input de hablar? Comparte en comentarios qué variaciones de interfaz te gustaría ver (iconos, nombre del personaje, bordes personalizados).
pues yo para que no movieran al npc le puse de masa 1000
Cielos, pero que macizo :V
Nooooooooooooooooo es seguidor de la grasa (el Diego Michael ese)
En versiones recientes de Unity parece que no funciona la asignación con un TextMeshPro, solo me ha funcionado el Text (legado)
Muy buenas gente, a todo lo aprendido en esta clase le añadí un tiempo de carga a las letras del diálogo para que en lugar de aparecer de golpe aparezcan de a poco. Y también puse que si el usuario da click en la pantalla mientras se estan cargando las letras aparezcan todas así no tiene que esperar si no quiere. Así quedaría:
privatevoidUpdate(){if(dialogActive &&(Input.GetButtonDown("Fire1")||Input.GetKeyDown(KeyCode.Space))){// Finalizar la sección de dialogo dialogActive =false; dialogZone.SetActive(false); nextDialog.gameObject.SetActive(false);}if(inMove &&(Input.GetButtonDown("Fire1")||Input.GetKeyDown(KeyCode.Space))){ inMove =false;StopCoroutine(ShowText()); dialog.text= textDialog; nextDialog.gameObject.SetActive(true);}}publicvoidShowDialog(string text){ textDialog = text; dialogActive =true; dialogZone.SetActive(true);StartCoroutine(ShowText());}privateIEnumeratorShowText(){// Vaciar texto para comenzar de nuevo dialog.text="";// Activar movimiento de texto inMove =true;// Espera inicial antes de cargar el textoyieldreturnnewWaitForSeconds(timeToDialog);for(int i =0; i < textDialog.Length; i++){// Rompe el bucle si se desactiva su movimientoif(!inMove)break; dialog.text+= textDialog[i];yieldreturnnewWaitForSeconds(timeToDialog);} inMove =false; nextDialog.gameObject.SetActive(true);}
Genial
Hola ya se unity
Aquí el código:
using System.Collections;using System.Collections.Generic;using UnityEngine.UI;using UnityEngine;publicclassDialogManager:MonoBehaviour{/**** Variables. ****/publicGameObject dialogBox;publicText dialogText;public bool dialogActive;// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){if(dialogActive &&Input.GetKeyDown(KeyCode.Space)){ dialogActive =false; dialogBox.SetActive(false);}}publicvoidShowDialog(string text){ dialogActive =true; dialogBox.SetActive(true); dialogText.text= text;}}