Introducción
Este artículo pertenece a la serie sobre encontrar las referencias de GameObjects y Componentes en Unity, en esta serie se verán distintas técnicas para encontrar desde un Script cualquier objeto que esté en la jerarquía en una determinada escena en Unity, esto es algo muy importante que hay que entender y saber cómo hacerlo ya que si contamos con la referencia de un objeto o componente, podremos accederlo y leer cualquier dato público o ejecutar cualquier función pública que necesitemos.
En el siguiente vídeo muestro cómo definir una variable en Unity para que aparezca en el inspector y así poder asignar un GameObject de la escena en ella.
Condiciones iniciales
Partimos de un Script llamado «FindReferenceOfAnObject» en el que vamos a encontrar la referencia de un cierto GameObject que está en la escena en Unity, dentro del Script usaremos esa referencia para imprimir su nombre en consola con la instrucción de la línea 13 de la figura 1.
La jerarquía de la escena que vamos a usar está compuesta por los GameObjects que se observan en la figura 2, el objeto «Script-GameObject» es el que tiene asignado el Script de la figura 1 y es el que se encargará de encontrar las referencias, en la figura 3 se ve el inspector de este GameObject, donde está asignado el Script.
El objeto «GDT (Object to Find)» que se ve en la figura 2 es el objeto que tenemos que encontrar, así que si tenemos éxito deberíamos ver ese nombre impreso en consola.
Declaración del campo con visibilidad pública
Los campos y variables que se declaran dentro de un Script pueden tener tres tipos de visibilidad: «pública», «privada» y «protegida». Consideremos solo los dos primeros casos, visibilidad privada y pública, en el primer caso el campo declarado como privado no será accesible desde contextos externos al propio Script en el que está definido, mientras que si es declarado con visibilidad pública se puede acceder directamente a ese dato desde otros Scripts. En Unity además se pueden ver los campos públicos en el inspector.
En la figura 4, línea 8 declaramos un campo de tipo GameObject llamado «objectToFind» indicándole la visibilidad pública colocando la palabra «public» por delante.
La figura 5 es una captura de la ventana Inspector del GameObject que tiene asignado el Script que estamos editando, como se observa, el campo «objectToFind» aparece en el inspector (algo que no se veía en la figura 3 con el Script de la figura 1), lo que significa que ahora podemos asignar manualmente el GameObject que queramos almacenar en la variable «objectToFind», es decir podemos asignar manualmente la referencia del objeto.
Esto puede hacerse de dos formas, una es tomando el GameObject de la jerarquía y arrastrándolo al campo, mientras que la otra forma es utilizando el ícono del círculo con el punto que se observa a la derecha del campo (en las figura 5 o 6), esto desplegará una ventana en la que podemos elegir el objeto que queremos asignar.
Al entrar en el modo juego vemos el mensaje en consola que muestra el nombre del objeto que fue asignado en el campo, esto se produce debido a la ejecución de la instrucción que se observa en la figura 4 (línea 13) y nos confirma que tenemos la referencia del GameObject, ya que pudimos usarla para leer su nombre.
Alternativa: Declarar el campo como privado incluyendo [SerializeField]
Si se desea mantener la variable con visibilidad privada para que otros Scripts no puedan acceder directamente a ese campo, hay una alternativa para que el campo aparezca en el inspector, consiste en añadir «[SerializeField]» antes de la declaración, como se observa en la figura 8.
Con esto la variable «objectToFind» será visible desde el inspector y se puede asignar el objeto manualmente en el inspector.