Conociendo C# Pt. 2: Structs

Para analizar este tipo de entidad tenemos que tener clara la diferencia entre tipos de valor y tipos de referencia. Una clase es un tipo de referencia, donde si yo igualo una variable a una clase, en realidad lo que estoy haciendo es que esa variable apunte a la instancia de la clase. Sin embargo, un tipo de valor, es un elemento que se pasa por valor, es decir, a nivel de memoria se crea una nueva instancia de ese valor.

Ref
Una clase como GameObject, es un tipo de referencia, por ende, luego de ejecutarse esas líneas, el valor de ref1 va a ser null aunque nunca hayamos modificado directamente ref1. ref 1 es una simple referencia a obj.

 

value
En este caso, value es un entero, un tipo de valor. Luego de ejecutar eso, el valor de value va a ser 16, pero el valor de v va a ser 8. Los tipos de valores se copian, no se referencian.

¿Para qué sirve entonces definir una clase que va a ser pasada por valor y no referencia? Una de las razones es si queremos tener algo inmutable, algo que sabemos que no debería poder ser cambiado fuera de su contexto. Las structs también son un poco más livianas que las clases a nivel de memoria y nos ahorran copiar datos uno por uno. El uso mas común de structs en los juegos es para definir datos “guardables”. Es decir, un set de datos que van a guardarse en un archivo, ya sea posicionamiento, vida, stats, o simplemente progreso de algún tipo. Esto nos permite implementar un sistema donde cargamos los datos del archivo como una struct y directamente lo copiamos a la entidad del jugador.

Player save data
Ejemplo de lo que sería un set de datos para un savegame

Sé que es un poco confuso encontrar usos para Structs cuando tenemos clases, asi que guíense por estos criterios:

  • Las structs nunca pueden ser null
  • Son ideales para pasaje de datos sin preocuparse con que algo quede referenciado a lo que no debe
  • Son muy útiles para manejar estructuras inmutables, como metadata de entidades
  • Son muy útiles cuando hay que operar sobre ellos

Veamos algunos ejemplos de structs en Unity

Vector3 es el componente principal de posicionamiento en Unity, se trata de una estructura que contiene 3 coordenadas. Vector3 es una struct y gracias a eso se puede operar cómodamente en vectores. En este ejemplo tenemos una función que crea una casa dada a una distancia dada del personaje que lanza este script.

vector3
Si vector3 no fuera una Struct, housePosition seria una referencia a la posición del personaje, por ende, al ejecutar la suma, estaríamos alterando la posición del personaje, y en realidad lo que queremos es designar la posición donde la casa va a instanciarse.

Color es un componente compuesto por los valores RGBA que representan un color. En este ejemplo, una función recibe como parámetro un Color y dentro del método se hacen operaciones al color, sin embargo, el valor de origen no cambia porque las operaciones solo afectan a la copia que existe en el contexto de ese método.

color
El “col” original no va a cambiar su alpha y una vez que esta función termine, el color del sprite renderer va a cambiar, pero la instancia de la struct que se creó en ese método ya no va a existir. No hay referencias perdidas con las structs.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s