"L'oggetto che si desidera istanziare è nullo" Ma funziona, posso ignorare l'errore?


18

Questo non mi è mai successo, quindi sono un po 'confuso.

GameObject someObject = Instantiate (Resources.Load ("Prefabs/Items/" + someName)) as GameObject;

Ciò genera un errore ma l'oggetto viene effettivamente istanziato e tutto funziona come previsto. L'errore non interrompe il programma, non importa quante volte lo riproduco.

Posso ignorare questo errore o c'è qualche problema che non vedo?


32
non dovresti mai ignorare gli errori. Sono sempre lì per un motivo;)
Gabriele Vierti,

5
Voglio secondare l'idea di non ignorare mai gli errori solo perché "funziona". Per definizione, se c'è un errore, non funziona. Certo, potrebbe sembrare che faccia tutto quello che vuoi, ma ciò significa solo che non hai ancora trovato il pezzo rotto.
Finanzia la causa di Monica il

Risposte:


46

Se l'oggetto viene istanzato correttamente nonostante la Intantiate()riga abbia generato un'eccezione, l'errore proviene da un'altra istanza dello script: potresti accidentalmente avere una seconda copia nella scena.

Un'istanza è configurata correttamente e sta eseguendo Instantiate()come previsto senza errori, quindi l'oggetto viene creato come desiderato.

Un'altra istanza è configurata in modo errato e genera un errore. Ma se stai solo guardando l'istanza correttamente configurata, questo errore sembrerà provenire dal nulla e non avere conseguenze visibili.

È possibile stampare il percorso dell'oggetto su Start - o con un segno di spunta appena prima della linea offensiva - per aiutare a rintracciare i duplicati di scena indesiderati.

Non devi assolutamente ignorare questo errore.

Nella migliore delle ipotesi, sta bruciando inutilmente cicli di calcolo. Nel peggiore dei casi, è un segno che il tuo gioco sta facendo qualcosa che non capisci completamente e che può essere la radice di problemi molto più grandi lungo la linea.


12
+1, gli errori non sono gli stessi degli avvisi, se si verifica un errore, non si sa mai quando si intensificherà all'intero crash del gioco.
TomTsagk,

13
Non è sempre sicuro ignorare neanche gli avvisi. Anche se non è un errore, potrebbe potenzialmente portare a una situazione in cui il gioco si blocca.
Sean Burton,

2
Sono d'accordo con @SeanBurton, ignorare gli avvisi non è una pratica sicura. Dovresti ignorare un avviso se, e solo se, capisci cosa lo sta causando e sei a tuo agio che non sta causando un problema nel tuo codice. Anche allora, chiediti se non potresti farlo meglio.
Jack Aidley,

3
Ogni progetto a cui ho lavorato con una grande squadra è diventato ad un certo punto così sovraccarico di avvertimenti "ignorabili" che ha iniziato a mascherare problemi autentici. Quindi raccomanderei sicuramente di trattare anche gli avvisi seriamente, e se uno è inevitabile, disabilitandolo per la riga pertinente insieme a un commento che definisce chiaramente perché è sicuro saltare la generazione dell'avviso lì.
DMGregory

1
Sono al 100% con @DMGregory, ho lavorato solo su team molto piccoli, ma la coppia di avvisi che hanno iniziato a impilare è stato orribile trovare problemi "genuini", o ti mancheranno continuamente. Il mio MO è quello di mantenere pulito il registro tranne che per i test, anche se devo disabilitare gli avvisi sul codice dei plugin (per favore, non creare MAI plugin con avvisi MAI), è molto meglio a lungo termine IMO. Modifica: per essere chiari, non disabilitare mai gli avvisi a meno che tu non sia sicuro al 100% che non ci sia altro modo (che accade lo 0,001% delle volte), correggili sempre in realtà.
Trisibo,

21

Risposta

Vorrei iniziare rispondendo direttamente alla tua domanda:

funziona, posso ignorare l'errore?

Si potrebbe . Non dovresti , perché significa che qualcosa non va. Ci si abituerebbe a questo errore, ma potrebbe "nascondere" o causare un altro errore.

Attualmente hai un messaggio di errore e funziona ancora correttamente. Al contrario, non funziona e non ha (o meglio: non riconosce) un feedback perché, è molto peggio!

Consigli

Per scoprire da dove proviene, dividi tutto in più righe.

string resourceLocation = "Prefabs/Items/" + someName;
Object prefab = Resources.Load(resourceLocation);
Object instance = Instantiate(prefab);
GameObject someObject = instance as GameObject;

Un errore ti dice solo a quale linea è successo. Se l'errore si verifica in questo codice, il numero di riga ti dirà di più su quale parte è andata storta qui. Inoltre, consiglierei di utilizzare la versione generica di Resources.Load, che in realtà ci darebbe un passo in meno di cui preoccuparsi:

string resourceLocation = "Prefabs/Items/" + someName;
GameObject prefab = Resources.Load<GameObject>(resourceLocation);
GameObject someObject = Instantiate(prefab);

Scoprendo perché

  • Ora, un po 'di esperienza Unity ci dice che "L'oggetto che si desidera istanziare è nullo" è causato da Instantiate().
  • Quindi, questo significa che lo prefabè null.
  • Ciò significa che Resources.Loadritorna null.
  • La documentazione perResources.Load dice " Restituisce la risorsa pathse può essere trovata altrimenti restituisce null. "
  • Ciò significa che non trova il percorso specificato (la stringa che ho chiamato resourceLocation)

Qualcosa non va in questo percorso, quindi l'ovvio primo passo sarebbe quello di vedere che cosa effettivamente finisce con Debug.Log. Dato che "tutto funziona come previsto", è probabile che ci siano dei duplicati in cui una versione funziona e l'altra ti dà questo errore.

In tal caso, è consigliabile utilizzare la versione con 2 parametri di Debug.Log Debug.Log(resourceLocation, gameObject);. Ora, se fai clic sul messaggio di registro nell'editor Unity, selezionerà la GameObjectprovenienza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.