Qué es una REFERENCIA en programación – Ejemplos en Unity

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:

MIRA MI EXPERIMENTO MÁS RECIENTE
👇
piston cylinder arrangement made in unity
(CLICK PARA VER EN YOUTUBE)

¿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:

definicion de un campo para un objeto tipo gameobject en unity donde irá asignada la referencia de un objeto en particular
Fig. 1: Se define un campo para un objeto tipo GameObject llamado «aParticularBook».

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.

instrucción en la que se utiliza la referencia de un objeto para imprimir su nombre en programacion
Fig. 2: Instrucción para imprimir en consola el nombre del GameObject que esté asignado.

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.

Fig. 3: El GameObject que tiene el Script asignado y se encargará de ejecutar las instrucciones.
Fig. 4: En el inspector vemos el script asignado entre sus componentes.

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:

error nullreferenceexception que ocurre cuando se intenta acceder a un campo que es nulo, no hay referencia asignada
Fig. 5: Al entrar en el modo juego se obtiene el error «NullReferenceException» debido a que el campo es nulo.

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.

Fig. 6: Se añade visibilidad pública al campo.
Fig. 7: Una consecuencia de tener visibilidad pública en Unity es que ese campo aparece en el inspector.

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.

error unassignedreferenceexception que ocurre cuando se intenta acceder a un campo cuya referencia no ha sido asignada
Fig. 8: Al entrar en el modo juego el error cambia a «UnassignedReferenceException.

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.

Fig. 9: Voy a crear tres GameObjects con distinto nombre a modo de ejemplo.

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.

Fig. 10: Pulsando el botón a la derecha del campo podemos desplegar una lista de objetos para asignar.
una manera de asignar referencias en unity
Fig. 11: Elegimos algún GameObject de la lista, por ejemplo el GameObject llamado «BookA».

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.

una manera de asignar referencias en unity
Fig. 12: Otra alternativa sería tomarlo de la jerarquía y arrastrarlo hasta el campo.

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.

el mensaje en consola nos indica que se pudo acceder al objeto a través de su referencia, programacion
Fig. 13: Ahora al entrar en el modo juego, la impresión del nombre se realiza exitosamente porque se cuenta con la referencia del objeto.

Secured By miniOrange