Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Sistema Guardar/Cargar

Iniciado por Auronity, Octubre 10, 2017, 05:21:15 PM

Tema anterior - Siguiente tema
Octubre 14, 2017, 12:34:16 PM #15 Ultima modificación: Octubre 14, 2017, 12:35:02 PM por Auronity
Perfecto, ya no da error. Lo he probado y parece que funciona, pulso S y guarda la rotación, lo muevo en un eje y guardo, y la rotación solo ha variado en ese eje. Hasta ahi todo bien. pero cuando pulso L para cargar solo me sale el mensaje en la consola pero el objeto no vuelve a la ultima posición guardada
 
Editado: ademas tampoco entiendo como funciona la parte de guardar, aunque he comprobado que funciona

Octubre 14, 2017, 01:04:33 PM #16 Ultima modificación: Octubre 14, 2017, 01:18:38 PM por Auronity
Funciona!!! Muchas gracias por la ayuda. Se supone que esto funcionara igual al cerrar la aplicacion y volverla a abrir, se cargara la posicion?
 
Editado: vale, acabo de comprobar que si, puedo seguir el mismo proceso para guardar la posicion de las instancias?

Octubre 14, 2017, 02:45:43 PM #17 Ultima modificación: Octubre 14, 2017, 02:48:13 PM por FNP
Cita de: kingtrase date=1507858520Por 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
   


Como he dicho:
 



   
      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,
   

[/quote]
 
Esas y no otras son las causas, pero al fin y al cabo, el registro es un váter, así que lo de llenarlo de mierda no es mas que su destino 
 
Seguro que cuando tenga muchos objetos hace un FindGameObjectWithTag en vez de crear hijos, o para invocar métodos de otros objetos un SendMessage, eso no es malo, es una forma de empezar.  Según se van teniendo las cosas claras se va avanzando. Para mí, una de las cagadas mas grandes de Unity es tener todo público y pasarlo por referencia mediante el editor y está a la orden del día, una bonita forma de joder la encapsulación.

Vale, nueva duda (para variar), para que se entienda mejor explicare que mi app consiste en una esfera (mapa) sobre el que se pueden colocar marcadores del estilo de Google Street View. Roto la esfera con las flechas del teclado y los marcadores se mueven con ella porque se emparentan al instanciarse.
 
Respecto al tema de guardar/cargar ya puedo guardar la rotación de la "tierra" y la posición de los marcadores, también puedo cargar la rotación de la "tierra" pero cuando intento cargar la posición de los marcadores, es la esfera la que cambia de posición.
 
Entiendo el error pero no se como arreglarlo. Aquí dejo el script:
 
 
 

using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Collections.Generic;
public class SaveLoad : MonoBehaviour {
//Para la Rotacion del mapa
dataR rotation;
string archivoR;
GameObject map;
//Para la posicion de los marcadores
GameObject[] listaMarcadores;
dataP position;
string archivoP;
[System.Serializable]
public class dataR {
   
