Cómo guardar y cargar un VECTOR2 y VECTOR3 con PlayerPrefs en Unity

Introducción

La clase PlayerPrefs de Unity no tiene un método específico para guardar vectores, sin embargo tiene tres funciones que permiten guardar datos de tipo entero, float y strings, a los tipos de variable int y float se los conoce como variables primitivas y con ellas es posible reconstruir otras estructuras de datos mas complejas, y es que un vector de R2 o R3, si lo pensamos, no es mas que un arreglo de tres variables de tipo float, que cada una ocupa una posición o tiene un significado.

Paquete de Unity para Descargar

A continuación puedes descargar el paquete de Unity para importar en tu proyecto, dentro encontrarás los archivos que se utilizan en el vídeo de más abajo, el Script que se encarga de Guardar y Cargar los datos en Unity y también la escena donde está definida la interfaz gráfica y demás elementos.

paquete de unity con solucion implementada para guardar y cargar vector3 en unity
Fig. 1: Archivos que se añaden a tu proyecto al importar el paquete de descarga.

En el siguiente vídeo vemos cómo guardar y cargar DATOS PRIMITIVOS con PlayerPrefs en Unity


Análisis de cómo guardar un Vector3 con PlayerPrefs

La idea es descomponer el vector en sus componentes que son datos de tipo float y guardarlas de manera individual con PlayerPrefs, luego, al momento de hacer la carga de datos, recuperar cada componente de la memoria y crear un nuevo vector usando esas componentes.

En la escena que viene en el paquete de descarga ya se encuentra montada la solución, en la figura 2 vemos cómo está compuesta la jerarquía, tenemos un GameObject llamado “SaveDataScript” que es el que tiene asignado el Script que vamos a analizar (ver figura 3) y este se encarga de hacer el guardado y la carga de datos. Luego tenemos otro GameObject llamado “ObjectToSavePosition” que es un cubo al que le guardaremos su posición para poder cargarla al iniciar la escena. Observen que en el inspector en la figura 3, nuestro Script tiene una referencia a este objeto, esto le permitirá leer y modificar sus variables o ejecutar funciones sobre este GameObject, siempre insisto que entender el concepto de referencia en programación es un pilar muy importante en el desarrollo de aplicaciones con Unity.

paquete de unity con solucion implementada para guardar y cargar vector3 en unity
Fig. 2: GameObject de la escena que va a contener el script para guardar y cargar un Vector3 en Unity.
paquete de unity con solucion implementada para guardar y cargar vector3 en unity
Fig. 3: Script para guardar y cargar Vector3 en Unity visto desde el inspector.

Script que se encargar de guardar y cargar el vector

En la figura 4 vemos una parte del Script del guardado de datos que viene en el paquete, vemos que está definida la variable “objectWithSavedPosition” de tipo GameObject que aparece en el inspector de la figura 3 y también vemos los métodos Awake y Start, que son funciones que Unity ejecuta automáticamente en distintos tiempos dentro del ciclo de vida de la aplicación. Dentro se ejecuta una función llamada “LoadData” que es la que se encarga de cargar la información, la vemos mas adelante. La carga de datos es algo que normalmente ocurre al iniciar una escena, a veces pueden surgir problemas dependiendo de dónde se haga la carga de datos, recordemos que las funciones Start se ejecutan una atrás de otra para cada GameObject en un orden que no podemos predecir o que sería tedioso predecir, imaginen que un Script en su función Start utiliza variables de otro Script que aún no ha cargado sus datos!

paquete de unity con solucion implementada para guardar y cargar vector3 en unity
Fig. 4: Script para guardar y cargar Vector3 en Unity, variables e inicialización.

En los juegos se suelen tener atajos para guardado y carga rápida, en la figura 5 tenemos unas instrucciones que hacen precisamente esto, noten que al presionar F5 se ejecuta una función llamada “SaveData” que se encarga de hacer el guardado, sería conveniente que el guardado de todas las variables necesarias se haga dentro de esa función o que en el interior se llamen a otras funciones que se encarguen de guardar otros datos, de esa forma una vez que ejecutamos la instrucción SaveData estamos seguros de que toda la información se ha guardado, lo mismo para la función “LoadData” que se encarga de leer los datos guardados en la memoria e inicializar las variables con esos datos.

paquete de unity con solucion implementada para guardar y cargar vector3 en unity
Fig. 5: Funciones para testear el guardado y la carga de un Vector3 en Unity.

Ejemplo de cómo guardar un Vector3 utilizando PlayerPrefs

En la figura 6 se muestra el contenido de la función SaveData que es la que se encarga de guardar los datos del vector que posteriormente nos permitirán reconstruirlo. Observen que primero se hace una descomposición del vector que se quiere guardar en sus variables X, Y y Z, se las almacena en las variables temporales “positionX”, “positionY” y “positionZ”.

El guardado de datos con PlayerPrefs se hace en las últimas tres instrucciones, observen el nombre que se pasa como etiqueta de esos guardados, estos nombres deberemos usarlos en la carga de datos para poder recuperarlos.

paquete de unity con solucion implementada para guardar y cargar vector3 en unity
Fig. 6: Instrucciones para GUARDAR un dato tipo Vector3 con PlayerPrefs en Unity.

Ejemplo de cómo cargar un Vector3 utilizando PlayerPrefs

En la figura 7 se muestra el contenido de la función LoadData que es la que se encarga de cargar los datos almacenados en la memoria y hacer una reconstrucción del vector, la carga es el proceso inverso, primero recuperamos los datos de la memoria, esto lo hacemos con las funciones GetFloat de PlayerPrefs, pasando la etiqueta que se usó para cada dato y en este ejemplo incluyo el valor 0 en caso de que no exista información almacenada anteriormente, esto nos permite llamarlo directamente en Start y que no haya conflictos la primera vez que la aplicación se ejecute.

La siguiente instrucción se encarga de crear el Vector3 a partir de los datos recuperados de la memoria, Vector3 y en general la mayoría de las clases tienen constructores que nos permiten crear los datos dándoles valores iniciales.

El problema no termina aquí, ya que hemos leído la información, recuperado el vector pero aún no le hemos dicho a nuestro GameObject que se posicione correctamente, esto se hace en la última instrucción de la figura 7.

paquete de unity con solucion implementada para guardar y cargar vector3 en unity
Fig. 7: Instrucciones para CARGAR un dato tipo Vector3 con PlayerPrefs en Unity.

Scroll al inicio
Secured By miniOrange