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

Introducción

Una de las cosas más impor­tantes que ten­emos que enten­der en pro­gra­mación ori­en­ta­da a obje­tos es el con­cep­to de "REFERENCIA", saber qué es una ref­er­en­cia y cómo encon­trar­la nos per­mi­tirá manip­u­lar cualquier obje­to, acced­er a sus datos y a sus fun­ciones públicas. 

En este artícu­lo ver­e­mos el con­cep­to de Ref­er­en­cia en pro­gra­mación con un ejem­p­lo en Uni­ty. En un Script definire­mos un cam­po que luego ini­cializare­mos con la ref­er­en­cia de un obje­to y la uti­lizare­mos para cumplir algu­na función.

He crea­do una lista de repro­duc­ción con vídeos mostran­do dis­tin­tos méto­dos para encon­trar las ref­er­en­cias de los obje­tos, puedes ver­la a continuación:

🟢 El con­cep­to de REFERENCIA en POO es muy impor­tante
 

VÍDEOS DEL CANAL CON MÁS BÚSQUEDAS

DE UNITY

DE BLENDER

¿Qué es una REFERENCIA en programación?

Cuan­do hablo sobre el fun­cionamien­to de los Scripts en mis vídeos sue­lo usar la pal­abra "REFERENCIA" con bas­tante fre­cuen­cia, es un tér­mi­no algo com­pli­ca­do de ent­ed­er si ape­nas se está comen­zan­do a estu­di­ar pro­gra­mación, ya que involu­cra conocimien­tos de pro­gra­mación ori­en­ta­da a obje­to, como el con­cep­to de clase, obje­to e instan­cia. Veamos qué es una ref­er­en­cia en pro­gra­mación uti­lizan­do la sigu­iente analogía:

Imag­inemos un con­tene­dor donde podemos colo­car un úni­co obje­to de algu­na clase en par­tic­u­lar, por ejem­p­lo una caja que solo puede con­tener libros. Nos han encomen­da­do la fun­ción especí­fi­ca de mirar den­tro de la caja en algún momen­to y escribir en una pizarra el nom­bre del libro que está en su inte­ri­or en ese momen­to. A medi­da que pasa el tiem­po la caja podría quedar vacía o ir cam­bian­do el libro que está en su inte­ri­or, así que depen­di­en­do del momen­to en el que eje­cute­mos nues­tra acción podríamos obser­var dis­tin­tos libros o inclu­so ninguno.

Lo impor­tante es que podremos cumplir nue­stro obje­ti­vo solo si hay un libro den­tro del con­tene­dor, ya que de esa for­ma podremos acced­er a él y leer su nom­bre, en otras pal­abras, podremos acced­er a ese obje­to en par­tic­u­lar y leer su nom­bre (además acced­er a cualquiera de sus datos y hac­er uso de él) sólo si con­ta­mos con la ref­er­en­cia de este obje­to, ya que si la ref­er­en­cia es nula no hay ningún obje­to al cual acced­er ni leer su nombre.

Aquí ter­mi­na la analogía, aho­ra inten­te­mos lle­var esto al cam­po de apli­cación de la pro­gra­mación, con un ejem­p­lo en Unity.

Ejemplo en C# Unity

Supong­amos que en nue­stro Script defin­i­mos una vari­able tipo GameOb­ject, con la sigu­iente instrucción: 

GameOb­ject aParticularBook;

Como se obser­va en la sigu­iente 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 cam­po para un obje­to tipo GameOb­ject lla­ma­do "aPartic­u­lar­Book".

Con esto esta­mos declaran­do un dato de este tipo, pero Uni­ty no sabe quién es ese dato, podría ser cualquier GameOb­ject que esté en la jer­ar­quía o en la car­pe­ta Assets, entonces lo que hace es asig­narle el val­or "null" a ese objeto. 

Error "NullReferenceException" y "UnassignedReferenceException" en Unity

Si quer­e­mos hac­er uso del obje­to, es decir acced­er a sus datos o a sus fun­ciones, primero ten­emos que encon­trar la ref­er­en­cia de ese obje­to en par­tic­u­lar que quer­e­mos uti­lizar, es decir indi­car­le a Uni­ty cuál es el obje­to con el que vamos a tra­ba­jar. De lo con­trario, si inten­ta­mos usar direc­ta­mente ese obje­to sin que Uni­ty sepa de qué obje­to se tra­ta, osea es un obje­to nulo, obten­dremos un error en con­so­la de tipo "Null­Ref­er­ence­Ex­cep­tion", es decir "excep­ción de ref­er­en­cia nula".

En la figu­ra 2 colo­co una instruc­ción en el méto­do Start que imprim­irá el nom­bre del GameOb­ject que esté asig­na­do en el cam­po "aGameOb­ject", Start es una de las primeras fun­ciones en ejecutarse.

