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.