← Retour au blog

Connectez un HUD d'AI Studio aux événements de santé avec Unity MCP

Après l'export d'un prefab HUD Unity par AI Studio, utilisez Cursor + Unity MCP pour abonner les événements de santé, actualiser la barre et le texte de dégâts, avec une checklist de mode Play et des correctifs courants.

Publié le
  • Unity MCP
  • AI Studio
  • HUD
  • Unity
  • Cursor
  • AI game development
  • tutorial

Le HUD est dans Unity, la barre semble correcte, mais le combat ne la fait pas bouger—généralement le prefab est correct et l’UI et le gameplay ne partagent pas les mêmes événements de santé. Le design a déjà exporté le HUD principal en tant que Canvas / Prefab depuis VberAI Studio. Le gameplay devrait utiliser Unity MCP dans le projet ouvert pour connecter les changements de PlayerHealth à un Slider / Image.fillAmount, puis vérifier en mode Play.

Cet article couvre uniquement ce câblage—pas l’export Figma ni l’installation de MCP.

ÉtapeOutilRésultat
Structure du HUD dans le moteurAI StudioPrefab HUD avec des noms stables
Attacher les scripts, lier les références, modifier la scèneCursor (ou Claude Code) + Unity MCPPlayerHealth ↔ HudHealthView
AccepterUnity PlayLa longueur de la barre change lors des dégâts / soins

Liens connexes :

Accordez-vous sur les noms avant de peaufiner

Après l’export d’AI Studio, le code doit trouver la barre via le chemin ou des références sérialisées. Avant l’export (ou juste après l’import), gardez des noms stables :

RôleNom suggéréRemarques
Racine du HUDHUD_RootUnique dans la scène
Remplissage de santéHUD_HealthFillImage (Filled) ou sous Slider.fillRect
Texte de valeur optionnelHUD_HealthTextTextMeshProUGUI, par ex. 80/100
Flash de dégâts optionnelHUD_DamageFlashImage plein écran ou bordure, transparent par défaut

Évitez les valeurs par défaut du design comme Rectangle 42 ou Group 3—MCP et les scripts écrits à la main hériteront du désordre.

Étape 1 : Confirmez que le HUD est dans la scène

  1. Ouvrez la scène du joueur (par ex. Game)
  2. La hiérarchie devrait afficher HUD_Root (ou votre équivalent) avec une Image / Slider de santé en dessous
  3. Le mode de rendu du Canvas et la configuration de la caméra sont corrects (Screen Space - Overlay est le plus simple)

Test de fumée en lecture seule via MCP (ne modifiez pas la scène) :

Listez les GameObjects dans la scène active dont les noms contiennent HUD, et les types de composants UI sur eux. Ne modifiez rien.

Si la liste est vide : ré-exportez/synchronisez depuis AI Studio, ou vérifiez que le Prefab a été déposé dans la mauvaise scène.

Étape 2 : Le gameplay expose les changements de santé—ne cherchez jamais l’UI

Gardez la santé sur le joueur et diffusez avec un événement C# (ou UnityEvent). Le HUD s’abonne uniquement ; il ne doit pas piloter la logique via Find("Player").

Demandez à Unity MCP depuis Cursor (les chemins peuvent correspondre à votre projet) :

Créez Assets/Scripts/Combat/PlayerHealth.cs :
- maxHealth, currentHealth (float)
- événement Action<float,float> OnHealthChanged(current, max)
- TakeDamage(float), Heal(float) ; limitez à 0..max
- Si current<=0 après les dégâts, déclenchez à nouveau OnHealthChanged et éventuellement OnDied
- Attachez au Player de la scène ; diffusez une fois dans Start
Ne modifiez aucun nœud HUD.

Implémentation de référence (générez, puis révisez) :

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);
    }
}

Touche de dégâts temporaire pour le câblage (supprimez plus tard) :

Ajoutez DebugDealDamage.cs temporaire sur Player : appuyer sur H inflige 10 dégâts à PlayerHealth sur le même objet. Uniquement pour l'acceptation du câblage.

Étape 3 : La vue HUD écoute uniquement et met à jour la barre

Ajoutez un script de vue avec des références sérialisées. Ne faites pas GameObject.Find à chaque frame dans Update.

