← Volver al blog

Conecta un HUD de AI Studio a Eventos de Salud con Unity MCP

Después de que AI Studio exporta un prefab de HUD de Unity, usa Cursor + Unity MCP para suscribirte a eventos de salud, actualizar la barra y el texto de daño, con una lista de verificación en modo Play y soluciones comunes.

Publicado
  • Unity MCP
  • AI Studio
  • HUD
  • Unity
  • Cursor
  • AI game development
  • tutorial

El HUD está en Unity, la barra se ve bien, pero el combate no la mueve—generalmente el prefab está bien y la UI y el gameplay no comparten los mismos eventos de salud. El diseño ya exportó el HUD principal como un Canvas / Prefab desde VberAI Studio. El gameplay debería usar Unity MCP en el proyecto abierto para conectar los cambios de PlayerHealth a un Slider / Image.fillAmount, y luego verificar en modo Play.

Esta publicación cubre solo esa conexión—no la exportación de Figma ni la instalación de MCP.

PasoHerramientaResultado
Estructura del HUD en el motorAI StudioPrefab de HUD con nombres estables
Adjuntar scripts, vincular referencias, editar escenaCursor (o Claude Code) + Unity MCPPlayerHealth ↔ HudHealthView
AceptarUnity PlayLa longitud de la barra cambia con daño / curación

Relacionado:

Acuerda los nombres antes de pulir

Después de la exportación de AI Studio, el código debe encontrar la barra mediante ruta o referencias serializadas. Antes de exportar (o justo después de importar), mantén los nombres estables:

RolNombre sugeridoNotas
Raíz del HUDHUD_RootÚnico en la escena
Relleno de saludHUD_HealthFillImage (Filled) o bajo Slider.fillRect
Texto de valor opcionalHUD_HealthTextTextMeshProUGUI, ej. 80/100
Destello de daño opcionalHUD_DamageFlashImagen de pantalla completa o borde, transparente por defecto

Evita los nombres predeterminados del diseño como Rectangle 42 o Group 3—tanto MCP como los scripts escritos a mano heredarán el desorden.

Paso 1: Confirma que el HUD está en la escena

  1. Abre la escena del jugador (ej. Game)
  2. La jerarquía debería mostrar HUD_Root (o tu equivalente) con una imagen de salud / Slider debajo
  3. El modo de renderizado del Canvas y la configuración de la cámara son correctos (Screen Space - Overlay es lo más simple)

Prueba de humo de solo lectura mediante MCP (no edites la escena):

Lista los GameObjects en la escena activa cuyos nombres contengan HUD, y los tipos de componentes UI en ellos. No modifiques nada.

Si la lista está vacía: re-exporta/sincroniza desde AI Studio, o verifica que el Prefab se colocó en la escena incorrecta.

Paso 2: El gameplay expone los cambios de salud—nunca busques la UI

Mantén la salud en el jugador y transmite con un evento de C# (o UnityEvent). El HUD solo se suscribe; no debe conducir la lógica mediante Find("Player").

Pide a Unity MCP desde Cursor (las rutas pueden coincidir con tu proyecto):

Crea Assets/Scripts/Combat/PlayerHealth.cs:
- maxHealth, currentHealth (float)
- event Action<float,float> OnHealthChanged(current, max)
- TakeDamage(float), Heal(float); clamp a 0..max
- Si current<=0 después del daño, dispara OnHealthChanged de nuevo y opcionalmente OnDied
- Adjunta al Player de la escena; transmite una vez en Start
No modifiques ningún nodo del HUD.

Implementación de referencia (genera, luego revisa):

using System;
using UnityEngine;

public class PlayerHealth : MonoBehaviour
{
    [SerializeField] float maxHealth = 100f;
    float currentHealth;

    public event Action<float, float> OnHealthChanged;
    public event Action OnDied;

    void Awake() => currentHealth = maxHealth;

    void Start() => OnHealthChanged?.Invoke(currentHealth, maxHealth);

    public void TakeDamage(float amount)
    {
        if (amount <= 0f || currentHealth <= 0f) return;
        currentHealth = Mathf.Max(0f, currentHealth - amount);
        OnHealthChanged?.Invoke(currentHealth, maxHealth);
        if (currentHealth <= 0f) OnDied?.Invoke();
    }

    public void Heal(float amount)
    {
        if (amount <= 0f || currentHealth <= 0f) return;
        currentHealth = Mathf.Min(maxHealth, currentHealth + amount);
        OnHealthChanged?.Invoke(currentHealth, maxHealth);
    }
}

Tecla de daño temporal para la conexión (eliminar después):

Agrega DebugDealDamage.cs temporal en Player: presionar H inflige 10 de daño a PlayerHealth en el mismo objeto. Solo para aceptación de la conexión.

Paso 3: La vista del HUD solo escucha y actualiza la barra

Agrega un script de vista con referencias serializadas. No uses GameObject.Find cada frame en Update.

