Programación de diálogos interactivos para NPCs en videojuegos

Clase 45 de 60Curso Avanzado de Creación de RPGs con Unity

Contenido del curso

Personaje principal: Movimiento y Animaciones

Enemigos Avanzados

Personaje principal avanzado

Resumen

Implementa un sistema de diálogo de NPC en Unity de forma simple y efectiva: una Dialogue Zone con Box Collider 2D en modo trigger, un script en C# que escucha la tecla Intro, y un Dialogue Manager que muestra el texto. Con esta estructura, cualquier personaje puede iniciar conversaciones claras y controladas por el jugador.

¿Cómo implementar el diálogo de un NPC en Unity?

Para iniciar conversaciones de forma consistente, se prepara una zona alrededor del NPC y un script que detecta cuándo el jugador decide hablar. El flujo es directo: el jugador entra en la zona, pulsa la tecla, y el Dialogue Manager muestra la línea configurada.

¿Cómo crear la Dialogue Zone y configurar el collider?

  • Crear un hijo vacío del NPC llamado Dialogue Zone.
  • Añadir un Box Collider 2D y marcarlo como trigger.
  • Ajustar el tamaño: un poco más grande que el personaje para no exigir demasiada proximidad.
  • Si se desea hablar solo por delante: recortar el collider para cubrir la zona frontal.
  • Evitar que sea un objeto físico: activar isTrigger permite atravesarlo y detecta entradas.

¿Qué hace el script NPC Dialogue en C#?

using UnityEngine; public class NPCDialogue : MonoBehaviour { public string dialogue; // línea que dirá el NPC private DialogueManager manager; // referencia al gestor de diálogos private bool playerInTheZone; // estado de jugador en zona void Start() { manager = FindObjectOfType<DialogueManager>(); } void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag("Player")) { playerInTheZone = true; } } void Update() { if (playerInTheZone && Input.GetKeyDown(KeyCode.Return)) { manager.ShowDialogue(dialogue); } } }
  • Variable pública dialogue: texto que dirá el NPC.
  • Referencia a Dialogue Manager: muestra el diálogo en pantalla.
  • Bandera playerInTheZone: solo permite iniciar si el jugador está en la zona.
  • Start con FindObjectOfType<DialogueManager>(): localiza el único gestor.
  • OnTriggerEnter2D: valida la tag "Player" y habilita el inicio.
  • Update con Input.GetKeyDown(KeyCode.Return): escucha la tecla Intro y llama a ShowDialogue.

¿Cómo iniciar y mostrar el diálogo con la tecla Intro?

El inicio se basa en dos condiciones: que el jugador esté dentro de la Dialogue Zone y que presione la tecla Intro. Cuando ambas se cumplen, el Dialogue Manager recibe la cadena y la muestra en la caja de diálogo.

¿Cómo gestionar la UI del diálogo con el Dialogue Manager?

  • Desactivar la imagen/caja de diálogo por defecto: la activa el Dialogue Manager al invocar ShowDialogue.
  • Interacción fluida: al pulsar la barra espaciadora, el diálogo avanza o se oculta según lo definido en el gestor.
  • Persistencia opcional: con Don’t Destroy On Load el gestor puede mantenerse único entre escenas.
  • Resultado esperado: el jugador se acerca al NPC, pulsa Intro y ve el texto, por ejemplo: «Hola, soy Ricardo y estoy probando el videojuego».

¿Qué buenas prácticas y extensiones se sugieren?

Para extender y mantener el sistema, conviene estructurar el NPC con zonas especializadas y aprovechar un gestor único para la UI de diálogos.

  • Dialogue Zone como hijo del NPC: organiza responsabilidades por zonas.
  • Box Collider 2D en trigger: evita colisiones físicas y detecta entradas.
  • Tag "Player": identifica al protagonista sin ambigüedades.
  • Dialogue Manager centralizado: muestra, oculta y controla la caja de texto.
  • FindObjectOfType con un único gestor: simplifica referencias.
  • Input.GetKeyDown(KeyCode.Return): decisión explícita del jugador para iniciar.
  • SubGameObjects para más funciones: añade otras zonas si el NPC hace más que hablar.
  • Líneas configurables: texto editable por NPC para personalizar comportamientos.
  • Tecla espacio para continuar: navegación rápida por la línea mostrada.
  • Futuras mejoras: múltiples líneas de diálogo y lógica adicional cuando se requiera.

¿Te gustaría ampliar este sistema con múltiples líneas o condiciones especiales por NPC? Cuéntame en los comentarios qué interacción te interesa construir y cómo te gustaría que respondiera el Dialogue Manager.