← Zurück zum Blog

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.

Veröffentlicht
  • 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):

  1. Console / Stack → Skript- und Szenenobjekte
  2. Build-Einstellungen, fehlende Skripte, serialisierte Referenzen überprüfen
  3. 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:

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 sehenEbeneZuerst hier prüfen
Build schlägt fehl, error CS… / Typ nicht gefundenARuntime-Assembly, die auf UnityEditor verweist, falsches #if, asmdef
NRE / MissingReference in der Boot-SzeneB/CSzene in Build-Liste, fehlendes Skript, None im Inspektor
Nur bei Resources.Load / additiver Szene fehlgeschlagenCPfad-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:

  1. Notieren Sie Unity-Version und Ziel (z. B. Android / IL2CPP)
  2. Leeren Sie Window → General → Console, dann einmal Build oder Development Build
  3. Kopieren Sie den ersten relevanten Fehler (mit Stack) – nicht eine Wand von Warnungen
  4. Öffnen Sie File → Build Settings: Ist die verdächtige Szene aktiviert? Ist Index 0 die Boot-Szene?
  5. 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:

ManuellMCP-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

  • Update erreicht → nicht A (Kompilierung OK)
  • Stirbt bei Schaden → C (Laufzeit); Verdacht auf UI-Referenzen, nicht „Kampf neu schreiben“

Manuell

  1. Ist die Szene des HUD in den Build-Einstellungen?
  2. Wählen Sie das HudHealthView-Objekt aus; sind healthFill / playerHealth None?
  3. 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_HealthFill Image → healthFill; Player’s PlayerHealth → 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 UrsacheManuellMCP
Laufzeitskript verwendet Editor-APIIst die Datei außerhalb von Editor/?„Suche UnityEditor. außerhalb von Editor-Ordnern; liste nur Pfade auf.“
Invertiertes #if, Player-Typen fehlenPrü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:

  1. Szene nicht in Build-Einstellungen oder falsche Boot-Szene
  2. Fehlendes Skript / serialisiertes None (einschließlich nicht angewendetem Prefab)
  3. Additive Szene nicht geladen, bevor Find / Zugriff
  4. 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 EditorIm PaketTypische Ursache
Referenzen sehen gesetzt ausLaufzeit-NoneNicht angewendete Instanz-Overrides; falsche Szenendatei bearbeitet
Find funktioniertGerät nullObjekt in nicht geladener Szene; Namensabweichung
Resources.Load funktioniertGerät nullPfad-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

  1. Passende Fehler aus der Console verschwunden
  2. Editor Play durchläuft denselben fehlschlagenden Pfad (Level betreten, Schaden nehmen, UI öffnen…)
  3. Ein Development Build auf das Ziel (oder lokaler Player)
  4. MCP Nur-Lese-Überprüfung: verdächtige Felder nicht mehr None / Missing
  5. 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 tunTun
„Mach einfach Play funktionsfähig“Ebene A/B/C + Feld aus dem Stack pinnen
Massen-Find statt ReferenzenSerialisierte Felder fixen oder explizite Injektion
Build-Einstellungen ungefragt umordnenAktuelle 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:

SymptomRichtung
Development OK, Release stirbtManaged 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 HauptthreadsAsynchrone Callbacks prüfen, ob sie zum Hauptthread zurückkehren

Verschmelzen Sie Stripping und fehlende Skripte nicht zu einem „großen Rewrite“.

Zusammenfassung

  1. Editor OK / Paket kaputt → zuerst als Referenzen / Szenen im Build / Pfade / Editor-API behandeln
  2. Manuelles Einfrieren von Build-Einstellungen + erstem Fehler, dann MCP-Nur-Lese-Triage
  3. Stack → Skriptzeile → Komponentenfeld; nach Bestätigung neu verbinden oder leere Komponenten entfernen
  4. Kein Find oder Gameplay-Rewrites als Fake-Fixes
  5. 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.

Weitere Guides, die Sie interessieren könnten