instrucción en la que se utiliza la referencia de un objeto para imprimir su nombre en programacion
Fig. 2: Instruc­ción para imprim­ir en con­so­la el nom­bre del GameOb­ject que esté asignado.

Para que el Script se eje­cute hay que asig­narlo al menos a un GameOb­ject en la jer­ar­quía, así que eli­jo uno de ellos y le asig­no el Script, en la figu­ra 3 vemos el GameOb­ject que ten­drá asig­na­do el Script y en la figu­ra 4 el inspec­tor de ese obje­to donde se ve asig­na­do el Script.

Fig. 3: El GameOb­ject que tiene el Script asig­na­do y se encar­gará de eje­cu­tar las instrucciones.
Fig. 4: En el inspec­tor vemos el script asig­na­do entre sus componentes.

Al entrar en el modo juego se eje­cu­tará la línea 12 que se ve en la figu­ra 2, pero como el obje­to no fue ini­cial­iza­do y la ref­er­en­cia es actual­mente nula, se obtiene el men­saje "Null­Ref­er­ence­Ex­cep­tion" 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 "Null­Ref­er­ence­Ex­cep­tion" debido a que el cam­po es nulo.

Aho­ra vamos a definir el cam­po con vis­i­bil­i­dad públi­ca, esto tiene varias impli­ca­ciones, una de ellas es que podremos visu­alizar ese cam­po en el inspec­tor de Uni­ty y asig­nar la ref­er­en­cia man­ual­mente, como se obser­va en la figu­ra 7.

Fig. 6: Se añade vis­i­bil­i­dad públi­ca al campo.
Fig. 7: Una con­se­cuen­cia de ten­er vis­i­bil­i­dad públi­ca en Uni­ty es que ese cam­po aparece en el inspector.

Obser­ven que ade­mas en el cam­po del inspec­tor en la figu­ra 7 nos está indi­can­do "None" y entre parén­te­sis "GameOb­ject", esto quiere decir que actual­mente no hay ningu­na ref­er­en­cia asig­na­da y además nos indi­ca el tipo de obje­to que admite el cam­po, en este caso GameObject.

Si inten­ta­mos cor­rer el juego en estas condi­ciones nue­va­mente obten­emos un men­saje de error, que esta vez dice: "Unas­signe­dRef­er­ence­Ex­cep­tion", es decir un error de ref­er­en­cia 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 cam­bia a "Unas­signe­dRef­er­ence­Ex­cep­tion.

Asignación de referencias en Unity

Voy a crear tres emp­ty GameOb­jects en la jer­ar­quía y le voy a pon­er los nom­bres que se ven en la figu­ra 9.

Fig. 9: Voy a crear tres GameOb­jects con dis­tin­to nom­bre a modo de ejemplo.

Una for­ma de asig­nar una ref­er­en­cia en el cam­po que aparece en el inspec­tor es uti­lizar el botón a la derecha del cam­po y luego ele­gir el obje­to de la lista, como se obser­va en las imá­genes 10 y 11.

Fig. 10: Pul­san­do el botón a la derecha del cam­po podemos desple­gar una lista de obje­tos para asignar.
una manera de asignar referencias en unity
Fig. 11: Elegi­mos algún GameOb­ject de la lista, por ejem­p­lo el GameOb­ject lla­ma­do "BookA".

Tam­bién se puede tomar el obje­to de la jer­ar­quía y arras­trar­lo al cam­po en el inspec­tor, como se obser­va en la figu­ra 12.

una manera de asignar referencias en unity
Fig. 12: Otra alter­na­ti­va sería tomar­lo de la jer­ar­quía y arras­trar­lo has­ta el campo.

Si aho­ra inten­ta­mos cor­rer el juego, vemos que ya no ten­emos errores en con­so­la, el nom­bre del obje­to que ten­emos asig­na­do se imprime en la con­so­la, gra­cias a que hemos asig­na­do una ref­er­en­cia en el cam­po, si colocáramos otro obje­to con un nom­bre dis­tin­to en ese cam­po el men­saje en con­so­la cam­biaría porque estaríamos hacien­do ref­er­en­cia a otro objeto.

el mensaje en consola nos indica que se pudo acceder al objeto a través de su referencia, programacion
Fig. 13: Aho­ra al entrar en el modo juego, la impre­sión del nom­bre se real­iza exi­tosa­mente porque se cuen­ta con la ref­er­en­cia del objeto.

1 comentario en “Qué es una REFERENCIA en programación — Ejemplos en Unity”

  1. Pingback: { Qué es una INSTANCIA en Programación Orientada a Objetos }

Los comentarios están cerrados.

Scroll al inicio
Secured By miniOrange