Jump to content
UnitySpain
Auronity

Sistema Guardar/Cargar

Recommended Posts

Hola, he estado investigando como hacer para guardar los cambios en mi aplicación y cargarlos cuando vuelva a abrirla, lo único que necesito almacenar es las posiciones de las instancias, ademas de su color y nombre; y la rotación del objeto principal. ¿Como podría hacerlo?

Share this post


Link to post
Share on other sites

Si ya, he visto que esos son los dos métodos, pero lo que no tengo claro es como tendría que hacer para guardar las variables y eso...

Share this post


Link to post
Share on other sites
8 hours ago, Auronity said:

¿Como podría hacerlo?

siempre que seas capaz de traducir lo que desees de la escena (posiciones, rotaciones y/o color de determinados objetos, como decis) a un formato cualquiera(xml, json, binario en general, txt, etc), y que luego seas capaz de leer dicho formato para cargar la info en la escena... listo, en eso consta guardar y cargar. incluso con un txt podes hacerlo. El dilema que viene luego es como está organizado dicho formato.

Yo conozco tres formas:

  • Si usas algo conocido (xml, JSON, playerPrefs) debes hacer las cosas como ellos dicen y tenes sus vulnerabilidades, JSON es muy conocido y comodo, unity lo soporta bien, guardar vectores, quaternions y colores es pan comido, pero, tambien es pan comido para mi meterme en los json y toquetear todo. igual es un formato muy lindo y amigable
  • Si usas algo propio, (un binario o texto ".Auronity"),tenes la ventaja de que vos elegis como organizarte a la hora de todo, claro que luego debes construir tu propio parser. Podes meter algoritmos para enmascarar cada vez mas la info, podes incluir headers que tengan info de como decodificar todo, y asi, y asi.... Es muy util para practicarlo.
  • Usar el formateador binario de Unity(en si de System), agarras una clase serializible con los datos bien basicos de C# (int, string, float, long, double ,etc) y le decis armame el binario de esta clase que me intesa y guardalo en tal lugar. Unity te va a hacer un chorizo de binario que nadie entiende solo Unity, y luego obviamente lo podes leer.

--------------------------------------------------------------------------------------------------------------------------------------------------------------

Pero tu problema no es esto, el problema que vas a tener cuando cargas tal informacion es, por ejemplo, tal posicion, a que objeto le corresponde? aca es donde tenes que ver como identificas cada objeto primero, entonces la posicion/rot o color ahora tiene un ID, que esta asociado a un objeto en particular, entonces lo que antes guardabas quizas era un vector3+Color+Quaternion...ahora es una estructura o clase generica con dos o mas datos:

class Data
{
	int id;
	Vector3 pos;
	Quaternion rot;
	Color color;
}

Entonces ahora no guardas colores, ni pos, etc... ahora guardas varios de estos "Data" , quizas una List<Data>. El id te sirve para identificar el objeto en escena, y el resto es informacion a cargar a dicho objeto. Esto es solo un ejemplo, podes hacerlo de la forma que quieras, por eso el énfasis en como te organizas, y no en como guardar/cargar.

Share this post


Link to post
Share on other sites

La aplicación es solo para uso personal así que la seguridad me da igual xD. Solo quiero saber cual es el método mas simple, ya que solo llevo un mes programando en C# y usando Unity

Share this post


Link to post
Share on other sites
On 10/10/2017 at 15:34, Auronity said:

La aplicación es solo para uso personal así que la seguridad me da igual xD. Solo quiero saber cual es el método mas simple, ya que solo llevo un mes programando en C# y usando Unity

Da igual cuanto lleves, metodo mas simple que otro no los hay, en todos tenes que aprender de 0, en algunos tenes mas que aprender que otro, te recomiendo que te auto exijas, en la programacion hay muchos caminos, eleji los menos costosos, pero no por ello mas faciles!
Lee sobre JSON y como encriptarlo, es lo mas "facil" para empezar
Abrazo!

Share this post


Link to post
Share on other sites

