← К блогу

HUD из AI Studio: привязка полоски HP через Unity MCP

HUD Prefab из VberAI Studio не двигается в Play? PlayerHealth → HudHealthView через Cursor + Unity MCP: события, fillAmount, чеклист приёмки.

Опубликовано
  • Unity MCP
  • AI Studio
  • HUD
  • Unity
  • Cursor
  • AI game development
  • tutorial

HUD из AI Studio: почему полоска HP не двигается

VberAI Studio уже отдал HUD Prefab в Unity — в Play полоска статична, потому что UI и PlayerHealth не связаны событиями. Unity MCP + Cursor: подписка, fillAmount, приёмка в Play.

ШагИнструментРезультат
Структура HUDAI StudioPrefab с HUD_HealthFill
ПроводкаCursor + Unity MCPPlayerHealth ↔ HudHealthView
ПриёмкаPlayПолоска при уроне / лечении

Экспорт UI: Figma → Unity. Установка MCP: Unity MCP. Godot‑аналог: полоска HP + Godot MCP.

См. также:

Сначала договоритесь об именах — важнее «красоты»

После экспорта из AI Studio код должен находить полоску HP по пути или сериализованным ссылкам. До экспорта (или сразу после импорта) зафиксируйте стабильные имена:

GameObject / назначениеРекомендуемое имяПримечание
Корень HUDHUD_RootУникален в сцене
Заливка HPHUD_HealthFillImage (Filled) или под Slider.fillRect
Опционально: текст значенияHUD_HealthTextTextMeshProUGUI, напр. 80/100
Опционально: вспышка уронаHUD_DamageFlashПолноэкранный или рамочный Image, по умолчанию прозрачный

Не называйте полоску Rectangle 42 или Group 3 — и MCP, и ручные скрипты унаследуют беспорядок.

Шаг 1: Убедитесь, что HUD в сцене

  1. Откройте сцену с игроком (напр. Game)
  2. В Hierarchy должен быть HUD_Root (или ваш эквивалент) с Image / Slider HP под ним
  3. Render Mode Canvas и связь с камерой настроены верно (Screen Space - Overlay — проще всего)

Дымовой тест только на чтение через MCP (сцену не менять):

Перечисли GameObject в активной сцене, в имени которых есть HUD, и типы UI-компонентов на них. Ничего не изменяй.

Если список пуст: переэкспортируйте/синхронизируйте из AI Studio или проверьте, не попал ли Prefab в не ту сцену.

Шаг 2: Геймплей отдаёт только «изменение HP», не ищет UI

Держите здоровье на игроке и рассылайте через C# event (или UnityEvent). HUD только подписывается; не меняйте логику через Find("Player").

Попросите Unity MCP из Cursor создать скрипт (пути под ваш проект):

Создай Assets/Scripts/Combat/PlayerHealth.cs:
- maxHealth, currentHealth (float)
- событие Action<float,float> OnHealthChanged(current, max)
- методы TakeDamage(float), Heal(float); значения в диапазоне 0..max
- после урона, если current<=0, снова вызови OnHealthChanged и опционально OnDied
- прикрепи к Player в сцене; в Start один раз разошли текущее HP
Не изменяй узлы HUD.

Эталонная реализация (сгенерируйте и проверьте):

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

Временная клавиша урона для проводки (удалить позже):

Добавь на Player временный DebugDealDamage.cs: по H наносит 10 урона PlayerHealth на том же объекте. Только для приёмки проводки.

Шаг 3: HUD-view только слушает события и обновляет полоску

Добавьте view-скрипт с сериализованными ссылками на полоску. Не делайте GameObject.Find каждый кадр в Update.

Создай Assets/Scripts/UI/HudHealthView.cs:
- сериализованный Image healthFill (Filled, Horizontal)
- опционально TMP_Text healthText
- сериализованный PlayerHealth playerHealth (или найди единственный PlayerHealth в Awake)
- OnEnable подпишись на OnHealthChanged; OnDisable отпишись
- в колбэке: healthFill.fillAmount = current/max; текст $"{current:0}/{max:0}"
- прикрепи к HUD_Root; назначь Image HUD_HealthFill в healthFill
- назначь PlayerHealth с Player в playerHealth

Эталон:

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;
        // если подписка позже Start — можно подтянуть вручную; здесь полагаемся на broadcast из 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)}";
    }
}

