Editor funktioniert, Build schlägt fehl: Console-Fehler mit Unity MCP auf Skript- und Szenen-Referenzen zurückführen
Wenn Unity Play funktioniert, aber Player-/Geräte-Builds fehlschlagen oder NRE beim Laden der Szene auftritt: Ebene A/B/C, mit Cursor + Unity MCP die Console lesen, Build-Einstellungen und serialisierte Referenzen prüfen – mit Stack-Beispiel, manuellen Checks und minimalen Fixes.
- Unity MCP
- Unity
- Console
- build
- Android
- Cursor
- troubleshooting
- AI game development
Threads mit dem Titel „Unity funktioniert im Editor, schlägt auf dem Gerät / Build fehl“ sehen gleich aus: Play ist in Ordnung, dann wird ein Player- / Geräte-Build rot, stürzt ab, wird schwarz oder wirft NullReferenceException beim Betreten der Szene. Die Engine ist selten „kaputt“ – der Editor-Pfad hat Referenz- und Plattformlücken versteckt: Szene nicht in der Build-Liste, serialisierte Felder, die auf der Festplatte None sind, Pfad-Groß-/Kleinschreibung oder UnityEditor-APIs, die bis zur Paketerstellung in eine Runtime-Assembly gelangt sind.
Dieser Beitrag hat drei Stränge (wie der Titel):
- Console / Stack → Skript- und Szenenobjekte
- Build-Einstellungen, fehlende Skripte, serialisierte Referenzen überprüfen
- Nur-Lese-Diagnose in Cursor über Unity MCP → minimaler Fix nach Bestätigung
Keine Plugin-Installationsanleitung, kein vollständiger Store-Veröffentlichungsleitfaden. IL2CPP-Stripping und native Plugins bleiben im Anhang.
Verwandt:
- Unity MCP installieren
- Unity MCP mit Claude Code und Cursor
- Ein AI-Studio-HUD an Health-Events anbinden (korrekte Verdrahtung; dieser Beitrag ist „wie man den Bruch findet“)
Zuerst: Welche Ebene ist fehlgeschlagen?
A. Build-Fenster rot (Kompilierungs- / Paketfehler)
↓
B. Build erfolgreich; Gerät stirbt oder wird beim Start schwarz
↓
C. Spiel startet; eine Szene oder Funktion explodiert zur Laufzeit
| Was Sie sehen | Ebene | Zuerst hier prüfen |
|---|---|---|
Build schlägt fehl, error CS… / Typ nicht gefunden | A | Runtime-Assembly, die auf UnityEditor verweist, falsches #if, asmdef |
| NRE / MissingReference in der Boot-Szene | B/C | Szene in Build-Liste, fehlendes Skript, None im Inspektor |
Nur bei Resources.Load / additiver Szene fehlgeschlagen | C | Pfad-Groß-/Kleinschreibung, Asset im Paket, Szene tatsächlich geladen |
Unity MCP ist am stärksten bei einem geöffneten Editor: Console, Hierarchie, Komponentenfelder. Geräte- logcat / Xcode-Stacks müssen in Cursor eingefügt werden – oder Sie erstellen einen Development Build und reproduzieren mit derselben Boot-Szene im Editor, wenn möglich.
Troubleshooting-Schleife (manuell + MCP)
Überspringen Sie nicht den manuellen Durchgang und bitten Sie KI nicht, den Player neu zu schreiben.
Schritt 0: Szene von Hand einfrieren (~2 Min.)
Vor Cursor:
- Notieren Sie Unity-Version und Ziel (z. B. Android / IL2CPP)
- Leeren Sie Window → General → Console, dann einmal Build oder Development Build
- Kopieren Sie den ersten relevanten Fehler (mit Stack) – nicht eine Wand von Warnungen
- Öffnen Sie File → Build Settings: Ist die verdächtige Szene aktiviert? Ist Index 0 die Boot-Szene?
- Wenn Sie eine Prefab-Instanz bearbeitet haben: Haben Sie Apply gedrückt? Nicht angewendete Overrides erreichen oft nie das Festplatten-Asset, das Sie zu versenden glauben
Schritt 1: MCP Nur-Lese-Console-Triage
Fasse Console-Fehler zu diesem Build / letztem Play zusammen (ignoriere Info).
Klassifiziere als Kompilierungsfehler / fehlendes Skript / NullReference / Ressourcenladen.
Liste Skriptpfad, Zeile, GameObject-Name pro Fehler auf, wenn vorhanden.
Ändere keine Assets.
Schritt 2: Manuelles + MCP „Referenz-Trio“
Für Laufzeit-NREs (B/C) wählen Sie das Stack-Objekt im Editor aus und überprüfen Sie es mit MCP:
| Manuell | MCP-Prompt |
|---|---|
| Build-Einstellungsliste (Screenshot oder Diktat) | „Liste Build-Settings-Szenenpfade und aktivierte Flags auf; benenne die Boot-Szene.“ |
| Inspektor: fehlendes Skript / None-Referenzen | „In Szene <Name> liste fehlende Skripte auf; überprüfe serialisierte Felder auf <Objekt>.<Komponente> auf None. Nur Tabelle. Nicht bearbeiten.“ |
| Prefab-Asset vs. Szeneninstanz | „Ist <X> ein Prefab-Asset oder eine Szeneninstanz? Gibt es sichtbare nicht angewendete Overrides? Nur berichten.“ |
Regel: Pakete verwenden auf der Festplatte gespeicherte Szenen/Prefabs. Temporäre OnValidate-Füllungen, die im Editor „gut aussehen“, zählen nicht – vertrauen Sie serialisierten Werten von MCP/Inspektor.
Schritt 3: Diagnosevorlage, dann bestätigen
[Constraints]
- Diagnostiziere und schlage einen minimalen Plan vor; warte auf mein OK, bevor du bearbeitest
- Tue nicht so, als ob du mit massenhaft GameObject.Find einen Fix fälschst
- Berühre nur Skripte/Prefabs/Szenen, die mit diesem Fehler verbunden sind
[Szene]
- Editor Play: OK / kaputt (wahrheitsgemäß)
- Plattform / Build: …
- Build-Settings-Boot-Szene: …
- Console / Geräte-Stack (roh):
<einfügen>
[Antwort]
1. Ebene A / B / C
2. Top 1–2 Grundursachen (nicht im Build / None-Referenz / fehlendes Skript / Groß-/Kleinschreibung / Editor-API…)
3. Objekte und Feldnamen, die ich überprüfen sollte
4. Minimale Fix-Schritte (noch nicht ausführen)
Schritt 4: Minimales Schreiben + erneute Überprüfung
Wende den bestätigten minimalen Fix an: nur <Objekt.Feld> oder die wenigen Zeilen in <Skriptpfad> für diesen Fehler.
Speichere Szene/Prefab.
Dann Nur-Lese-Überprüfung: Sind Felder immer noch None? Gleicher Fehler noch in der Console?
Durchgearbeitetes Beispiel: Stack → Feld
Synthetisches, aber realistisches Player-/Geräteprotokoll (Pfade für Ihr Projekt austauschen).
Protokoll
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
Ebene
Updateerreicht → nicht A (Kompilierung OK)- Stirbt bei Schaden → C (Laufzeit); Verdacht auf UI-Referenzen, nicht „Kampf neu schreiben“
Manuell
- Ist die Szene des HUD in den Build-Einstellungen?
- Wählen Sie das
HudHealthView-Objekt aus; sindhealthFill/playerHealthNone? - Prefab-Bearbeitungen: Angewendet?
MCP
Nur-Lese: Öffne die Szene, die das HUD enthält.
1. Finde Objekte mit HudHealthView
2. Berichte, ob healthFill, playerHealth (und Gleichgesinnte) None / Missing sind
3. Nicht bearbeiten
Wenn None: minimaler Plan ist, Referenzen neu zuzuweisen und zu speichern – nicht TakeDamage ändern.
Minimaler Fix (nach OK)
- Ziehen Sie
HUD_HealthFillImage →healthFill; Player’sPlayerHealth→playerHealth - Speichern; Development Build; erneut Schaden nehmen
Schlechter „Fix“ (nicht tun)
// Anti-Pattern: Find versteckt None – bricht immer noch bei Umbenennung / additivem Laden
healthFill = GameObject.Find("HUD_HealthFill").GetComponent<Image>();
Korrekte Verdrahtung: HUD → Health-Events. Hier: Feld aus dem Stack pinnen, dann neu verbinden.
Symptom-Matrix (Strang)
Symptom 1: Build rot – Typ nicht gefunden / UnityEditor
| Wahrscheinliche Ursache | Manuell | MCP |
|---|---|---|
| Laufzeitskript verwendet Editor-API | Ist die Datei außerhalb von Editor/? | „Suche UnityEditor. außerhalb von Editor-Ordnern; liste nur Pfade auf.“ |
Invertiertes #if, Player-Typen fehlen | Prüfen Sie, ob UNITY_EDITOR umschließt | „Welche Typen existieren unter Editor vs. Player für diese Datei?“ |
| asmdef-Lücke | Öffnen Sie die fehlschlagende .asmdef | „Liste asmdef-Referenzen auf; welche fehlt?“ |
Anti-Pattern (Editor-API in einer Runtime-Assembly → Player-Build schlägt fehl):
using UnityEngine;
using UnityEditor; // Schlägt fehl, wenn keine Editor-Assembly
public class BadBake : MonoBehaviour
{
[MenuItem("Tools/Bad")] // weitere UnityEditor-Abhängigkeit
static void Run() { }
}
Fix A: ganze Datei unter Editor/
Assets/Scripts/Editor/BakeTools.cs ← nur Editor-Kompilierung
Fix B: In-Datei isolieren (nur wenn Sie eine Datei teilen müssen)
using UnityEngine;
public class RuntimeSafe : MonoBehaviour
{
public void DoGameplay() { /* für Player sichtbar */ }
#if UNITY_EDITOR
[ContextMenu("Debug/Fill Refs")]
void EditorOnlyFill()
{
// Nur Editor – nicht als gepackte Laufzeitdaten von Awake behandeln
}
#endif
}
Noch sauberer: Nur-Editor-Skripte + asmdef, damit Runtime-Assemblies nie Editor-Referenzen mitziehen.
Symptom 2: Geräte-NRE beim Betreten der Szene; Editor Play „scheint in Ordnung“
In dieser Reihenfolge prüfen – kein paralleles Mega-Rewrite:
- Szene nicht in Build-Einstellungen oder falsche Boot-Szene
- Fehlendes Skript / serialisiertes None (einschließlich nicht angewendetem Prefab)
- Additive Szene nicht geladen, bevor Find / Zugriff
Resources.Load-Pfad-Groß-/Kleinschreibung (macOS-Editor oft case-insensitiv; Android nicht)
1. Berichte Build-Settings-Szenen, aktivierte Flags, Boot-Index
2. Liste alle fehlenden Skripte in Szene <X> auf
3. Überprüfe öffentliche Referenzen auf GameManager / Player / HUD entlang des Boot-Pfads auf None
Nur berichten; nicht bearbeiten.
| Im Editor | Im Paket | Typische Ursache |
|---|---|---|
| Referenzen sehen gesetzt aus | Laufzeit-None | Nicht angewendete Instanz-Overrides; falsche Szenendatei bearbeitet |
Find funktioniert | Gerät null | Objekt in nicht geladener Szene; Namensabweichung |
Resources.Load funktioniert | Gerät null | Pfad-Groß-/Kleinschreibung; Asset nicht unter Resources/ |
// Auf der Festplatte: Assets/Resources/UI/HealthBar.png
// Schlägt oft auf Android fehl (Groß-/Kleinschreibung):
Resources.Load<Sprite>("ui/healthbar");
// Pfad unter Resources abgleichen, z. B.:
Resources.Load<Sprite>("UI/HealthBar");
Suche Resources.Load / Addressables.LoadAssetAsync-Pfadzeichenfolgen;
erstelle eine case-sensitive Tabelle vs. echte relative Pfade. Code noch nicht bearbeiten.
Symptom 3: Console überflutet mit fehlenden Skripten
Scanne Szene <X> und Prefab <Pfad>:
Liste GameObject-Pfade mit fehlenden Skripten auf.
Pro Element: schlage vor, das ursprüngliche Skript wieder anzubringen oder die leere Komponente zu entfernen (aus Restname/GUID, wenn sichtbar).
Nicht automatisch massenhaft löschen.
Manuell: Bestätigen Sie, dass die Skriptdatei noch existiert und asmdef/GUID nicht gebrochen ist; einzeln bestätigen, bevor Sie Leeren löschen.
Abnahmekriterien
- Passende Fehler aus der Console verschwunden
- Editor Play durchläuft denselben fehlschlagenden Pfad (Level betreten, Schaden nehmen, UI öffnen…)
- Ein Development Build auf das Ziel (oder lokaler Player)
- MCP Nur-Lese-Überprüfung: verdächtige Felder nicht mehr None / Missing
- Git-Diff nur die erwartete kleine Szenen-/Prefab-/Skriptänderung – kein Refactoring nebenbei
Nur-Lese-Überprüfung: Gibt es None oder fehlende Skripte auf <Objektliste>? Liste Ausnahmen auf. Nicht bearbeiten.
Prompt-Rotlinien
| Nicht tun | Tun |
|---|---|
| „Mach einfach Play funktionsfähig“ | Ebene A/B/C + Feld aus dem Stack pinnen |
Massen-Find statt Referenzen | Serialisierte Felder fixen oder explizite Injektion |
| Build-Einstellungen ungefragt umordnen | Aktuelle Liste und Boot-Szene zuerst berichten |
| „Es gibt eine NRE“ | Erste 20–40 Stack-Zeilen einfügen |
Produktgrenzen
- Unity MCP: Editor-Console, Hierarchie, Skripte, Referenzen – der Strang dieses Artikels.
- AI Studio: UI-Struktur in die Engine; nach Re-Export gemäß Verdrahtungsbeitrag neu verbinden – nicht UI aus Gameplay finden.
- Zertifikate, Stores, OEM-ROMs: Protokolltext in Cursor einfügen, um Lesen zu helfen; außerhalb des MCP-Szenenbearbeitungsbereichs.
Anhang: Häufig, aber nicht zum Strang gehörend
Schließen Sie zuerst den Strang dieses Artikels aus:
| Symptom | Richtung |
|---|---|
| Development OK, Release stirbt | Managed Stripping / link.xml; MCP: „Rate gestrippte Typen aus Crash-Stack; schlage link.xml vor; schreibe noch keine Dateien.“ |
| Android-nativer Absturz (unmanaged) | .so / Berechtigungen / Gradle; logcat zum Lesen einfügen |
| Unity-API außerhalb des Hauptthreads | Asynchrone Callbacks prüfen, ob sie zum Hauptthread zurückkehren |
Verschmelzen Sie Stripping und fehlende Skripte nicht zu einem „großen Rewrite“.
Zusammenfassung
- Editor OK / Paket kaputt → zuerst als Referenzen / Szenen im Build / Pfade / Editor-API behandeln
- Manuelles Einfrieren von Build-Einstellungen + erstem Fehler, dann MCP-Nur-Lese-Triage
- Stack → Skriptzeile → Komponentenfeld; nach Bestätigung neu verbinden oder leere Komponenten entfernen
- Kein
Findoder Gameplay-Rewrites als Fake-Fixes - Mit Development Build + Nur-Lese-Überprüfung akzeptieren
Führen Sie „Einfrieren → Ebene → Referenz-Trio → Feld pinnen wie im Beispiel“ aus, und die meisten Geräte-Referenzfehler schrumpfen zu einem überprüfbaren kleinen Diff.
Weiterlesen
Weitere Guides, die Sie interessieren könnten
KI-Spiel-UI: Prefab-YAML nicht bearbeiten – nutze das Canvas für den Export nach Unity / Godot / Cocos
Warum LLMs beim KI-Zusammenbau von Spiel-UI kein Prefab-YAML lesen oder schreiben sollten. Middle-Layer-Workflow, deterministischer Export und VberAI Studio Canvas von Figma / PSD zu Unity-, Godot- und Cocos-Prefabs.
- game-ui-design
- game-dev-ai
- ui-to-engine
- figma-to-unity
Figma zu Godot UI: Exportieren einer Control-Hierarchie mit AI Studio (Schritt für Schritt)
Figma-Spiel-UI in Godot importieren: Frame-Struktur in VberAI Studio beibehalten, Control-Knotenhierarchie exportieren und Layout sowie Theme im Editor prüfen.
- figma-to-godot
- figma
- godot
- ai-studio
Game-UI-Design: Traditioneller Workflow vs. KI-Grafik + VberAI Studio-Aufteilung
PS/Figma manuelles Slicing vs. VberAI Studio: UI importieren oder KI-generieren, Layer automatisch trennen, PSD oder Bildsets exportieren. Effekte, Schritte, Demos.
- game-ui-design
- game-ui-designer-flow
- ui-slicing
- AIGC