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.
| Шаг | Инструмент | Результат |
|---|---|---|
| Структура HUD | AI Studio | Prefab с HUD_HealthFill |
| Проводка | Cursor + Unity MCP | PlayerHealth ↔ HudHealthView |
| Приёмка | Play | Полоска при уроне / лечении |
Экспорт UI: Figma → Unity. Установка MCP: Unity MCP. Godot‑аналог: полоска HP + Godot MCP.
См. также:
Сначала договоритесь об именах — важнее «красоты»
После экспорта из AI Studio код должен находить полоску HP по пути или сериализованным ссылкам. До экспорта (или сразу после импорта) зафиксируйте стабильные имена:
| GameObject / назначение | Рекомендуемое имя | Примечание |
|---|---|---|
| Корень HUD | HUD_Root | Уникален в сцене |
| Заливка HP | HUD_HealthFill | Image (Filled) или под Slider.fillRect |
| Опционально: текст значения | HUD_HealthText | TextMeshProUGUI, напр. 80/100 |
| Опционально: вспышка урона | HUD_DamageFlash | Полноэкранный или рамочный Image, по умолчанию прозрачный |
Не называйте полоску Rectangle 42 или Group 3 — и MCP, и ручные скрипты унаследуют беспорядок.
Шаг 1: Убедитесь, что HUD в сцене
- Откройте сцену с игроком (напр.
Game) - В Hierarchy должен быть
HUD_Root(или ваш эквивалент) с Image / Slider HP под ним - 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 и отметьте всё — проводка готова только когда все пункты пройдены:
- При входе в сцену: полоска полная (или соответствует
current/max), не пустая и не со старыми данными - H (или удар по игроку):
fillAmountпадает; текст синхронно обновляется, если есть - Урон до 0: полоска пуста; при логике смерти персонаж в состоянии смерти, HUD не дёргается
- Heal: полоска растёт (временная клавиша или предмет)
- Выход из Play и повторный вход: ссылки на месте, нет Missing Script
Пример промпта для приёмки:
Принимаю проводку HUD в Play mode. Если в Console NullReferenceException — укажи, PlayerHealth или HudHealthView, и какое сериализованное поле None. Сначала диагностика, минимальное исправление, жди моего OK перед правками.
Типичные точки отказа (по частоте)
| Симптом | Сначала проверь |
|---|---|
| Полоска не двигается в Play | OnHealthChanged не подписан; урон не доходит до TakeDamage |
| NRE сразу при входе в Play | healthFill / playerHealth всё ещё None |
| Полоска перевёрнута или скачет | Image не Filled; за заливку взят не тот Rect (рамка) |
| Текст не обновляется | Неверный TMP; нет шрифта — ошибка на компоненте |
| AI сломал чужие объекты | В промпте: «Только HUD_Root / Player, геометрию уровня не трогать» |
Правило: геймплей меняет HP, UI только слушает. Не делайте Find("HUD_HealthFill") в PlayerCombat — после переименования при реэкспорте AI Studio сломается и боевой скрипт.
Как жить с повторным экспортом HUD
Когда дизайн меняет HUD в AI Studio и экспортирует снова:
- По возможности сохраняйте имена
HUD_HealthFill/HUD_Root - После реимпорта только шаг 4 — проверка ссылок; не переписывайте
PlayerHealthчерез MCP - View-скрипт остаётся в проекте; если ссылки на варианте Prefab сбросились — привяжите снова
Границы в одном промпте:
В этом проходе только потерянные ссылки UI Prefab. Не меняй геймплей-скрипты в Assets/Scripts/Combat.
Итог
- AI Studio доставляет структуру HUD в Unity
PlayerHealthрассылает(current, max)HudHealthViewподписывается и обновляетfillAmount/ текст- Unity MCP вешает компоненты, заполняет ссылки, делает минимальные правки по Console
- Приёмка — клавиша урона + чеклист 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.
Читайте дальше
Другие статьи, которые могут вам понравиться
Промпт для Godot: полоска HP через сигналы и Godot MCP
Промпт для Godot разработки с MCP: контракт сигнала health_changed, подключение HP-бара (полоска HP) без get_node — шаблон для Cursor, пример GDScript, приёмка в Play.
- Godot MCP
- Godot 4
- сигналы
- HUD
Пикселизация в VberAI Studio: HD → pixel art и экспорт в движок
VberAI Studio Pixelate: размер блока, палитра, цветовая гамма с предпросмотром — HD персонажи и карты в pixel art → Unity / Godot / Cocos.
- vberai
- ai-studio
- pixelate
- pixel-art
Предрелизные проверки UI: что проверить перед выпуском
Когда Prefab и логика готовы: финальный проход по UI на устройстве, локалях, Release-сборках и скинах событий — с путями исправления.
- game-ui-design
- game-dev-ai
- ui-to-engine
- ui-localization