← Torna al blog

L'Editor funziona, la Build fallisce: traccia gli errori della Console fino a Script e riferimenti di scena con Unity MCP

Quando Play in Unity funziona ma le build Player/dispositivo falliscono o danno NRE al caricamento della scena: layer A/B/C, usa Cursor + Unity MCP per leggere la Console, verificare Build Settings e riferimenti serializzati—con esempio di stack, controlli manuali e fix minimi.

Pubblicato
  • Unity MCP
  • Unity
  • Console
  • build
  • Android
  • Cursor
  • troubleshooting
  • AI game development

Thread con titoli come “Unity funziona nell’editor, fallisce su dispositivo/build” sembrano tutti uguali: Play funziona, poi una build Player/dispositivo va in rosso, crasha, si oscura o lancia NullReferenceException all’ingresso in scena. Il motore raramente è “rotto”: il percorso dell’editor ha nascosto riferimenti e lacune di piattaforma: scena non nella lista di build, campi serializzati che sono None su disco, sensibilità al maiuscolo/minuscolo nei percorsi, o API UnityEditor finite in un assembly runtime fino al momento del packing.

Questo post ha tre spine (come il titolo):

  1. Console / stack → oggetti script e scena
  2. Verifica Build Settings, Missing Script, riferimenti serializzati
  3. Diagnosi in sola lettura in Cursor tramite Unity MCP → fix minimo dopo la conferma

Niente guida all’installazione di plugin, niente guida completa per lo store. Lo stripping IL2CPP e i plugin nativi restano in appendice.

Correlati:

Primo: quale layer è fallito?

A. Finestra Build rossa (errore di compilazione / packing)
        ↓
B. Build riesce; il dispositivo muore o si oscura all'avvio
        ↓
C. Il gioco parte; una scena o funzionalità esplode a runtime
Cosa vediLayerControlla prima qui
Build fallisce, error CS… / tipo non trovatoAAssembly runtime che referenzia UnityEditor, #if sbagliato, asmdef
NRE / MissingReference sulla scena di avvioB/CScena nella lista di build, Missing Script, None nell’Inspector
Fallisce solo su Resources.Load / scena additivaCMaiuscole/minuscole nel percorso, asset nel pack, scena effettivamente caricata

Unity MCP è più forte su un editor aperto: Console, Hierarchy, campi dei componenti. Gli stack di logcat / Xcode del dispositivo devono essere incollati in Cursor—oppure crea una Development Build e riproduci con la stessa scena di avvio nell’Editor quando puoi.

Loop di risoluzione problemi (manuale + MCP)

Non saltare il passaggio manuale e chiedere all’AI di riscrivere il Player.

Step 0: Congela la scena a mano (~2 min)

Prima di Cursor:

  1. Annota versione Unity e target (es. Android / IL2CPP)
  2. Pulisci Window → General → Console, poi Build o Development Build una volta
  3. Copia il primo Errore rilevante (con stack)—non un muro di Warning
  4. Apri File → Build Settings: la scena sospetta è spuntata? L’indice 0 è la scena di avvio?
  5. Se hai modificato un’istanza di Prefab: hai fatto Apply? Le override non applicate spesso non raggiungono l’asset su disco che pensi di aver spedito

Step 1: Triage MCP in sola lettura della Console

Riassumi gli Errori della Console relativi a questa build / ultimo Play (ignora Info).
Classifica come errore di compilazione / Missing Script / NullReference / caricamento risorse.
Elenca percorso script, riga, nome GameObject per ogni errore quando presente.
Non modificare alcun asset.

Step 2: “Trio di riferimenti” manuale + MCP

Per NRE a runtime (B/C), seleziona l’oggetto dello stack nell’editor e incrocia con MCP:

ManualePrompt MCP
Elenco Build Settings (screenshot o dettatura)“Elenca i percorsi delle scene in Build Settings e i flag abilitati; nomina la scena di avvio.”
Inspector: Missing Script / riferimenti None”Nella scena <Nome>, elenca i Missing Script; controlla i campi serializzati su <Oggetto>.<Componente> per None. Solo tabella. Non modificare.”
Asset Prefab vs istanza in scena”<X> è un asset Prefab o un’istanza in scena? Ci sono override non applicate se visibili? Riporta solo.”