Если Image не Filled: пусть MCP выставит Image Type = Filled, Fill Method = Horizontal, затем привяжите fillAmount. С Slider пишите slider.value = t (minValue=0, maxValue=1) — тот же принцип.

Шаг 4: Unity MCP заполняет сериализованные ссылки (не пропускайте поля вручную)

После компиляции явно сформулируйте в Cursor:

В активной сцене:
1. Убедись, что на Player есть PlayerHealth; на HUD_Root — HudHealthView
2. Назначь HudHealthView.healthFill на Image с именем HUD_HealthFill
3. Назначь HudHealthView.playerHealth на PlayerHealth у Player
4. Если есть HUD_HealthText — назначь соответствующий TMP_Text
5. Сохрани сцену
Затем перечисли, остались ли None в сериализованных полях этих двух компонентов.

Повторная проверка только на чтение:

Проверь ссылки HudHealthView и PlayerHealth: есть ли missing script или поля None? Не меняй сцену, только отчёт.

Шаг 5: Чеклист приёмки в Play

Войдите в Play и отметьте всё — проводка готова только когда все пункты пройдены:

  1. При входе в сцену: полоска полная (или соответствует current/max), не пустая и не со старыми данными
  2. H (или удар по игроку): fillAmount падает; текст синхронно обновляется, если есть
  3. Урон до 0: полоска пуста; при логике смерти персонаж в состоянии смерти, HUD не дёргается
  4. Heal: полоска растёт (временная клавиша или предмет)
  5. Выход из Play и повторный вход: ссылки на месте, нет Missing Script

Пример промпта для приёмки:

Принимаю проводку HUD в Play mode. Если в Console NullReferenceException — укажи, PlayerHealth или HudHealthView, и какое сериализованное поле None. Сначала диагностика, минимальное исправление, жди моего OK перед правками.

Типичные точки отказа (по частоте)

СимптомСначала проверь
Полоска не двигается в PlayOnHealthChanged не подписан; урон не доходит до TakeDamage
NRE сразу при входе в PlayhealthFill / playerHealth всё ещё None
Полоска перевёрнута или скачетImage не Filled; за заливку взят не тот Rect (рамка)
Текст не обновляетсяНеверный TMP; нет шрифта — ошибка на компоненте
AI сломал чужие объектыВ промпте: «Только HUD_Root / Player, геометрию уровня не трогать»

Правило: геймплей меняет HP, UI только слушает. Не делайте Find("HUD_HealthFill") в PlayerCombat — после переименования при реэкспорте AI Studio сломается и боевой скрипт.

Как жить с повторным экспортом HUD

Когда дизайн меняет HUD в AI Studio и экспортирует снова:

  1. По возможности сохраняйте имена HUD_HealthFill / HUD_Root
  2. После реимпорта только шаг 4 — проверка ссылок; не переписывайте PlayerHealth через MCP
  3. View-скрипт остаётся в проекте; если ссылки на варианте Prefab сбросились — привяжите снова

Границы в одном промпте:

В этом проходе только потерянные ссылки UI Prefab. Не меняй геймплей-скрипты в Assets/Scripts/Combat.

Итог

  1. AI Studio доставляет структуру HUD в Unity
  2. PlayerHealth рассылает (current, max)
  3. HudHealthView подписывается и обновляет fillAmount / текст
  4. Unity MCP вешает компоненты, заполняет ссылки, делает минимальные правки по Console
  5. Приёмка — клавиша урона + чеклист Play, а не «скрипт успешно сгенерирован»

После этого у вас замкнутый цикл: UI в движок → проводка событий → приёмка в Play. Рюкзак, мана, полоска босса — тот же шаблон.

Часто задаваемые вопросы

HUD из AI Studio не обновляется в Play — что проверить?
Сначала имена HUD_HealthFill / HUD_Root, затем подписка PlayerHealth → View. Missing Script и None в Inspector — до MCP.

Нужен ли Unity MCP?
Ускоряет чтение Hierarchy и правку ссылок из Cursor. Можно вручную; MCP — для итераций на естественном языке.

Повторный экспорт HUD из Studio сбросил ссылки?
Сохраняйте те же имена узлов; перепривяжите только View, не переписывайте PlayerHealth.

Это про экспорт из Figma?
Нет — только проводка после импорта. Экспорт: Figma → Unity UI.

Другие статьи, которые могут вам понравиться