Aver si me aclaro, porque cuanto mas investigo mas me pierdo... Suponiendo que mi objetivo es guardar la rotación de un gameObject para poder cargarla cuando vuelva a abrir la aplicación, he visto que lo que tengo que hacer es crear un script donde se guarda el Quaternion serializable, y otro script que controla todo el proceso de guardar y cargar. Supongo que el script que guarda la rotacion del objeto debera ser un componente de ese objeto, corrijanme si me equivoco.

Ahora adjunto el script a ver si voy bien o que xD

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml.Serialization;

[System.Serializable]
public class Mapa : MonoBehaviour {

	public Quaternion rotacion;
}

El otro script lo tengo en blanco porque ese si que no entiendo nada. Espero que me puedan ayudar a ir paso a paso

Gracias

Share this post


Link to post
Share on other sites

A ver, no te líes, lo mas simple suele ser lo mejor casi siempre.

Tienes dos opciones, dependiendo de si necesitas proteger la información o no, como ya has dicho que no necesitas protegerla puedes usar el PlayerPrefs, que es mucho mas simple que la serialización, sobre todo porque dices que llevas poco y te veo un poco perdido.

El PlayerPrefs tiene la desventaja de que los datos son accesibles y no es lo mas elegante pero ya hemos visto que eso no te importa, en realidad esta pensado para guardar preferencias del jugador, por ejemplo si el sonido está activado en el juego o no y cosas de esas, pero en realidad podemos guardar lo que queramos.

Hay tres funciones para guardar y tres funciones para cargar información:

PlayerPrefs.SetFloat("NombreDelDato",valorFlotante);
PlayerPrefs.SetInt("NombreDelDato",valorEntero);
PlayerPrefs.SetString("NombreDelDato",valorString);

PlayerPrefs.GetFloat("NombreDelDato");
PlayerPrefs.GetInt("NombreDelDato");
PlayerPrefs.GetString("NombreDelDato");

Que sirven para cargar y guardar datos de tipo Int, String y Float

Lo que te interesa es guardar la información del transform.position y el transform.rotation, que son valores de Tipo Vector3 y Quaternion que estan compuestos por 3 y 4 valores float.

Pues cogemos la información y la guardamos en el PlayerPrefs:

//Declaramos las variables de la posicion y la rotacion.

float posicionX, posicionY, posicionZ;
float rotacionX, rotacionY, rotacionZ, rotacionW;

// Cogemos los valores de la posicion del transform del objeto

posicionX = objeto.transform.position.x;
posicionY = objeto.transform.position.y;
posicionZ = objeto.transform.postiion.z;

// Guardamos esos valores en el PlayerPrefs

PlayerPrefs.SetFloat("PosicionX", posicionX);
PlayerPrefs.SetFloat("PosicionY", posicionY);
PlayerPrefs.SetFloat("PosicionY", posicionY);

// Ahora con la rotacion.

rotacionX = objeto.transform.rotation.x;
rotacionY = objeto.transform.rotation.y;
rotacionZ = objeto.transform.rotation.z;
rotacionW = objeto.transform.rotation.w;

// Guaradamos la rotacion en el PlayerPrefs

PlayerPrefs.SetFloat("RotacionX", rotacionX);
PlayerPrefs.SetFloat("RotacionY", rotacionY);
PlayerPrefs.SetFloat("RotacionZ", rotacionZ);
PlayerPrefs.SetFloat("RotacionW", rotacionW);

Con esto lo tenemos guardado, dependiendo del sistema operativo que uses se guarda en un sitio o en otro en windows se guarda en el registro, en MAC en la carpeta Library/Preferences, en iOS en el directorio Preferences en un archivo con el nombre del desarrollador.plist, en Android en data/nombredelpaquete/shared_prefs y en el resto de sistemas no tengo ni pajolera idea.

La carga es idéntica al guardado: creas las variables y lees la información desde el playerPrefs (solo lo hago con una a modo de ejemplo que si no voy a acabar escribiendo un libro):

float posicionX;
posicionX = PlayerPrefs.GetFloat("PosicionX");

Cuando las tengas cargadas las metes en el position o en el rotation usando un Vector3 o un Quaternion;

Verctor3 posicionObjeto;

// Aqui leemos los valores guaradados y los metemos en las variables
// Despues de leidos los guardamos en el Vector3

