← К блогу

В редакторе OK, сборка падает: Unity MCP, Console и Missing Script

Unity works in editor, fails on build: Play в порядке, Player/Android падает. Слои Console, Build Settings, сериализованные ссылки; Cursor + Unity MCP только на чтение.

Опубликовано
  • Unity MCP
  • Unity
  • Console
  • build
  • Android
  • Cursor
  • troubleshooting
  • AI game development

В редакторе OK, сборка падает — с чего начать

Unity works in editor, fails on build (Play в порядке, Player / Android — краш или NRE): чаще всего ссылки и Build Settings, а не «сломанный MCP».

Три шага:

  1. Console / стек → скрипт и объекты сцены
  2. Build Settings, Missing Script, сериализованные поля None
  3. Cursor + Unity MCP — только чтение; правки после вашего подтверждения

Не путайте: «MCP Running, но Editor не в active instances» — другая проблема, не падение сборки.

См. также:

Без установки плагина и полного пайплайна в стор. IL2CPP stripping и нативные плагины — в приложении в конце.

Сначала: на каком слое сбой?

A. Красное окно сборки (ошибка компиляции / упаковки)
        ↓
B. Пакет собирается, устройство падает / чёрный экран при запуске
        ↓
C. Игра запускается, падает в сцене или при конкретной функции (runtime)
Что видитеСлойСначала смотрим здесь
Сборка падает, error CS… / тип не найденARuntime-сборка ссылается на UnityEditor, условная компиляция, asmdef
NRE / MissingReference в стартовой сценеB/CСцена в сборке, Missing Script, None в Inspector
Падает только на Resources.Load / аддитивной сценеCРегистр пути, ресурс в пакете, сцена загружена

Unity MCP силён на открытом редакторе: Console, Hierarchy, поля компонентов. logcat / Xcode с устройства нужно вставить в Cursor; или сначала Development Build и по возможности воспроизвести ту же стартовую сцену в Editor.

Цикл отладки (ручная проверка + MCP)

При каждом сбое — по порядку. Не пропускайте ручной этап и не просите AI переписать Player.

Шаг 0: Зафиксировать сцену вручную (~2 мин)

До Cursor:

  1. Запишите версию Unity и цель (например Android / IL2CPP)
  2. Очистите Window → General → Console, затем Build или Development Build один раз
  3. Скопируйте первую релевантную Error (со стеком) — не стену Warning
  4. Откройте File → Build Settings: подозрительная сцена отмечена? Индекс 0 — стартовая сцена?
  5. Если меняли Prefab: сделали ли Apply на экземпляре? Неприменённые оверрайды часто не попадают на диск и не в чужой пакет

Шаг 1: MCP, только чтение — классификация Console

Суммируйте Error в Console, связанные с этой сборкой / последним Play (Info игнорировать).
Классифицируйте: ошибка компиляции / Missing Script / NullReference / загрузка ресурса.
Для каждой ошибки укажите путь скрипта, строку, имя GameObject (если есть в логе).
Не изменяйте ресурсы.

Шаг 2: Ручная проверка + MCP — «тройка ссылок»

Для runtime NRE (B/C) откройте объект из стека в редакторе и сверьте с MCP:

ВручнуюПромпт MCP
Список сцен Build Settings (скрин или устно)«Перечислите пути сцен в Build Settings и флаги enabled; укажите стартовую сцену.»
Inspector: Missing Script / ссылки None«В сцене <Name> перечислите Missing Script; проверьте сериализованные поля <Object>.<Component> на None. Только таблица. Не редактировать.»
Prefab-ассет vs экземпляр в сцене«<X> — Prefab-ассет или экземпляр в сцене? Есть неприменённые оверрайды (если видны)? Только отчёт.»

Правило: в пакет идут сцены/Prefab с диска. Временные подстановки через OnValidate, которые «выглядят нормально» в Editor, не считаются — доверяйте сериализованным значениям из MCP/Inspector.

Шаг 3: Шаблон диагностики, затем подтверждение

[Ограничения]
- Сначала диагноз и минимальный план; ждать моего ОК перед правками
- Не маскировать исправление массовым GameObject.Find
- Трогать только скрипты/Prefab/сцены, связанные с этой Error

[Контекст]
- Editor Play: OK / сломано (честно)
- Платформа и сборка: …
- Стартовая сцена в Build Settings: …
- Console / стек с устройства (как есть):
<вставить>

[Ответить]
1. Слой A / B / C
2. 1–2 наиболее вероятные причины (не в сборке / None / Missing Script / регистр / Editor API…)
3. Объекты и имена полей для моей проверки
4. Минимальные шаги исправления (ещё не выполнять)