Crea Assets/Scripts/UI/HudHealthView.cs:
- Serialize Image healthFill (Filled, Horizontal)
- Opcional TMP_Text healthText
- Serialize PlayerHealth playerHealth (o resuelve el PlayerHealth único en Awake)
- OnEnable suscribirse a OnHealthChanged; OnDisable desuscribirse
- En el callback: healthFill.fillAmount = current/max; texto $"{current:0}/{max:0}"
- Adjuntar a HUD_Root; asignar la imagen HUD_HealthFill a healthFill
- Asignar el PlayerHealth del Player a playerHealth

Referencia:

using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class HudHealthView : MonoBehaviour
{
    [SerializeField] PlayerHealth playerHealth;
    [SerializeField] Image healthFill;
    [SerializeField] TMP_Text healthText;

    void OnEnable()
    {
        if (playerHealth == null) return;
        playerHealth.OnHealthChanged += HandleHealthChanged;
        // Si te suscribes después de Start, obtén una vez; aquí confiamos en PlayerHealth.Start
    }

    void OnDisable()
    {
        if (playerHealth == null) return;
        playerHealth.OnHealthChanged -= HandleHealthChanged;
    }

    void HandleHealthChanged(float current, float max)
    {
        float t = max > 0f ? current / max : 0f;
        if (healthFill != null) healthFill.fillAmount = t;
        if (healthText != null) healthText.text = $"{Mathf.CeilToInt(current)}/{Mathf.CeilToInt(max)}";
    }
}

Si la Image no es Filled: haz que MCP establezca Image Type = Filled, Fill Method = Horizontal, y luego vincula fillAmount. Con un Slider, escribe slider.value = t (minValue=0, maxValue=1)—mismo patrón.

Paso 4: Deja que Unity MCP complete las referencias serializadas

Después de compilar, sé explícito en Cursor:

En la escena activa:
1. Confirma que Player tiene PlayerHealth; HUD_Root tiene HudHealthView
2. Apunta HudHealthView.healthFill a la Image llamada HUD_HealthFill
3. Apunta HudHealthView.playerHealth al PlayerHealth del Player
4. Si HUD_HealthText existe, asigna el TMP_Text
5. Guarda la escena
Luego lista cualquier campo serializado None restante en esos dos componentes.

Verificación de solo lectura:

Inspecciona las referencias de HudHealthView y PlayerHealth: ¿hay scripts faltantes o campos None? Informa solo—no edites la escena.

Paso 5: Lista de verificación de aceptación en Play

Entra en Play y marca todos estos antes de dar por terminada la conexión:

  1. Al entrar: la barra está llena (o coincide con current/max), no vacía o desactualizada
  2. Presiona H (o golpea al jugador): fillAmount baja; el texto se actualiza si está presente
  3. Daño a 0: la barra vacía; el estado de muerte estable; el HUD no parpadea
  4. Curación: la barra sube (tecla temporal o recogida)
  5. Salir de Play y volver a entrar: las referencias siguen válidas; sin Missing Script

Indicación de aceptación:

Estoy aceptando la conexión del HUD en modo Play. Si la consola muestra NullReferenceException, di si es PlayerHealth o HudHealthView y qué campo serializado es None. Diagnostica primero, propón la solución mínima, espera mi OK antes de editar.

Puntos de fallo comunes

SíntomaRevisa primero
La barra nunca se mueve en PlayOnHealthChanged no suscrito; o el daño nunca llega a TakeDamage
NRE al entrar en PlayhealthFill / playerHealth siguen en None
Barra invertida o saltosImage no es Filled; se usa un Rect incorrecto como relleno
Texto atascadoTMP incorrecto; errores de fuente faltante en el componente
IA edita los objetos equivocadosIndicación: “Solo toca HUD_Root / Player; no muevas la geometría del nivel”

Regla: el gameplay cambia la salud; la UI solo escucha. No uses Find("HUD_HealthFill") dentro de PlayerCombat—el próximo cambio de nombre en la re-exportación de AI Studio romperá también el combate.

Conviviendo con las re-exportaciones del HUD

Cuando el diseño re-exporta desde AI Studio:

  1. Mantén los nombres HUD_HealthFill / HUD_Root cuando sea posible
  2. Después de reimportar, solo vuelve a ejecutar las verificaciones de referencias del paso 4—no dejes que MCP reescriba PlayerHealth
  3. Mantén el script de vista en el proyecto; re-vincula si las referencias de la variante del Prefab se borraron

Indicación de límite de una línea:

Esta pasada solo corrige referencias perdidas de UI Prefab. No cambies ningún script de gameplay bajo Assets/Scripts/Combat.

Resumen

  1. AI Studio entrega la estructura del HUD en Unity
  2. PlayerHealth transmite (current, max)
  3. HudHealthView se suscribe y actualiza fillAmount / texto
  4. Unity MCP adjunta componentes, completa referencias serializadas, aplica correcciones mínimas de consola
  5. Acepta con una tecla de daño + lista de verificación de Play—no con “script generado exitosamente”

Eso cierra un bucle repetible: UI al motor → conexión de eventos → aceptación en Play. Las bolsas, barras de maná y barras de jefe pueden copiar el mismo patrón.

Más guías que te pueden interesar