Introducción
Una de las cosas más importantes que tenemos que entender en programación orientada a objetos es el concepto de “REFERENCIA”, saber qué es una referencia y cómo encontrarla nos permitirá manipular cualquier objeto, acceder a sus datos y a sus funciones públicas.
En este artículo veremos el concepto de Referencia en programación con un ejemplo en Unity. En un Script definiremos un campo que luego inicializaremos con la referencia de un objeto y la utilizaremos para cumplir alguna función.
He creado una lista de reproducción con vídeos mostrando distintos métodos para encontrar las referencias de los objetos, puedes verla a continuación:
🟢 VÍDEO: El concepto de REFERENCIA en programación orientada a objetos
¿Qué es una REFERENCIA en programación?
Cuando hablo sobre el funcionamiento de los Scripts en mis vídeos suelo usar la palabra “REFERENCIA” con bastante frecuencia, es un término algo complicado de enteder si apenas se está comenzando a estudiar programación, ya que involucra conocimientos de programación orientada a objeto, como el concepto de clase, objeto e instancia. Veamos qué es una referencia en programación utilizando la siguiente analogía:
Imaginemos un contenedor donde podemos colocar un único objeto de alguna clase en particular, por ejemplo una caja que solo puede contener libros. Nos han encomendado la función específica de mirar dentro de la caja en algún momento y escribir en una pizarra el nombre del libro que está en su interior en ese momento. A medida que pasa el tiempo la caja podría quedar vacía o ir cambiando el libro que está en su interior, así que dependiendo del momento en el que ejecutemos nuestra acción podríamos observar distintos libros o incluso ninguno.
Lo importante es que podremos cumplir nuestro objetivo solo si hay un libro dentro del contenedor, ya que de esa forma podremos acceder a él y leer su nombre, en otras palabras, podremos acceder a ese objeto en particular y leer su nombre (además acceder a cualquiera de sus datos y hacer uso de él) sólo si contamos con la referencia de este objeto, ya que si la referencia es nula no hay ningún objeto al cual acceder ni leer su nombre.
Aquí termina la analogía, ahora intentemos llevar esto al campo de aplicación de la programación, con un ejemplo en Unity.
Ejemplo en C# Unity
Supongamos que en nuestro Script definimos una variable tipo GameObject, con la siguiente instrucción:
GameObject aParticularBook;
Como se observa en la siguiente imagen:
Con esto estamos declarando un dato de este tipo, pero Unity no sabe quién es ese dato, podría ser cualquier GameObject que esté en la jerarquía o en la carpeta Assets, entonces lo que hace es asignarle el valor “null” a ese objeto.
Error “NullReferenceException” y “UnassignedReferenceException” en Unity
Si queremos hacer uso del objeto, es decir acceder a sus datos o a sus funciones, primero tenemos que encontrar la referencia de ese objeto en particular que queremos utilizar, es decir indicarle a Unity cuál es el objeto con el que vamos a trabajar. De lo contrario, si intentamos usar directamente ese objeto sin que Unity sepa de qué objeto se trata, osea es un objeto nulo, obtendremos un error en consola de tipo “NullReferenceException”, es decir “excepción de referencia nula”.
En la figura 2 coloco una instrucción en el método Start que imprimirá el nombre del GameObject que esté asignado en el campo “aGameObject”, Start es una de las primeras funciones en ejecutarse.
Para que el Script se ejecute hay que asignarlo al menos a un GameObject en la jerarquía, así que elijo uno de ellos y le asigno el Script, en la figura 3 vemos el GameObject que tendrá asignado el Script y en la figura 4 el inspector de ese objeto donde se ve asignado el Script.
Al entrar en el modo juego se ejecutará la línea 12 que se ve en la figura 2, pero como el objeto no fue inicializado y la referencia es actualmente nula, se obtiene el mensaje “NullReferenceException” en consola:
Ahora vamos a definir el campo con visibilidad pública, esto tiene varias implicaciones, una de ellas es que podremos visualizar ese campo en el inspector de Unity y asignar la referencia manualmente, como se observa en la figura 7.
Observen que ademas en el campo del inspector en la figura 7 nos está indicando “None” y entre paréntesis “GameObject”, esto quiere decir que actualmente no hay ninguna referencia asignada y además nos indica el tipo de objeto que admite el campo, en este caso GameObject.
Si intentamos correr el juego en estas condiciones nuevamente obtenemos un mensaje de error, que esta vez dice: “UnassignedReferenceException”, es decir un error de referencia no asignada.
Asignación de referencias en Unity
Voy a crear tres empty GameObjects en la jerarquía y le voy a poner los nombres que se ven en la figura 9.
Una forma de asignar una referencia en el campo que aparece en el inspector es utilizar el botón a la derecha del campo y luego elegir el objeto de la lista, como se observa en las imágenes 10 y 11.
También se puede tomar el objeto de la jerarquía y arrastrarlo al campo en el inspector, como se observa en la figura 12.
Si ahora intentamos correr el juego, vemos que ya no tenemos errores en consola, el nombre del objeto que tenemos asignado se imprime en la consola, gracias a que hemos asignado una referencia en el campo, si colocáramos otro objeto con un nombre distinto en ese campo el mensaje en consola cambiaría porque estaríamos haciendo referencia a otro objeto.