Introducción – Qué vamos a hacer y para qué
En este artículo vamos a ver un método que nos permitirá encontrar una COMPONENTE de un tipo específico en Unity desde un Script, por ejemplo encontrar una componente tipo AudioSource, Collider o incluso un Script que nosotros mismo hayamos creado y asignado a un GameObject. El propósito de eso es tener la referencia de ese componente dentro de nuestro Script y poder utilizarla de acuerdo a nuestras necesidades. Por ejemplo si queremos llamar una función que está definida en otro Script vamos a necesitar la referencia de la instancia de ese otro Script para poder hacerlo.
El método que vamos a ver consiste en utilizar una instrucción de código que revisa cada GameObject de la jerarquía y sus componentes hasta encontrar la componente del tipo que indiquemos, si hay una componente de ese tipo presente en la escena la instrucción la devolverá como resultado de ejecución y podremos almacenar esa componente en una variable o usarla inmediatamente para ejecutar alguna acción simple sobre el componente que encontramos. Si por el contrario no hay ninguna componente de ese tipo en ningún GameObject de la escena, la instrucción devolverá Null y eso podría conducir a un error de tipo NullReferenceException.
A continuación vamos a ver una lista de puntos clave acerca de este método:
- Este método es efectivo cuando la componente que buscamos es única en la escena, si hay más de una componente del mismo tipo no hay garantías de encontrar precisamente la que estamos buscando.
- Es recomendable usar este método en alguna función de inicialización como Awake o Start.
- No se recomienda usar este método dentro de funciones de actualización como Update porque implican recorrer en el peor de los casos toda la jerarquía de la escena. A menos que se controle de algún modo el flujo del programa para que la instrucción se ejecute una única vez.
- Si la componente que se quiere buscar se va a usar más de una vez es recomendable encontrarla una vez y almacenarla en una variable global para poder usarla cuantas veces sea necesaria.
En este vídeo vemos cómo implementar este método para encontrar una componente que es única en la escena
Luego de encontrar esa componente de la escena la usamos para referenciar a su GameObject porque esa es la idea de la serie de vídeos, pero esta parte no es necesaria, se puede usar la componente para lo que se necesite.
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.
Cómo encontrar la referencia de un GameObject que tiene una componente específica
Si sabemos que el GameObject que nos interesa encontrar tiene asignada una componente específica, como por ejemplo un componente «Camera», «Rigidbody», «AudioSource» o un Script que nostros mismo hayamos creado, podemos usar esa información para dar con la referencia del GameObject.
Voy a crear un Script llamado «SomeScript» y lo voy a asignar al GameObject que queremos encontrar, como se observa en las figuras 4 y 5.
Utilizando la instrucción «FindObjectOfType<T>()», donde T es el tipo de objeto que estamos buscando (en nuestro caso es de tipo «SomeScript»), podemos encontrar la referencia de la instancia «SomeScript» que está asignada a ese GameObject, luego usando el operador punto podemos acceder al GameObject al cual ese Script está asignado.
La instrucción que hace todo esto la vemos en la línea 20 de la figura 6.
Cuando se ejecute esta instrucción, Unity revisará todos los objetos de la jerarquía y cada una de sus componentes hasta dar con el objeto de tipo «SomeScript», cuando lo encuentra lo devuelve como resultado, pero como nos interesa el GameObject al cual está asignado ese Script, utilizamos el punto y accedemos al campo «gameObject». Si no hay ningún objeto que tenga asignada la componente «SomeScript» tendremos un error de referencia nula.
Para tener en cuenta, si tenemos más de un GameObject que tiene asignada la componente que estamos buscando, Unity nos devolverá la primer componente que encuentre en su registro, en este caso pueden surgir ambigüedades, podríamos obtener la referencia de un objeto distinto al que queremos.