Regola: I pack usano scene/Prefab su disco. I riempimenti temporanei di OnValidate che “sembrano a posto” nell’Editor non contano—fidati dei valori serializzati da MCP/Inspector.

Step 3: Modello di diagnosi, poi conferma

[Vincoli]
- Diagnosi e proposta di piano minimo; attendi il mio OK prima di modificare
- Non fingere un fix con massicci GameObject.Find
- Tocca solo script/Prefab/scene legati a questo Errore

[Scena]
- Play in Editor: OK / rotto (veritiero)
- Piattaforma / build: …
- Scena di avvio in Build Settings: …
- Stack Console / dispositivo (grezzo):
<incolla>

[Risposta]
1. Layer A / B / C
2. Top 1–2 cause principali (non in build / ref None / Missing Script / maiuscole / API Editor…)
3. Oggetti e nomi di campi che devo verificare
4. Passi di fix minimo (ancora non eseguire)

Step 4: Scrittura minima + riverifica

Applica il fix minimo confermato: solo <oggetto.campo> o le poche righe in <percorso script> per questo Errore.
Salva scena/Prefab.
Poi riverifica in sola lettura: i campi sono ancora None? Lo stesso Errore è ancora in Console?

Esempio pratico: stack → campo

Log sintetico ma realistico di Player/dispositivo (sostituisci i percorsi con quelli del tuo progetto).

Log

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

Layer

  • Raggiunto Update → non A (compilazione OK)
  • Muore su danno → C (runtime); sospetta riferimenti UI, non “riscrivi il combat”

Manuale

  1. La scena dell’HUD è in Build Settings?
  2. Seleziona l’oggetto HudHealthView; healthFill / playerHealth sono None?
  3. Modifiche Prefab: Applicate?

MCP

Sola lettura: apri la scena che contiene l'HUD.
1. Trova oggetti con HudHealthView
2. Riporta se healthFill, playerHealth (e simili) sono None / Missing
3. Non modificare
Se None: il piano minimo è riassegnare i riferimenti e salvare—non cambiare TakeDamage.

Fix minimo (dopo OK)

  • Trascina l’immagine HUD_HealthFill → healthFill; il PlayerHealth del Player → playerHealth
  • Salva; Development Build; subisci danno di nuovo

”Fix” sbagliato (da non fare)

// Anti-pattern: Find nasconde None — si rompe comunque su rename / caricamento additivo
healthFill = GameObject.Find("HUD_HealthFill").GetComponent<Image>();

Cablaggio corretto: HUD → eventi di salute. Qui: fissa il campo dallo stack, poi rilega.

Matrice dei sintomi (spina)

Sintomo 1: Build rossa — tipo non trovato / UnityEditor

Causa probabileManualeMCP
Script runtime usa API EditorIl file è fuori da Editor/?”Cerca UnityEditor. fuori dalle cartelle Editor; elenca solo i percorsi.”
#if invertito, tipi mancanti nel PlayerControlla che UNITY_EDITOR avvolga”Quali tipi esistono in Editor vs Player per questo file?”
Lacuna asmdefApri il .asmdef che fallisce”Elenca i riferimenti asmdef; quale manca?”

Anti-pattern (API Editor in assembly runtime → build Player fallisce):

using UnityEngine;
using UnityEditor; // Fallisce la build se non è un assembly Editor

public class BadBake : MonoBehaviour
{
    [MenuItem("Tools/Bad")] // ulteriore dipendenza da UnityEditor
    static void Run() { }
}

Fix A: intero file sotto Editor/

Assets/Scripts/Editor/BakeTools.cs   ← compilazione solo editor

Fix B: isola nel file (solo se devi condividere un file)

using UnityEngine;

public class RuntimeSafe : MonoBehaviour
{
    public void DoGameplay() { /* visibile al Player */ }

#if UNITY_EDITOR
    [ContextMenu("Debug/Fill Refs")]
    void EditorOnlyFill()
    {
        // Solo editor — non trattare come dati runtime impacchettati da Awake
    }
#endif
}

Ancora più pulito: script solo Editor + asmdef così gli assembly runtime non trascinano mai riferimenti Editor.

Sintomo 2: NRE su dispositivo all’ingresso in scena; Play in Editor “sembra ok”

Controlla in ordine—niente mega-riscrittura parallela:

  1. Scena non in Build Settings o scena di avvio sbagliata
  2. Missing Script / None serializzato (incluse override Prefab non applicate)
  3. Scena additiva non caricata prima di Find / accesso
  4. Maiuscole/minuscole in Resources.Load (l’Editor macOS spesso è case-insensitive; Android no)
