[Unity][Novato total][Prefabs] Entendiendo los Prefabs

Ancoreig

Buenas gente, no consigo entender una cosa de los prefabs. Os pongo en situación:

(antes que nada, estoy cacharreando con un plataformas 2d, para el contexto: https://www.mediavida.com/foro/gamedev/unitynovato-total-hacer-mi-personaje-vuelta-chocar-670042)

Tenía un objeto John (personaje principal) que había toqueteado bastante y me dije; ¿Y si lo borro sin querer y no puedo recuperarlo? Entonces me dio por arrastrarlo a los assets para así hacérmelo prefab y "tenerlo a mano" por si pasase alguna desgracia. (De hecho, hice lo mismo con el objeto de la cámara principal).

Ahora bien; mi prefab de la cámara tiene un script que se llama CameraScript. Este script hace uso de mi prefab John (para coger su posición), el cuál está como público y lo tengo asignado al componente del script en el inspector.

public GameObject John;

El script de la cámara lo que hace es simplemente seguir a John.

Mi pregunta es... ANTES de convertirlos en prefabs, el seguir al personaje funcionaba sin meter más código. Sin embargo, cuando los convertí a prefabs dejó de funcionar el seguimiento, y para solucionarlo tuve que meter en el Start() de mi CameraScript:

John = GameObject.Find("John");

¿Por qué?

Gracias de antemano!

B

Por las referencias

Hay dos formas de crear referencias. Una de ellas es arrastar y pincharla desde el panel de Unity3D. Esto es interesante cuando tienes contenido estático o que no va a ser destruido.

Al abrir una escena o crear elementos durante el runtime. Esa referencia está nula o no se encuentra. Es por ello que tienes que buscarla y asignarla.
He aquí la cuestión de usar:

John = GameObject.Find("John");

Cuando empiezas a trabajar con Unity3D, te agrada la idea de arrastrar y poner referencias a los objetos desde la UI. Pero cuando profundizas en la aplicación y el manejo, cuando trabajas con objetos que van apareciendo, destruyendo, creándose. Es cuando te enfrentas al duro problema de "the reference of this object is null" o algo así. Entonces tienes que cambiar el chip y adaptarte a buscar las referencias en start() y onEnable() y quitarlas con onDestroy() o onDisable()

Esto te evitará quebraderos de cabeza con el tema de no saber porque de pronto se te para la aplicación al desaparecer un objeto o simplemente desactivarlo.

Hay otras maneras de hacer las cosas pero viendo el nivel que tienes, no quiero complicarte la vida con ello y prefiero que veas poco a poco descubriendo las peleas que tendrás con Unity3D ;p

1
Ancoreig

Duda aclarada, muchas gracias!

Usuarios habituales