Шаг 4: Минимальная запись после подтверждения + перепроверка

Применить подтверждённое минимальное исправление: только <объект.поле> или несколько строк в <путь скрипта> для этой Error.
Сохранить сцену/Prefab.
Затем только чтение: поля всё ещё None? Та же Error в Console?

Полный пример: от NRE-стека к полю

Ниже реалистичный лог устройства/Player (типичная структура; пути под свой проект).

Лог

NullReferenceException: Object reference not set to an instance of an object
  at HudHealthView.HandleHealthChanged (System.Single current, System.Single max) [0x00000] in Assets/Scripts/UI/HudHealthView.cs:42
  at PlayerHealth.TakeDamage (System.Single amount) [0x00000] in Assets/Scripts/Combat/PlayerHealth.cs:28
  at DebugDealDamage.Update () [0x00000] in Assets/Scripts/Debug/DebugDealDamage.cs:15

Слой

  • Дошли до Update в Play/пакете → не A (компиляция OK)
  • Падает при уроне → C (runtime); подозрение на UI-ссылки, не «переписать бой»

Вручную

  1. Сцена с HUD в Build Settings?
  2. Открыть сцену, выбрать объект с HudHealthView; healthFill / playerHealth — None?
  3. Меняли Prefab: Apply?

Для MCP

Только чтение: открыть сцену с HUD.
1. Найти объекты с HudHealthView
2. Сообщить, None / Missing ли healthFill, playerHealth (и аналоги)
3. Не редактировать
Если None: минимальный план — переназначить ссылки и сохранить, а не менять логику TakeDamage.

Минимальное исправление (после ОК)

  • Перетащить Image HUD_HealthFill → healthFill, PlayerHealth с Player → playerHealth
  • Сохранить сцену; Development Build и снова получить урон

Плохое «исправление» (не делать)

// Антипаттерн: Find скрывает None — сломается при переименовании / аддитивной загрузке
healthFill = GameObject.Find("HUD_HealthFill").GetComponent<Image>();

Правильная проводка: HUD → события здоровья. Здесь нужно: зафиксировать поле по стеку, затем перепривязать.

Матрица симптомов (опорная линия)

Симптом 1: Красная сборка — тип не найден / UnityEditor

Вероятная причинаВручнуюMCP
Runtime-скрипт использует Editor APIФайл вне Editor/?«Искать UnityEditor. вне папок Editor; только пути.»
Перепутан #if, в Player нет типовПроверить обёртки UNITY_EDITOR«Какие типы видны в Editor vs Player для этого файла?»
Пробел в asmdefОткрыть .asmdef с ошибкой«Список ссылок asmdef; чего не хватает?»

Антипаттерн (Editor API в runtime-сборке → сборка Player падает):

using UnityEngine;
using UnityEditor; // Сборка падает, если не Editor-сборка

public class BadBake : MonoBehaviour
{
    [MenuItem("Tools/Bad")] // ещё зависимость от UnityEditor
    static void Run() { }
}

Исправление A: весь файл в Editor/

Assets/Scripts/Editor/BakeTools.cs   ← только редактор

Исправление B: изоляция в одном файле (только если нужен общий файл)

using UnityEngine;

public class RuntimeSafe : MonoBehaviour
{
    public void DoGameplay() { /* видно Player */ }

#if UNITY_EDITOR
    [ContextMenu("Debug/Fill Refs")]
    void EditorOnlyFill()
    {
        // Только редактор — не полагаться на это в Awake как на данные для пакета
    }
#endif
}

Чище: скрипты только для Editor + asmdef, чтобы runtime-сборки не тащили Editor-ссылки.

Симптом 2: NRE на устройстве при входе в сцену; Editor Play «вроде нормально»

Проверять по порядку — без параллельного мегарефакторинга:

  1. Сцена не в Build Settings или не та стартовая
  2. Missing Script / сериализованный None (включая неприменённый Prefab)
  3. Аддитивная сцена не загружена до Find / доступа
  4. Регистр пути Resources.Load (macOS Editor часто без учёта регистра; Android — с учётом)
1. Сообщить список сцен Build Settings, флаги enabled, индекс стартовой
2. Все Missing Script в сцене <X>
3. Публичные ссылки GameManager / Player / HUD на пути запуска — None?
Только отчёт, без правок.
В редактореВ пакетеТипичная причина
Ссылки выглядят заданнымиRuntime NoneОверрайды экземпляра не Apply; правили не тот файл сцены
Find находитНа устройстве nullОбъект в незагруженной сцене; несовпадение имён
Resources.Load OKНа устройстве nullРегистр пути; ресурс не в Resources/
// На диске: Assets/Resources/UI/HealthBar.png
// Часто падает на Android (несовпадение регистра):
Resources.Load<Sprite>("ui/healthbar");
// Должно совпадать с путём под Resources, например:
Resources.Load<Sprite>("UI/HealthBar");
Найти строки путей Resources.Load / Addressables.LoadAssetAsync в проекте;
составить таблицу сравнения регистра с реальными относительными путями. Код пока не менять.

