Sincronización de UI y datos en Unity

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

Resumen

Centraliza la interfaz con un gestor de UI claro y confiable: conecta la barra de vida con los datos del jugador, formatea el texto en tiempo real con StringBuilder y evita que el heads up display desaparezca al cambiar de escena usando Don't Destroy On Load y Script Execution Order. Así garantizas una experiencia pulida y sin saltos visuales.

¿Cómo coordinar la ui con el juego en Unity?

Para orquestar la interfaz, se crea un script llamado UI Manager y se asigna al Canvas. Al estar en el padre, puede “gobernar” a sus hijos: barra de vida y texto. Hay múltiples Health Managers en escena, así que se referencia en el inspector el que corresponde al jugador.

  • Asigna el UI Manager al Canvas para centralizar el control de sus elementos hijos.
  • Referencia el Slider y el Text del HUD desde el inspector.
  • Vincula el Health Manager del jugador: hay uno por personaje o enemigo.
  • Ajusta alineaciones del texto según prefieras: centro, izquierda o derecha.

¿Qué referencias necesita el ui manager?

  • public Slider: playerHealthBar.
  • public Text: playerHealthText.
  • public HealthManager: playerHealthManager.

¿Cómo estructurar el script en C#?

Incluye las librerías para UI y formateo, y sincroniza todo en Update. El Start no es necesario.

using UnityEngine;
using UnityEngine.UI;
using System.Text;

public class UIManager : MonoBehaviour
{
    public Slider playerHealthBar;
    public Text playerHealthText;
    public HealthManager playerHealthManager;

    void Update()
    {
        // Sincroniza la barra con la vida del jugador
        playerHealthBar.maxValue = playerHealthManager.maxHealth;
        playerHealthBar.value = playerHealthManager.currentHealth;

        // Texto del HUD: "HP: actual/max"
        var sb = new StringBuilder();
        sb.Append("HP: ");
        sb.Append(playerHealthManager.currentHealth);
        sb.Append("/");
        sb.Append(playerHealthManager.maxHealth);

        playerHealthText.text = sb.ToString();
    }
}

¿Cómo actualizar barra y texto de vida en tiempo real?

La sincronización ocurre en Update: el Slider.maxValue refleja la vida máxima y el Slider.value la vida actual. Para el texto, StringBuilder del espacio de nombres System.Text compone el mensaje sin generar basura de memoria en cada frame.

  • Importa UnityEngine.UI para usar Slider y Text.
  • Importa System.Text para usar StringBuilder.
  • Mapea valores: maxValue = maxHealth, value = currentHealth.
  • Formatea: "HP: actual/max" con llamadas a Append.
  • Muestra estados reales: por ejemplo, si el jugador tiene 200/200, se ve 200/200; al recibir daño, barra y texto descienden en sincronía.
  • Escalable a varios jugadores: usa un array de Sliders para mostrar las estadísticas de cada uno.

¿Cómo mantener el hud al cambiar de escena y evitar fallos de orden?

Si al entrar en otra escena desaparece el HUD, el Canvas debe persistir. La solución es aplicar Don't Destroy On Load al Canvas para que no se destruya en cargas de escena. Aun así, el orden de inicialización puede provocar fallos si el jugador aparece antes que cámara o interfaz.

  • Aplica Don't Destroy On Load al Canvas para preservar HUD entre escenas.
  • Revisa el Project Settings > Script Execution Order para controlar el arranque.
  • Retrasa el PlayerController: haz que se inicialice después de cámara y HUD.
  • Evita inicializar primero al jugador: si ocurre, la UI y cámara podrían no estar listas.
  • Un retraso pequeño (p. ej., 100 ms) suele bastar para asegurar que cámara, escenario y HUD estén creados antes del jugador.
  • Resultado: persistencia estable y sincronización consistente incluso con múltiples cargas de escena.

¿Te gustaría mostrar más métricas en el hud o preparar una versión para varios jugadores con arrays de sliders? Comparte tus ideas y dudas en los comentarios.