   // data almacenada en formato string serializable
   private string rot;
   // Quaternion a String
   public dataR(Quaternion rotacion) {
      rot = JsonUtility.ToJson(rotacion);
   }
   // recupera Quaternion rotación
   public Quaternion rotacion() {
      return JsonUtility.FromJson<Quaternion> (rot);
   }
}
[System.Serializable]
public class dataP {
   // data almacenada en formato string serializable
   private string pos;
   // Vector3 a String
   public dataP(Vector3 posicion) {
      pos = JsonUtility.ToJson(posicion);
   }
   // recupera Vector3 posición
   public Vector3 posicion() {
      return JsonUtility.FromJson<Vector3> (pos);
   }
}
 
void Start () {
   map = GameObject.Find ("hell mundo");
   // un nombre de archivo
   archivoR = "R_data";
   archivoP = "P_data";
}
 
void Update () {
   // Guarda la info al archivo "data" y la envía a la consola
   if (Input.GetKeyDown (KeyCode.S)) {
      listaMarcadores = GameObject.FindGameObjectsWithTag ("Marcador");
      //Guardar rotacion del Mapa
      rotation = new dataR (transform.rotation);
      GuardaMapa (archivoR, rotation);
      print ("guardado en archivo " + rotation.rotacion ().ToString ());
      //Guardar posicion de los Marcadores
      for(int i=0; i<listaMarcadores.Length; i++){
         position = new dataP (listaMarcadores.transform.position);
         GuardaMarca (archivoP, position);
         print ("guardado en archivo " + position.posicion ().ToString ());
      }
   }
   // Carga la info desde el archivo
   if (Input.GetKeyDown (KeyCode.L)) {
      //Cargar rotacion del Mapa
      rotation = CargaMapa (archivoR);
      if (rotation == null) {
         print ("error al cargar");
      } else {
         map.transform.rotation = rotation.rotacion ();
         print ("cargado desde archivo " + rotation.rotacion ().ToString ());
      }
      //Cargar posicion de los Marcadores
      position = CargaMarca (archivoP);
      if (position == null) {
         print ("error al cargar");
      } else {
         map.transform.position = position.posicion ();
         print ("cargado desde archivo " + position.posicion ().ToString ());
      }
   }
}
//Guardar rotacion del Mapa
void GuardaMapa(string nombreArchivo, dataR rotation) {
   BinaryFormatter bufferData = new BinaryFormatter();
   FileStream archivo = File.Create (Application.persistentDataPath + "/" + nombreArchivo);
   bufferData.Serialize(archivo, rotation);
   archivo.Close();
}
//Cargar rotacion del Mapa
dataR CargaMapa(string nombreArchivo) {
   if (File.Exists (Application.persistentDataPath + "/" + nombreArchivo)) {
      BinaryFormatter bufferData = new BinaryFormatter ();
      FileStream archivo = File.Open (Application.persistentDataPath + "/" + nombreArchivo, FileMode.Open);
      dataR salida = (dataR)bufferData.Deserialize (archivo);
      archivo.Close ();
      return salida;
   } else {
      return null;
   }
}
 
//Guardar posicion de los Marcadores
void GuardaMarca(string nombreArchivo, dataP position) {
   BinaryFormatter bufferData = new BinaryFormatter();
   FileStream archivo = File.Create (Application.persistentDataPath + "/" + nombreArchivo);
   bufferData.Serialize(archivo, position);
   archivo.Close();
}
//Cargar posicion de los Marcadores
dataP CargaMarca(string nombreArchivo) {
   if (File.Exists (Application.persistentDataPath + "/" + nombreArchivo)) {
      BinaryFormatter bufferData = new BinaryFormatter ();
      FileStream archivo = File.Open (Application.persistentDataPath + "/" + nombreArchivo, FileMode.Open);
      dataP salida = (dataP)bufferData.Deserialize (archivo);
      archivo.Close ();
      return salida;
   } else {
      return null;
   }
}
}

 
Es una adaptación del script de gZone.
 
PD: El script es un componente de la esfera.

Octubre 17, 2017, 07:54:58 PM #19 Ultima modificación: Octubre 17, 2017, 07:55:31 PM por kingtrase
Cita de: FNP date=1507985143Esas y no otras son las causas, pero al fin y al cabo, el registro es un váter, así que lo de llenarlo de mierda no es mas que su destino 


No se lo que sabes sobre el Registro de windows... pero en el se guarda la configuración de tu ordenador, la de tu perfil de usuario, la información sobre programas, etc.
 
si crees que esos datos de carácter importante para el sistema están almacenados en un váter para que los gérmenes de vuestro juego se guarden en el pues pondré una vela cada noche por tu ordenador, pero te aseguro que yo prefiero mi váter limpio.

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Octubre 17, 2017, 09:02:04 PM #20 Ultima modificación: Octubre 17, 2017, 09:19:44 PM por Auronity
Sigo intentando implementar el guardado/cargado y he conseguido hacer que se guarden todas las instancias, durante las pruebas mantengo abierta la carpeta donde se guardan/cargan los datos para comprobarlo. Lo que me esta dando problemas ahora es el cargado, no se que linea estará mal en el código pero aun habiendo archivos en la carpeta, me devuelve null. Ayer conseguí que se cargaran todos los marcadores guardados menos el ultimo guardado, y cuando quise arreglarlo (cambiando una j del bucle for por j+1) solo conseguí que no encontrara ninguno. Aquí esta el script (solo la parte que me da problemas), Espero que si alguien ve el fallo me pueda ayudar a arreglarlo.
 
 
 

      // Carga la info desde el archivo
   if (Input.GetKeyDown (KeyCode.L)) {
      var datos = new DirectoryInfo (Application.persistentDataPath + "/MarkerData/");
      if (datas != null) {
         FileInfo[] dataCount = datos.GetFiles ();
         archivoP = new string[dataCount.Length];
         position = new dataP[dataCount.Length];
         //Cargar posicion de los Marcadores
         for (int j = 0; j < dataCount.Length; j++) {
            archivoP [j] = dataCount [j].ToString ();
            position [j] = CargaMarca (archivoP [j]);
            print (position [j]);   ////Aqui me devuelve null
            /*if (position [j] == null) {
               print ("No se encontró el archivo");
            } else {
               marcador = Instantiate (marcadorPrefab, position [j].posicion (), Quaternion.identity) as GameObject;                     //print ("cargado desde archivo " + position.posicion ().ToString ());
               print (position [j].posicion ().ToString ());
               print (archivoP [j]);
            }*/
         }
      }
   }