posicionObjeto = new Vector3 (posicionX, posicionY, posicionZ);

// Y asignamos el Vector3 de la posicion al position del transform.

objeto.transform.position = posicionObjeto;

Y lo mismo con el rotation, pero con un Quaternion en vez de un vector3.

El código esta hecho de cabeza sobre la marcha y desde luego no esta probado asi que he podido meter la pata en algo, pero mi intención es que captes la idea. 

El PlayerPrefs tiene mas funciones, puedes comprobar si se ha guardado un dato, forzar que los datos se escriban en el disco (por ejemplo antes de salir del juego), borrar datos, o incluso vaciar todo el contenido del PlayerPrefs y cosas así, échale un vistazo a la API porque para almacenar poca información es bastante útil.

 

 

Share this post


Link to post
Share on other sites

Por eso nunca descargo proyectos hechos por novatos, o gente con poco conocimiento... Alguien me puede explicar por que usáis playerprefs como si fuese bueno?... Esta clase estática de la librería de UnityEngine guarda en los registros del sistema target, no tiene que ser usada para guardar datos de partidas de un juego... Imaginaros que gta guardase la partida en el registro de windows... Pues es lo que hacéis con plauerprefs... Llenar los registros de mierda. No se por que no leeis la documentación. Volviendo al hilo, JSON o XML son sencillos si no tienes idea de parsear información, si buscas que alguien te de código lo tienes chungo... Suerte

Share this post


Link to post
Share on other sites
7 hours ago, kingtrase said:

No se por que no leeis la documentación

 :6_smile::6_smile::6_smile: Por supuesto que lo sabés ... la flojera siempre gana.

8 hours ago, kingtrase said:

Alguien me puede explicar por que usáis playerprefs como si fuese bueno?

Yo por eso no lo incluí en la lista de posibilidades, pienso que debería ser erradicado de este mundo, su nombre tan noob me da náuseas, su existencia es como un virus que avanza y no se detiene, su utilidad, cercana a nula, si seguimos así nuestros hijos...que digo?... nuestros nietos lo van a usar para guardar sus datos! maldito seas PlayerPrefs! maldito!

Share this post


Link to post
Share on other sites
hace 17 horas, lightbug said:

 :6_smile::6_smile::6_smile: Por supuesto que lo sabés ... la flojera siempre gana.

Yo por eso no lo incluí en la lista de posibilidades, pienso que debería ser erradicado de este mundo, su nombre tan noob me da náuseas, su existencia es como un virus que avanza y no se detiene, su utilidad, cercana a nula, si seguimos así nuestros hijos...que digo?... nuestros nietos lo van a usar para guardar sus datos! maldito seas PlayerPrefs! maldito!

Jajajajaja sabes que no lo decía por ti amigo mio, tu comentario me hizo el día jajajaja

Share this post


Link to post
Share on other sites

Muchas gracias gZone, he probado el código tal  y como esta no tiene errores, el problema es que he querido separar la parte en que se guarda y carga los datos, metiendolas en un if (input.GetKeyDown... etc, dentro del Update, pero me  da error en las siguientes palabras:    

void Update () {
        // Guarda la info al archivo "miData" y la envía a la consola
        if (Input.GetKeyDown (KeyCode.S)) {
            listado[1] = new miData (transform.rotation);

            Guarda (archivo, listado);
            print ("guardado en archivo " + listado [1].rotacion ().ToString ());
        }

        // Carga la info desde el archivo y la envía a la consola
        if (Input.GetKeyDown (KeyCode.L)) {
            listado = Carga (archivo);

            if (listado == null)
                print ("error al cargar");
            else
                print ("cargado desde archivo " + listado [1].rotacion ().ToString ());
        }

    }

 

*He usado solo la rotación y omitido la posición

Edited by pioj
usa el <> para pegar código, pls

Share this post


Link to post
Share on other sites

habia pegado el codigo sin usar "code" para poner en rojo las palabras que me dan error, pero bueno... Las palabras que me dan error son: listado, archivo, rotacion y ToString

Share this post


Link to post
Share on other sites

×
×
  • Create New...