"El objeto que desea instanciar es nulo" Pero funciona, ¿puedo ignorar el error?

18

Esto nunca me ha pasado, así que estoy un poco confundido.

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

Esto arroja un error, pero el objeto en realidad se instancia y todo funciona según lo previsto. El error no detiene el programa, no importa cuántas veces reproduzco esto.

¿Puedo ignorar este error o hay algún problema que no estoy viendo?

usuario4676310
fuente
32
Nunca debes ignorar los errores. Siempre están ahí por una razón;)
Gabriele Vierti
55
Quiero apoyar la idea de nunca ignorar los errores solo porque "funciona". Por definición, si hay un error, no funciona. Claro, puede parecer que hace todo lo que quieres, pero eso solo significa que aún no has encontrado la parte rota.
Financia la demanda de Mónica el

Respuestas:

46

Si el objeto se instancia correctamente a pesar de que la Intantiate()línea arroja una excepción, entonces el error proviene de otra instancia del script: es posible que accidentalmente tenga una segunda copia en su escena.

Una instancia está configurada correctamente y se realiza Instantiate()como se esperaba sin errores, por lo que el objeto se crea como se desea.

Otra instancia está configurada incorrectamente y arroja un error. Pero si solo está mirando la instancia configurada correctamente, este error parecerá provenir de la nada y no tendrá consecuencias visibles.

Puede imprimir la ruta al objeto en Inicio, o en una comprobación nula justo antes de la línea ofensiva, para ayudar a localizar duplicados de escenas no deseadas.

Absolutamente no debe ignorar este error.

En el mejor de los casos, está quemando ciclos de cómputo innecesariamente. En el peor de los casos, es una señal de que su juego está haciendo algo que no comprende completamente, y que puede ser la raíz de problemas mucho más grandes en el futuro.

DMGregory
fuente
12
+1, los errores no son lo mismo que las advertencias, si hay un error, nunca se sabe cuándo se intensificará y se bloqueará todo el juego.
TomTsagk
13
Tampoco siempre es seguro ignorar las advertencias. Incluso si no es un error, podría conducir a una situación en la que el juego se bloquea.
Sean Burton el
2
Estoy de acuerdo con @SeanBurton, ignorar las advertencias no es una práctica segura. Debería ignorar una advertencia si, y solo si, comprende lo que la está causando y está seguro de que no está causando un problema en su código. Incluso entonces, pregúntate si no podrías hacerlo mejor.
Jack Aidley el
3
Todos los proyectos en los que he trabajado con un gran equipo se han sobrecargado en algún momento con advertencias "ignorables" que comenzaron a enmascarar problemas genuinos. Así que definitivamente recomendaría tratar las advertencias en serio también, y si una es inevitable, deshabilitarla para la línea correspondiente junto con un comentario que defina claramente por qué es seguro omitir la generación de la advertencia allí.
DMGregory
1
Estoy 100% con @DMGregory, solo he trabajado en equipos muy pequeños, pero el par de veces que las advertencias comenzaron a acumularse fue horrible encontrar problemas "genuinos", o los extrañarías todo el tiempo. Mi MO es mantener el registro limpio, excepto para las pruebas, incluso si tengo que deshabilitar las advertencias en el código de los complementos (por favor, no hagas complementos con advertencias NUNCA), es mucho mejor a largo plazo IMO. Editar: para ser claros, nunca deshabilite las advertencias a menos que esté 100% seguro de que no hay otra forma (que ocurre el 0.001% del tiempo), siempre corríjalas.
Trisibo el
21

Responder

Permítanme comenzar respondiendo su pregunta directamente:

funciona, ¿puedo ignorar el error?

Usted podría . No deberías , porque significa que algo va mal. Te acostumbrarías a este error, pero podría "esconderse" o causar otro error.

Actualmente tiene un mensaje de error y aún funciona correctamente. ¡Al revés, no funciona y no tiene (o más bien: no reconoce) comentarios por qué, es mucho peor!

Consejo

Para saber de dónde viene esto, divide todo esto en varias líneas.

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

Un error solo te dice en qué línea sucedió. Si el error ocurre en este código, el número de línea le informará más sobre qué parte salió mal aquí. Además, recomendaría usar la versión genérica de Resources.Load, que en realidad nos daría un paso menos de qué preocuparnos:

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

Averiguando por qué

  • Ahora, un poco de experiencia de Unity nos dice que "El Objeto que quieres instanciar es nulo" es causado por Instantiate().
  • Entonces, eso significa prefabes null.
  • Entonces eso significa Resources.Loaddevoluciones null.
  • La documentación deResources.Load dice " Devuelve el activo en pathsi se puede encontrar, de lo contrario devuelve nulo " .
  • Eso significa que no encuentra la ruta dada (la cadena que llamé resourceLocation)

Algo está mal con este camino, por lo que el primer paso obvio sería ver lo que realmente termina siendo, con Debug.Log. Como "todo funciona según lo previsto", es probable que haya alguna duplicación donde una versión funciona y la otra le da este error.

En ese caso, es una buena idea usar la versión de 2 parámetros de Debug.Log Debug.Log(resourceLocation, gameObject);. Ahora, si hace clic en el mensaje de registro en el editor de Unity, seleccionará de GameObjectdónde vino.

Raphael Schmitz
fuente