Симптом 3: Console засыпан Missing Script

Сканировать сцену <X> и Prefab <path>:
Перечислить пути GameObject с Missing Script.
Для каждого: предложить вернуть исходный скрипт или удалить пустой компонент (по остаточному имени/GUID, если видно).
Не удалять пакетно автоматически.

Вручную: в Project убедиться, что файл скрипта на месте, asmdef/GUID не сломаны; подтверждать по одному перед удалением пустых компонентов.

Чеклист приёмки

  1. Похожие Error исчезли из Console
  2. Editor Play проходит тот же падающий путь (вход в уровень, урон, UI…)
  3. Один Development Build на цель (или локальный Player)
  4. MCP только чтение: подозрительные поля больше не None / Missing
  5. Git diff — только ожидаемые мелкие правки сцены/Prefab/скрипта, без «заодно рефакторинга»
Только чтение: на <список объектов> остались None или Missing Script? Перечислить исключения. Не редактировать.

Красные линии промптов

Не делатьДелать
«Просто сделай Play»Слой A/B/C + поле по стеку
Массовый Find вместо ссылокЧинить сериализованные поля или явную инъекцию
Менять порядок Build Settings без спросаСначала отчёт о текущем списке и стартовой сцене
«Есть NRE»Вставить первые 20–40 строк стека

Границы продукта

  • Unity MCP: Console, Hierarchy, скрипты и ссылки в редакторе — опорная линия этой статьи.
  • AI Studio: UI-структура в движок; после реэкспорта перепривязать по статье о проводке — не искать UI из геймплея через Find.
  • Сертификаты, сторы, ROM вендоров: вставить текст лога в Cursor для помощи в чтении; вне зоны правки сцен MCP.

Приложение: часто, но вне опорной линии

Сначала исключите опорную линию этой статьи:

СимптомНаправление
Development OK, Release падаетManaged Stripping / link.xml; MCP: «Угадать вырезанные типы по стеку краша; предложить link.xml; файлы пока не писать.»
Только нативный краш Android (неуправляемый стек).so / разрешения / Gradle; вставить logcat для чтения
Unity API не в главном потокеПроверить, возвращаются ли async-колбэки в главный поток

Не смешивайте stripping и Missing Script в один «большой рефакторинг».

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

Unity works in editor, fails on build — почему?
Play использует открытые сцены редактора; Player — только сцены из Build Settings и сериализованные ссылки на диске. Часто: сцена не в списке, Missing Script, поле None.

Нужен ли Unity MCP для этого?
Не обязателен, но ускоряет чтение Console и Hierarchy из Cursor. Установка: Unity MCP.

Editor OK, но MCP не видит Unity?
Это не эта статья — см. active instances.

Development Build OK, Release падает?
Часто Managed Stripping / link.xml — см. приложение ниже; сначала исключите Missing Script.

Итог

  1. Editor OK / пакет сломан → сначала ссылки / сцены в сборке / пути / Editor API
  2. Вручную зафиксировать Build Settings и первую Error, затем MCP только чтение
  3. Стек → строка скрипта → поле компонента; перепривязать или удалить пустые компоненты после подтверждения
  4. Не маскировать Find и переписыванием геймплея
  5. Принять через Development Build + перепроверку только чтением

Прогон «зафиксировать → слой → тройка ссылок → поле как в примере» сжимает большинство ref-багов на устройстве до небольшого diff для ревью.

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

Дизайн игрового UI: традиционный процесс против AI-арта + разделение в VberAI Studio

Сравнение ручной нарезки в PS/Figma и VberAI Studio: импорт или AI-генерация UI, авторазделение слоёв, экспорт слоёного PSD или наборов изображений. Эффекты, шаги и демо-видео.

  • game-ui-design
  • game-ui-designer-flow
  • ui-slicing
  • AIGC
Читать

AI-интерфейс игры: не редактируйте Prefab YAML — используйте Canvas для экспорта в Unity / Godot / Cocos

Почему LLM не должны читать или писать Prefab YAML при сборке игрового UI с помощью ИИ. Промежуточный слой, детерминированный экспорт и путь Canvas в VberAI Studio из Figma / PSD в Unity, Godot и Cocos Prefab.

  • game-ui-design
  • game-dev-ai
  • ui-to-engine
  • figma-to-unity
Читать