Control de Diálogos y Movimiento en Videojuegos con Unity

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

Resumen

Domina los diálogos con NPC en Unity: detén al jugador con una sola bandera booleana, sincroniza estados entre PlayerController y Dialogue Manager, y escala tu mundo creando prefabs. Con este enfoque claro y probado, tu juego gana control, claridad y una experiencia pulida.

¿Cómo detener al jugador durante un diálogo en Unity?

Para evitar que el protagonista se mueva o ataque mientras habla, se añade una bandera en el controlador del jugador y se corta el flujo del update de forma temprana. Así, el movimiento y las animaciones quedan en pausa sin romper otras mecánicas.

¿Qué cambios aplicar en PlayerController?

  • Crear una variable pública: playerTalking como bool.
  • Inicializar en Start: playerTalking = false.
  • Al inicio de Update: si playerTalking es true, poner velocidad a cero y hacer return.
public class PlayerController : MonoBehaviour { public bool playerTalking; // Controla si el jugador está en diálogo. Rigidbody2D rigidBody; void Start() { playerTalking = false; // Al iniciar el juego no estamos hablando. rigidBody = GetComponent<Rigidbody2D>(); } void Update() { if (playerTalking) { rigidBody.velocity = Vector2.zero; // Parar en seco. return; // Detener el resto de lógica este frame. } // Movimiento horizontal, vertical, diagonal, ataques y animaciones... } }

¿Qué efecto tiene el return en Update?

  • Pausa el movimiento del jugador de inmediato.
  • Bloquea ataques y cambios de animación mientras dura el diálogo.
  • Evita ejecutar el resto del código del update en ese frame.

¿Cómo sincronizar el Dialogue Manager con el PlayerController?

El Dialogue Manager debe notificar al jugador cuándo empieza y termina la conversación. Para ello, se obtiene la referencia al PlayerController y se alterna playerTalking entre true y false en los momentos clave.

¿Cómo obtener la referencia al jugador?

  • Declarar un campo privado al inicio del Dialogue Manager.
  • Asignar en Start con FindObjectOfType.
public class DialogueManager : MonoBehaviour { private PlayerController playerController; // Referencia al jugador. void Start() { playerController = FindObjectOfType<PlayerController>(); } // ... resto del código }

¿Dónde activar y desactivar playerTalking?

  • Al iniciar el diálogo: establecer playerTalking = true al final de ShowDialogue.
  • Al terminar todas las líneas: dentro del if que detecta el fin, poner playerTalking = false.
void ShowDialogue() { // Lógica de mostrar diálogo y avanzar líneas... playerController.playerTalking = true; // Inicio de diálogo: bloquear jugador. } void AdvanceDialogue() { // if (currentDialogueLines >= dialogueLines.Length) // Fin del diálogo. if (currentDialogueLines >= dialogueLines.Length) { playerController.playerTalking = false; // Fin de diálogo: liberar jugador. // Cierre y limpieza visual del diálogo... } }
  • Resultado esperado: el jugador no se mueve, no ataca y no cambia animaciones durante la charla. Al terminar, recupera el control.

¿Cómo crear prefabs de NPC y ampliar el poblado sin errores?

Para escalar el mundo, crea prefabs del NPC y de su zona de movimiento. Así podrás clonar habitantes, personalizar diálogos y controlar su espacio sin reconfigurar todo cada vez.

¿Cómo configurar NPCs y Villager Zone?

  • Arrastrar el NPC a la zona inferior para generar su prefab.
  • Crear también el prefab de la Villager Zone.
  • Clonar y ubicar nuevos NPC cerca de ubicaciones clave, por ejemplo, junto a Ricardo.
  • Personalizar el skin y las líneas en la Dialogue Zone:
    • «Hola, soy Ricarda».
    • «¿Has visto a mi marido?».
  • Ajustar el tamaño de la Villager Zone de cada NPC para mantenerlo quieto o con movilidad limitada.
  • Asignar la Villager Zone correspondiente a cada NPC de forma individual.

¿Qué persiste con Don't Destroy On Load?

  • Elementos que siguen activos al cambiar de escena: player, canvas, cámara y Dialogue Manager.
  • Beneficio: puedes hablar con NPCs tras cambiar de escena sin reconfigurar sistemas.

¿Qué mejoras puedes implementar?

  • Añadir más habitantes y más líneas de diálogo.
  • Mostrar el nombre del personaje en la caja de diálogo.
  • Cambiar la caja de diálogo para un estilo más bonito y claro.
  • Crear personajes propios en pixel art o usar recursos gratuitos.

¿Te animas a bautizar al conejito protagonista y a sumar más habitantes como Ricarda y Ricardo? Cuéntame en comentarios cómo expandes tu pueblecito y qué diálogos creativos estás construyendo.