Corregir bugs de diálogo y animación en Unity

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

Resumen

Mejorar un juego requiere detectar y corregir detalles. Aquí aprenderás a resolver dos bugs frecuentes en un sistema de quests y diálogos en Unity: el diálogo que sigue activo fuera de la zona y la espada mal orientada al iniciar. Con enfoques claros y cambios mínimos en scripts y Animator, verás cómo elevar la experiencia de juego con seguridad y control.

¿Cómo corregir el bug de diálogo persistente con OnTriggerExit2D?

El problema: tras hablar con un NPC, el jugador se aleja y puede seguir activando el diálogo desde cualquier lugar. La causa está en el script del diálogo (npcDialogue): se marca el estado de "jugador en zona" al entrar, pero no se desactiva al salir.

  • Usa el par de eventos OnTriggerEnter2D / OnTriggerExit2D para reflejar entrada y salida reales de la zona.
  • Verifica la etiqueta con collision.gameObject.tag.Equals("Player") para no disparar lógica con otros objetos.
  • Actualiza el flag playerInTheZone a false al salir de la colisión.

Ejemplo en C#:

public class NpcDialogue : MonoBehaviour
{
    bool playerInTheZone;

    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag.Equals("Player"))
        {
            playerInTheZone = true; // habilita diálogo al entrar.
        }
    }

    void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.tag.Equals("Player"))
        {
            playerInTheZone = false; // deshabilita diálogo al salir.
        }
    }
}

¿Qué conceptos refuerzas al implementar triggers 2D?

  • Control de estado con booleanos: playerInTheZone indica disponibilidad del diálogo.
  • Filtros por etiqueta: uso de "Player" para eventos relevantes.
  • Diseño robusto: entrada y salida simétricas con OnTriggerEnter2D y OnTriggerExit2D.
  • Legibilidad: nombres claros en variables y métodos.

¿Cómo alinear la espada en el estado idle desde el Animator?

El síntoma: al iniciar, la espada mira "a Mordor" pese a que el jugador está quieto. Esto ocurre porque el Animator aún no tiene una última dirección conocida hasta que hay movimiento. La solución combina ajustes en animaciones e inicialización por código.

  • Revisa el state de player idle y las variantes como facing right. Asegúrate de que el primer frame tenga la espada en la posición correcta.
  • Inicializa la última dirección en el script del jugador para que, por defecto, mire a la derecha (o a la que prefieras) al arrancar.

Ejemplo en C# dentro de tu PlayerController:

public class PlayerController : MonoBehaviour
{
    Vector2 lastMovement;
    bool playerTalking;

    void Start()
    {
        playerTalking = false;               // estado inicial sin conversación.
        lastMovement = new Vector2(1f, 0f);  // mira a la derecha por defecto.
    }
}

¿Cómo mejorar la configuración desde el editor?

  • Exponer la dirección por defecto evita hardcodear valores y facilita pruebas.
public class PlayerController : MonoBehaviour
{
    [SerializeField] Vector2 defaultLastMovement = new Vector2(1f, 0f);
    Vector2 lastMovement;

    void Start()
    {
        lastMovement = defaultLastMovement; // configurable en el Editor.
    }
}
  • Beneficio inmediato: el Animator toma una última dirección conocida desde el inicio y la espada queda bien orientada en idle.
  • Ajuste visual: valida que el frame inicial de cada animación idle coincida con esa dirección.

¿Qué mejora de diseño puedes aplicar a misiones y diálogos?

Actualmente, las misiones inician en una región específica del mapa. Una mejora útil es disparar la misión al finalizar un diálogo y unificar la lógica en un mismo script.

  • Integra sistemas: conecta diálogos y misiones en el orden que corresponda.
  • Control de flujo: inicia misiones tras la última línea de conversación.
  • Configuración flexible: usa variables públicas para activar o encadenar misiones.
  • Prueba exhaustiva: verifica que el diálogo no se repita fuera de zona y que el cambio de state active la misión adecuada.

¿Probaste una variante diferente o añadiste más validaciones? Comparte tu enfoque y resultados, etiqueta a Platzi y al instructor, y conversemos mejoras que sumen valor a la experiencia de juego.

      Corregir bugs de diálogo y animación en Unity