//Cargar posicion de los Marcadores
dataP CargaMarca(string nombreArchivo) {
if (File.Exists (Application.persistentDataPath + "/MarkerData/" + nombreArchivo)) {
   BinaryFormatter bufferData = new BinaryFormatter ();
   FileStream archivo = File.Open (Application.persistentDataPath + "/MarkerData/" + nombreArchivo, FileMode.Open);
   dataP salida = (dataP)bufferData.Deserialize (archivo);
   archivo.Close ();
   return salida;
} else {
   return null;
}
}

 
(Ya se que es una manera chapucera de hacer las cosas, pero de momento es lo que hay. Una vez consiga que funcione ya iré cambiando cosas para hacerlo mas eficiente, pero de momento me vale con que funcione.)
 
Editado: Vale, acabo de arreglarlo. El problema era que en el string guardaba todo el path, y luego el el método Cargar le pasaba todo ese path a la linea:
 

Application.persistentDataPath + "/MarkerData/" + nombreArchivo

 
lo cual es igual a C:/User/.../nombrearchivo, asi que estaba haciendo como en Origen xD: C:/User/.../C:/User/.../nombrearchivo, normal que fallara
 
Ya funciona perfectamente.

Hola de nuevo, resulta que ha aparecido un error inesperado e inexplicable. Como ya dije, solucione el problema de cargar los marcadores, pero para mi sorpresa, cuando creo un ejecutable y hago exactamente la misma prueba, en Unity me carga perfectamente pero en el .exe solo me carga la rotación del mapa, no los marcadores. Alguien puede explicarme que clase de brujería es esta?
 
Saludos

Cita de: kingtrase date=1508262898No se lo que sabes sobre el Registro de windows... pero en el se guarda la configuración de tu ordenador, la de tu perfil de usuario, la información sobre programas, etc.
   
   
      si crees que esos datos de carácter importante para el sistema están almacenados en un váter para que los gérmenes de vuestro juego se guarden en el pues pondré una vela cada noche por tu ordenador, pero te aseguro que yo prefiero mi váter limpio.
   


No has visto un registro de Windows limpio ni siquiera nada mas instalarlo .

Cita de: FNP date=1508353874No has visto un registro de Windows limpio ni siquiera nada mas instalarlo  
   



 
...quizas justo despues de un "format c:/"...

Cita de: lightbug date=1507863613Yo 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!
   


jeje... justo acabo de implementar un sistema de guardado usando el #~*! playerPrefs... jejeje, se que muchos os echareis al cuello... pero
 
 
 
Cita de: kingtrase date=1507858520Alguien me puede explicar por que usáis playerprefs como si fuese bueno?... 
   


normalmente solia grabar los datos en un txt... con strearRead/Writer...
 
pero como este proyecto va a ser multiplataforma pense que, para evitarme problemas, seria mejor hacerlo con otro sistema... 
 
empeze a mirar lo de serializar y tal... me parecion que iba a demasiado complejo... asi que decidi guardarlo con el PlayerPrefs de mier**, (primera vez que lo uso)... y ha quedao super simple... jeje... eso si... hay que desconponer los arrais o listas en elementos... y los vectores en 3 variables floats... y cosas asi... pero funcionar funciona bien... guarda varios arrays multidimensionales... incluso un array multidimensional formado por List<Vector3>... y sin problema...
 
ya se que es una "guarrada" hacerlo asi, pero pasaba de todo el lio que iba a suponer serializar todo... jeje...  estamos un poco con el tiempo al cuello... queremos sacar el proyecto cuanto antes... Si es caso, para la actualizacion, cambiaremos el sistema... pero de momento se queda asi...
 
ah, si alguien sabe de un buen tutorial de multiplayer via blueTooth... le agradeceria que me indicara donde "verlo"...
 
gracias, y un saludo

Etiquetas: