"L'objet que vous souhaitez instancier est nul" Mais cela fonctionne, puis-je ignorer l'erreur?

18

Cela ne m'est jamais arrivé donc je suis un peu confus.

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

Cela génère une erreur mais l'objet est réellement instancié et tout fonctionne comme prévu. L'erreur n'arrête pas le programme, peu importe combien de fois je le reproduis.

Puis-je ignorer cette erreur ou y a-t-il un problème que je ne vois pas?

user4676310
la source
32
vous ne devez jamais ignorer les erreurs. Ils sont toujours là pour une raison;)
Gabriele Vierti
5
Je veux appuyer l'idée de ne jamais ignorer les erreurs simplement parce que "ça marche". Par définition, s'il y a une erreur, cela ne fonctionne pas. Bien sûr, cela peut sembler faire tout ce que vous voulez, mais cela signifie simplement que vous n'avez pas encore trouvé le morceau cassé.
Fund Monica's Lawsuit

Réponses:

46

Si l'objet est instancié correctement malgré la Intantiate()ligne lançant une exception, alors l'erreur provient d'une autre instance du script - vous pourriez avoir accidentellement une deuxième copie dans votre scène.

Une instance est configurée correctement et exécute Instantiate()comme prévu sans erreur, de sorte que l'objet est créé comme vous le souhaitez.

Une autre instance n'est pas configurée correctement et génère une erreur. Mais si vous regardez simplement l'instance correctement configurée, cette erreur semblera provenir de nulle part et n'aura aucune conséquence visible.

Vous pouvez imprimer le chemin d'accès à l'objet au démarrage - ou dans un contrôle nul juste avant la ligne incriminée - pour aider à localiser les doublons de scène indésirables.

Vous ne devez absolument pas ignorer cette erreur.

Au mieux, il brûle inutilement des cycles de calcul. Au pire, c'est un signe que votre jeu fait quelque chose que vous ne comprenez pas complètement, et qui peut être à l'origine de problèmes beaucoup plus importants.

DMGregory
la source
12
+1, les erreurs ne sont pas les mêmes que les avertissements, s'il y a une erreur, vous ne savez jamais quand elle va dégénérer en crash complet du jeu.
TomTsagk
13
Il n'est pas toujours sûr d'ignorer les avertissements non plus. Même si ce n'est pas une erreur, cela pourrait potentiellement conduire à une situation où le jeu se bloque.
Sean Burton
2
Je suis d'accord avec @SeanBurton, ignorer les avertissements n'est pas une pratique sûre. Vous devez ignorer un avertissement si, et seulement si, vous comprenez ce qui en est la cause et êtes à l'aise qu'il ne cause pas de problème dans votre code. Même alors, demandez-vous si vous ne pourriez pas faire mieux.
Jack Aidley
3
Chaque projet sur lequel j'ai travaillé avec une grande équipe a à un moment donné été tellement surchargé d'avertissements "ignorables" qu'il a commencé à masquer de véritables problèmes. Je recommanderais donc certainement de traiter les avertissements au sérieux également, et si l'un d'eux est inévitable, de le désactiver pour la ligne concernée avec un commentaire définissant clairement pourquoi il est sûr de ne pas générer l'alerte.
DMGregory
1
Je suis à 100% avec @DMGregory, je n'ai travaillé que sur de très petites équipes, mais la paire de fois que les avertissements ont commencé à se cumuler, il était horrible de trouver des problèmes "authentiques", sinon vous les manqueriez tout le temps. Mon MO est de garder le journal propre, sauf pour les tests, même si je dois désactiver les avertissements sur le code des plugins (s'il vous plaît, ne faites jamais de plugins avec des avertissements), c'est beaucoup mieux à long terme IMO. Modifier: pour être clair, ne désactivez jamais les avertissements à moins que vous ne soyez sûr à 100% qu'il n'y ait pas d'autre moyen (ce qui se produit 0,001% du temps), corrigez-les toujours.
Trisibo
21

Répondre

Permettez-moi de commencer par répondre directement à votre question:

cela fonctionne, puis-je ignorer l'erreur?

Tu pourrais . Vous ne devriez pas, car cela signifie que quelque chose ne va pas. Vous vous habitueriez à cette erreur, mais cela pourrait "se cacher" ou provoquer une autre erreur.

Actuellement, vous avez un message d'erreur et cela fonctionne toujours correctement. Inversement, cela ne fonctionne pas et n'a pas (ou plutôt: ne reconnaît pas) de rétroaction pourquoi, c'est bien pire!

Conseil

Pour savoir d'où cela vient, divisez le tout en plusieurs lignes.

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

Une erreur vous indique uniquement à quelle ligne cela s'est produit. Si l'erreur se produit dans ce code, le numéro de ligne vous en dira plus sur la partie qui a mal tourné ici. De plus, je vous conseille d'utiliser la version générique de Resources.Load, qui nous donnerait en fait une étape de moins à craindre:

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

Découvrir pourquoi

  • Maintenant, un peu d'expérience Unity nous dit que «l'objet que vous souhaitez instancier est nul» est provoqué par Instantiate().
  • Donc, cela signifie que prefabc'est null.
  • Cela signifie donc des Resources.Loadretours null.
  • La documentation deResources.Load indique " Renvoie l'actif à paths'il peut être trouvé sinon renvoie null. "
  • Cela signifie donc qu'il ne trouve pas le chemin donné (la chaîne que j'ai appelée resourceLocation)

Quelque chose ne va pas avec ce chemin, donc la première étape évidente serait de voir ce qu'il finit par être, avec Debug.Log. Comme "tout fonctionne comme prévu", il est probable qu'il y ait duplication là où une version fonctionne et l'autre vous donne cette erreur.

Dans ce cas, c'est une bonne idée d'utiliser la version à 2 paramètres de Debug.Log Debug.Log(resourceLocation, gameObject);. Maintenant, si vous cliquez sur le message du journal dans l'éditeur Unity, il sélectionnera d' GameObjectoù il vient.

Raphael Schmitz
la source