1. Riporta le scene in Build Settings, flag abilitati, indice di avvio
2. Elenca tutti i Missing Script nella scena <X>
3. Controlla i riferimenti pubblici su GameManager / Player / HUD lungo il percorso di avvio per None
Riporta solo; non modificare.
In EditorNel packCausa tipica
I riferimenti sembrano impostatiNone a runtimeOverride istanza non applicate; file di scena sbagliato modificato
Find funzionaNull su dispositivoOggetto in scena non caricata; nome non corrispondente
Resources.Load funzionaNull su dispositivoMaiuscole/minuscole nel percorso; asset non sotto Resources/
// Su disco: Assets/Resources/UI/HealthBar.png
// Spesso fallisce su Android (maiuscole/minuscole non corrispondenti):
Resources.Load<Sprite>("ui/healthbar");
// Abbina il percorso sotto Resources, es.:
Resources.Load<Sprite>("UI/HealthBar");
Cerca le stringhe di percorso in Resources.Load / Addressables.LoadAssetAsync;
costruisci una tabella case-sensitive vs percorsi relativi reali. Non modificare ancora il codice.

Sintomo 3: Console inondata di Missing Script

Scansiona la scena <X> e il Prefab <percorso>:
Elenca i percorsi GameObject con Missing Script.
Per ogni elemento: suggerisci di riattaccare lo script originale o rimuovere il componente vuoto (dal nome/GUID residuo se visibile).
Non eliminare in blocco automaticamente.

Manuale: conferma che il file script esista ancora e che asmdef/GUID non si sia rotto; conferma uno per uno prima di eliminare i vuoti.

Checklist di accettazione

  1. Gli Errori corrispondenti sono spariti dalla Console
  2. Play in Editor percorre lo stesso percorso che falliva (entra nel livello, subisci danno, apri UI…)
  3. Una Development Build verso il target (o Player locale)
  4. MCP riverifica in sola lettura: i campi sospetti non sono più None / Missing
  5. Il diff Git è solo la piccola modifica attesa a scena/Prefab/script—nessun refactor di passaggio
Riverifica in sola lettura: ci sono None o Missing Script su <lista oggetti>? Elenca le eccezioni. Non modificare.

Limiti dei prompt

Da non fareDa fare
”Fai funzionare Play”Layer A/B/C + fissa il campo dallo stack
Massicci Find invece di riferimentiFix dei campi serializzati o iniezione esplicita
Riordinare Build Settings senza che sia richiestoRiporta prima la lista attuale e la scena di avvio
”C’è un NRE”Incolla le prime 20–40 righe di stack

Confini del prodotto

  • Unity MCP: Console dell’editor, Hierarchy, script, riferimenti—la spina di questo articolo.
  • AI Studio: struttura UI nel motore; rilega dopo la riesportazione seguendo il post sul cablaggio—non fare Find della UI dal gameplay.
  • Certificati, store, ROM OEM: incolla il testo del log in Cursor per aiuto alla lettura; fuori dallo scope di modifica scena di MCP.

Appendice: comuni ma fuori spina

Escludi prima la spina di questo articolo:

SintomoDirezione
Development OK, Release muoreManaged Stripping / link.xml; MCP: “Indovina i tipi strippati dallo stack di crash; proponi link.xml; non scrivere ancora file.”
Crash nativo Android (non gestito).so / permessi / Gradle; incolla logcat per lettura
API Unity fuori dal thread principaleControlla che i callback async tornino al thread principale

Non fondere stripping e Missing Script in un’unica “grande riscrittura”.

  1. Editor OK / pack rotto → trattalo prima come riferimenti / scene in build / percorsi / API Editor
  2. Congela manualmente Build Settings e primo Errore, poi triage MCP in sola lettura
  3. Stack → riga script → campo componente; rilega o rimuovi componenti vuoti dopo conferma
  4. Niente Find o riscritture di gameplay come fix finti
  5. Accetta con Development Build + riverifica in sola lettura

Esegui “congela → layer → trio di riferimenti → fissa il campo come nell’esempio” e la maggior parte dei bug di riferimenti su dispositivo si riduce a un piccolo diff revisionabile.

Altre guide che potrebbero interessarti