← Zurück zum Blog

Ein AI-Studio-HUD mit Unity MCP an Gesundheitsereignisse anbinden

Nachdem AI Studio ein Unity-HUD-Prefab exportiert hat, mit Cursor + Unity MCP Gesundheitsereignisse abonnieren, Balken und Schadenstext aktualisieren, mit Play-Modus-Checkliste und häufigen Fixes.

Veröffentlicht
  • Unity MCP
  • AI Studio
  • HUD
  • Unity
  • Cursor
  • AI game development
  • tutorial

Titel

Ein AI-Studio-HUD mit Unity MCP an Gesundheitsereignisse anbinden

Beschreibung

Nachdem AI Studio ein Unity-HUD-Prefab exportiert hat, mit Cursor + Unity MCP Gesundheitsereignisse abonnieren, Balken und Schadenstext aktualisieren, mit Play-Modus-Checkliste und häufigen Fixes.

Einleitung

Das HUD ist in Unity, der Balken sieht gut aus, aber der Kampf bewegt ihn nicht – normalerweise ist das Prefab in Ordnung und UI und Gameplay teilen sich nicht dieselben Gesundheitsereignisse. Design hat das Haupt-HUD bereits als Canvas / Prefab aus VberAI Studio exportiert. Gameplay sollte Unity MCP im offenen Projekt verwenden, um PlayerHealth-Änderungen mit einem Slider / Image.fillAmount zu verbinden, und dann im Play-Modus verifizieren.

Dieser Beitrag behandelt nur diese Verdrahtung – nicht den Figma-Export oder die MCP-Installation.

SchrittWerkzeugAusgabe
HUD-Struktur in die EngineAI StudioHUD-Prefab mit stabilen Namen
Skripte anhängen, Referenzen binden, Szene bearbeitenCursor (oder Claude Code) + Unity MCPPlayerHealth ↔ HudHealthView
AbnahmeUnity PlayBalkenlänge ändert sich bei Schaden / Heilung

Verwandte Artikel:

Namen vor dem Feinschliff festlegen

Nach dem AI-Studio-Export muss der Code den Balken über Pfad oder serialisierte Referenzen finden. Vor dem Export (oder direkt nach dem Import) sollten die Namen stabil bleiben:

RolleVorgeschlagener NameHinweise
HUD-WurzelHUD_RootEindeutig in der Szene
GesundheitsfüllungHUD_HealthFillImage (Filled) oder unter Slider.fillRect
Optionaler WertetextHUD_HealthTextTextMeshProUGUI, z. B. 80/100
Optionaler SchadensblitzHUD_DamageFlashVollbild- oder Rand-Image, standardmäßig transparent

Vermeiden Sie Design-Standardnamen wie Rectangle 42 oder Group 3 – sowohl MCP als auch handgeschriebene Skripte erben das Chaos.

Schritt 1: Bestätigen, dass das HUD in der Szene ist

  1. Öffnen Sie die Spielerszene (z. B. Game)
  2. Die Hierarchie sollte HUD_Root (oder Ihr Äquivalent) mit einem Gesundheits-Image / Slider darunter zeigen
  3. Canvas-Render-Modus und Kamera-Setup sind korrekt (Screen Space - Overlay ist am einfachsten)

Nur-Lese-Smoke-Test über MCP (Szene nicht bearbeiten):

Listen Sie GameObjects in der aktiven Szene auf, deren Namen HUD enthalten, sowie die UI-Komponententypen darauf. Ändern Sie nichts.

Wenn die Liste leer ist: Erneut aus AI Studio exportieren/synchronisieren oder prüfen, ob das Prefab in die falsche Szene eingefügt wurde.

Schritt 2: Gameplay macht Gesundheitsänderungen sichtbar – niemals die UI finden

Gesundheit beim Spieler behalten und mit einem C#-Event (oder UnityEvent) senden. Das HUD abonniert nur; es darf keine Logik über Find("Player") steuern.

Bitten Sie Unity MCP von Cursor aus (Pfade können zu Ihrem Projekt passen):

Erstellen Sie Assets/Scripts/Combat/PlayerHealth.cs:
- maxHealth, currentHealth (float)
- event Action<float,float> OnHealthChanged(current, max)
- TakeDamage(float), Heal(float); auf 0..max begrenzen
- Wenn current<=0 nach Schaden, OnHealthChanged erneut auslösen und optional OnDied
- An das Player-Objekt in der Szene anhängen; einmal in Start senden
Ändern Sie keine HUD-Knoten.

Referenzimplementierung (generieren, dann überprüfen):

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

Temporäre Schadentaste für die Verdrahtung (später löschen):

Fügen Sie temporäres DebugDealDamage.cs auf Player hinzu: Drücken von H fügt PlayerHealth auf demselben Objekt 10 Schaden zu. Nur für die Verdrahtungsabnahme.

Schritt 3: HUD-Ansicht hört nur zu und aktualisiert den Balken

Fügen Sie ein Ansichtsskript mit serialisierten Referenzen hinzu. Verwenden Sie nicht GameObject.Find in jedem Frame in Update.