Créez Assets/Scripts/UI/HudHealthView.cs :
- Sérialisez Image healthFill (Filled, Horizontal)
- Optionnel TMP_Text healthText
- Sérialisez PlayerHealth playerHealth (ou résolvez le PlayerHealth unique à Awake)
- OnEnable s'abonne à OnHealthChanged ; OnDisable se désabonne
- Dans le callback : healthFill.fillAmount = current/max ; texte $"{current:0}/{max:0}"
- Attachez à HUD_Root ; assignez l'Image HUD_HealthFill à healthFill
- Assignez le PlayerHealth du Player à playerHealth

Référence :

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 vous vous abonnez après Start, tirez une fois ; ici on s'appuie sur 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 l’Image n’est pas Filled : demandez à MCP de définir Image Type = Filled, Fill Method = Horizontal, puis liez fillAmount. Avec un Slider, écrivez slider.value = t (minValue=0, maxValue=1)—même modèle.

Étape 4 : Laissez Unity MCP remplir les références sérialisées

Après la compilation, soyez explicite dans Cursor :

Dans la scène active :
1. Confirmez que Player a PlayerHealth ; HUD_Root a HudHealthView
2. Pointez HudHealthView.healthFill vers l'Image nommée HUD_HealthFill
3. Pointez HudHealthView.playerHealth vers le PlayerHealth du Player
4. Si HUD_HealthText existe, assignez le TMP_Text
5. Enregistrez la scène
Ensuite, listez les champs sérialisés None restants sur ces deux composants.

Vérification en lecture seule :

Inspectez les références de HudHealthView et PlayerHealth : y a-t-il des scripts manquants ou des champs None ? Rapportez uniquement—ne modifiez pas la scène.

Étape 5 : Checklist d’acceptation en mode Play

Entrez en Play et cochez toutes ces cases avant de déclarer le câblage terminé :

  1. À l’entrée : la barre est pleine (ou correspond à current/max), pas vide ou obsolète
  2. Appuyez sur H (ou frappez le joueur) : fillAmount diminue ; le texte se met à jour si présent
  3. Dégâts jusqu’à 0 : barre vide ; état de mort stable ; le HUD ne s’agite pas
  4. Soin : la barre monte (touche temporaire ou ramassage)
  5. Sortez du Play et ré-entrez : les références sont toujours valides ; pas de Missing Script

Invite d’acceptation :

J'accepte le câblage du HUD en mode Play. Si la console affiche NullReferenceException, dites si c'est PlayerHealth ou HudHealthView et quel champ sérialisé est None. Diagnostiquez d'abord, proposez le correctif minimal, attendez mon OK avant de modifier.

Points de rupture courants

SymptômeVérifiez d’abord
La barre ne bouge jamais en PlayOnHealthChanged non abonné ; ou les dégâts n’atteignent jamais TakeDamage
NRE à l’entrée en PlayhealthFill / playerHealth encore None
Barre inversée ou sauteImage non Filled ; mauvais Rect utilisé comme remplissage
Texte bloquéMauvais TMP ; erreurs d’assets de police manquants sur le composant
L’IA modifie les mauvais objetsInvite : “Ne touchez qu’à HUD_Root / Player ; ne déplacez pas la géométrie du niveau”

Règle : le gameplay change la santé ; l’UI écoute uniquement. Ne faites pas Find("HUD_HealthFill") dans PlayerCombat—le prochain renommage lors d’un ré-export d’AI Studio cassera aussi le combat.

Vivre avec les ré-exports du HUD

Lorsque le design ré-exporte depuis AI Studio :

  1. Conservez les noms HUD_HealthFill / HUD_Root si possible
  2. Après la ré-importation, relancez uniquement les vérifications de références de l’étape 4—ne laissez pas MCP réécrire PlayerHealth
  3. Conservez le script de vue dans le projet ; reliez si les références de la variante Prefab ont été effacées

Invite de limite en une ligne :

Cette passe ne corrige que les références de Prefab UI perdues. Ne modifiez aucun script de gameplay sous Assets/Scripts/Combat.

Résumé

  1. AI Studio livre la structure du HUD dans Unity
  2. PlayerHealth diffuse (current, max)
  3. HudHealthView s’abonne et met à jour fillAmount / texte
  4. Unity MCP attache les composants, remplit les références sérialisées, applique les correctifs Console minimaux
  5. Acceptez avec une touche de dégâts + checklist Play—pas “script généré avec succès”

Cela boucle une boucle reproductible : UI dans le moteur → câblage des événements → acceptation en Play. Les sacs, barres de mana et barres de boss peuvent copier le même modèle.

D’autres guides qui pourraient vous intéresser