Erstellen Sie Assets/Scripts/UI/HudHealthView.cs:
- Serialize Image healthFill (Filled, Horizontal)
- Optional TMP_Text healthText
- Serialize PlayerHealth playerHealth (oder das eindeutige PlayerHealth bei Awake auflösen)
- OnEnable OnHealthChanged abonnieren; OnDisable abbestellen
- Im Callback: healthFill.fillAmount = current/max; Text $"{current:0}/{max:0}"
- An HUD_Root anhängen; HUD_HealthFill Image an healthFill zuweisen
- Player's PlayerHealth an playerHealth zuweisen

Referenz:

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;
        // Wenn Sie nach Start abonnieren, einmal abrufen; hier verlassen wir uns auf 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)}";
    }
}

Wenn das Image nicht Filled ist: MCP anweisen, Image Type = Filled, Fill Method = Horizontal zu setzen, dann fillAmount binden. Bei einem Slider schreiben Sie slider.value = t (minValue=0, maxValue=1) – gleiches Muster.

Schritt 4: Unity MCP serialisierte Referenzen füllen lassen

Nach dem Kompilieren in Cursor explizit angeben:

In der aktiven Szene:
1. Bestätigen, dass Player PlayerHealth hat; HUD_Root hat HudHealthView
2. HudHealthView.healthFill auf das Image namens HUD_HealthFill zeigen lassen
3. HudHealthView.playerHealth auf Player's PlayerHealth zeigen lassen
4. Wenn HUD_HealthText existiert, das TMP_Text zuweisen
5. Szene speichern
Dann alle verbleibenden None-serialisierten Felder auf diesen beiden Komponenten auflisten.

Nur-Lese-Prüfung:

HudHealthView- und PlayerHealth-Referenzen überprüfen: fehlende Skripte oder None-Felder? Nur Bericht – Szene nicht bearbeiten.

Schritt 5: Play-Abnahme-Checkliste

Play starten und alle Punkte abhaken, bevor die Verdrahtung als erledigt gilt:

  1. Beim Start: Balken ist voll (oder entspricht current/max), nicht leer/veraltet
  2. H drücken (oder Spieler treffen): fillAmount sinkt; Text aktualisiert sich, falls vorhanden
  3. Schaden auf 0: Balken leer; Todeszustand stabil; HUD flackert nicht
  4. Heilung: Balken steigt (temporäre Taste oder Pickup)
  5. Play beenden und neu starten: Referenzen noch gültig; kein Missing Script

Abnahmeprompt:

Ich nehme die HUD-Verdrahtung im Play-Modus ab. Wenn die Konsole NullReferenceException zeigt, sagen Sie, ob es PlayerHealth oder HudHealthView betrifft und welches serialisierte Feld None ist. Diagnostizieren Sie zuerst, schlagen Sie den minimalen Fix vor, warten Sie auf mein OK, bevor Sie bearbeiten.

Häufige Bruchstellen

SymptomZuerst prüfen
Balken bewegt sich im Play nieOnHealthChanged nicht abonniert; oder Schaden erreicht TakeDamage nie
NRE beim Play-StarthealthFill / playerHealth noch None
Balken invertiert oder springtImage nicht Filled; falsches Rect als Füllung verwendet
Text bleibt stehenFalsches TMP; fehlende Font-Asset-Fehler auf der Komponente
KI bearbeitet falsche ObjektePrompt: „Nur HUD_Root / Player anfassen; Level-Geometrie nicht bewegen“

Regel: Gameplay ändert Gesundheit; UI hört nur zu. Verwenden Sie nicht Find("HUD_HealthFill") in PlayerCombat – die nächste AI-Studio-Re-Export-Umbenennung würde auch den Kampf brechen.

Umgang mit HUD-Re-Exporten

Wenn Design aus AI Studio erneut exportiert:

  1. Behalten Sie HUD_HealthFill / HUD_Root-Namen wenn möglich
  2. Nach dem Re-Import nur Schritt-4-Referenzprüfungen erneut ausführen – nicht MCP PlayerHealth umschreiben lassen
  3. Ansichtsskript im Projekt behalten; bei Bedarf neu binden, wenn Prefab-Varianten-Referenzen gelöscht wurden

Einzeiliger Abgrenzungsprompt:

Dieser Durchgang behebt nur verlorene UI-Prefab-Referenzen. Ändern Sie keine Gameplay-Skripte unter Assets/Scripts/Combat.

Zusammenfassung

  1. AI Studio liefert HUD-Struktur in Unity
  2. PlayerHealth sendet (current, max)
  3. HudHealthView abonniert und aktualisiert fillAmount / Text
  4. Unity MCP hängt Komponenten an, füllt serialisierte Referenzen, wendet minimale Konsolen-Fixes an
  5. Abnahme mit Schadentaste + Play-Checkliste – nicht „Skript erfolgreich generiert“

Das schließt eine wiederholbare Schleife: UI in Engine → Event-Verdrahtung → Play-Abnahme. Beutel-, Mana- und Boss-Balken können dasselbe Muster kopieren.

Weitere Guides, die Sie interessieren könnten