Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: FiroH en Septiembre 24, 2015, 11:46:43 PM

Título: PlayerPrefs.Save Peor?
Publicado por: FiroH en Septiembre 24, 2015, 11:46:43 PM
A grandes rasgos leí que PlayerPrefs.Save hace la función de checkpoint. (tal como viene en la documentación de Unity).
En el último juego que hice(para android), simplemente fui creando códigos de actualización con el if(haskey){get ....} else {set...}
La cosa es que sigo programando para android y quería saber si alguien en alguno de sus juegos para android, por eso de los recursos limitados lo ha usado, se le queda pillado el móvil o no es para tanto, y mas o menos que cantidad de datos mueve, por que en la documentación pone que se guarda absolutamente todo.
Es decir, PlayerPrefs.Save crea un player pref para cada variable del juego? =/
Hay alguna forma de pasar PlayerPrefs.Save solo a un código? como para hacer una biblioteca de variables que sean vitales guardar para el juego, no se...
Si alguien lo ha usado o tiene experiencia y me las quiere contar lo agradecería mucho.Saludos

Adjunto un trozo de código que use en duckstars para que podáis opinar también sobre el sistema que yo usaba para guardar y actualizar datos(save points)function Save()
{
 
   if (PlayerPrefs.HasKey("PuntuacionAlta")==true) 
  {
          Debug.Log("se comprueba valor");
          
          if(PlayerPrefs.GetInt("PuntuacionAlta")<Puntos.max)
         {
           
           PlayerPrefs.SetInt("PuntuacionAlta",Puntos.max);
         }  } 
  else
         {
          PlayerPrefs.SetInt("PuntuacionAlta",Puntos.max);
          Debug.Log("se guarda un valor");
         }
}
Título: PlayerPrefs.Save Peor?
Publicado por: iRobb en Septiembre 24, 2015, 11:55:22 PM
Claro. Yo lo que utilizo es serializar en binary (hasta con encriptación si es el caso) directamente una clase que contiene todos los parámetros que deseo guardar. Nada de playerprefs.  
Título: PlayerPrefs.Save Peor?
Publicado por: Final Level en Septiembre 26, 2015, 03:36:05 PM
[quote author=FiroH" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26335" data-ipsquote-contentcommentid="113332">A grandes rasgos leí que PlayerPrefs.Save hace la función de checkpoint. (tal como viene en la documentación de Unity).
En el último juego que hice(para android), simplemente fui creando códigos de actualización con el if(haskey){get ....} else {set...}
La cosa es que sigo programando para android y quería saber si alguien en alguno de sus juegos para android, por eso de los recursos limitados lo ha usado, se le queda pillado el móvil o no es para tanto, y mas o menos que cantidad de datos mueve, por que en la documentación pone que se guarda absolutamente todo.
Es decir, PlayerPrefs.Save crea un player pref para cada variable del juego? =/
Hay alguna forma de pasar PlayerPrefs.Save solo a un código? como para hacer una biblioteca de variables que sean vitales guardar para el juego, no se...
Si alguien lo ha usado o tiene experiencia y me las quiere contar lo agradecería mucho.Saludos

Adjunto un trozo de código que use en duckstars para que podáis opinar también sobre el sistema que yo usaba para guardar y actualizar datos(save points)function Save()
{
 
   if (PlayerPrefs.HasKey("PuntuacionAlta")==true) 
  {
          Debug.Log("se comprueba valor");
          
          if(PlayerPrefs.GetInt("PuntuacionAlta")<Puntos.max)
         {
           
           PlayerPrefs.SetInt("PuntuacionAlta",Puntos.max);
         }  } 
  else
         {
          PlayerPrefs.SetInt("PuntuacionAlta",Puntos.max);
          Debug.Log("se guarda un valor");
         }
}[/quote]Es difícil entenderte cuando hablas de "códigos de actualización". Pero bueno, si no te sirve lo que te explico, entonces es que no he entendido nada xD PlayerPrefs es una clase estática para guardar y cargar datos en un solo archivo por juego. Este archivo almacena datos en binario(creo que JSON en binario) asignados a una clave(Key) tal y como un Dictionary. El archivo es abierto desde un principio cuando 
Título: PlayerPrefs.Save Peor?
Publicado por: FiroH en Septiembre 26, 2015, 08:30:49 PM
Entonces playerpref.save() solo guardaria a un archivo en binario todo lo que ya exista con un haskey anterior?
Título: PlayerPrefs.Save Peor?
Publicado por: Final Level en Septiembre 26, 2015, 11:28:09 PM
[quote author=FiroH" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26335" data-ipsquote-contentcommentid="113859">Entonces playerpref.save() solo guardaria a un archivo en binario todo lo que ya exista con un haskey anterior?[/quote]Por favor, antes de preguntar asegúrate de que tu pregunta es de fácil comprensión para los que la leerán. Recuerda que eres tú el que pide ayuda, según esté formulada tu pregunta, así será la respuesta. Vamos, que me llames subnormal o lo que quieras, pero sigo sin entender del todo la cuestión.Para empezar, HasKey(Has, del verbo "tener" y Key, que se traduce como "clave"), es una función que devuelve un valor booleano(bool) para comprobar si entre los datos, existe la clave con el nombre que le pasas en su parámetro. Devolverá true si existe, o false si no existe. Por tanto, creo que tu pregunta no tiene sentido.Intentaré explicártelo más detalladamente y ya tú sacas tus conclusiones: Supongamos que tenemos estas instrucciones dentro de una función del código de nuestro juego:
PlayerPrefs.SetInt("puntuacion_maxima", 85324);
PlayerPrefs.SetInt("nivel", 7);
PlayerPrefs.SetInt("vidas", 3);
Pues bien, esto no guardaría nada en ningún archivo. Lo único que haría es crear variables con valores indexados con claves en la memoria RAM, y no en un archivo. Esta sería la representación gráfica de los datos creados con el código anterior:(http://i.imgur.com/09FEGbN.png)Cuando el programa(juego), llegue a la instrucción PlayerPrefs.Save(); en cualquier parte de nuestro código, todos los datos de esa tabla serán almacenados en un archivo en el disco duro/ROM.Después de esto, en cualquier momento se podría actualizar individualmente cualquier valor sin que se pierdan los demás datos. Por ejemplo, "puntuacion_maxima":
PlayerPrefs.SetInt("puntuacion_maxima", 93200);
Como la clave "puntuacion_maxima" ya existía, su anterior valor asignado 85324 se sobreescribirá por 93200. Si no existiera, la crearía. Pero recuerda que esto actualizaría los datos solo en la memoria RAM. Hasta que no llamemos otra vez a PlayerPrefs.Save(), no se almacenaría en el archivo. Entonces, lo que haría PlayerPrefs.Save(), sería simplemente pasar todos los datos de la memoria RAM al archivo. Espero que lo hayas entendido porque no sabría cómo explicártelo mejor.
Título: PlayerPrefs.Save Peor?
Publicado por: FiroH en Septiembre 27, 2015, 01:29:10 PM
Me vale, por que si funciona asi, puedo crear una clase e indexarla a un botton tipo guardar para con una funcion actualizar todos los haskeys y pasar finalmente la funcion playerprefs.save() para realizar puntos de guardado.
 Por otra parte en mi ultimo juego, duckstars para android nunca use la función playerprefs.save() y saliendo y entrando a la aplicación día tras día los datos se habían actualizado solo con la memoria RAM? 
La pregunta era que si usar la funcion playerprefs.save() era peor que crear y actualizar los playerprefs, por que en la documentación daba a entender que guardaba cada uno de los valores existentes en el juego(variables) y debido a que la plataforma de soporte sería android, podía llegar a ralentizarse mucho.
Segun la documentacion de Unity:
 

PlayerPrefs.Save

 
 
 
public static function Save(): void;

Description

Writes all modified preferences to disk.
By default Unity writes preferences to disk on Application Quit. In case when the game crashes or otherwise prematuraly exits, you might want to write the PlayerPrefs at sensible 'checkpoints' in your game. This function will write to disk potentially causing a small hiccup, therefore it is not recommended to call during actual gameplay.

Note: On Windows Store Apps and Windows Phone 8.1 preferences are saved during application suspend, because there's no application quit event.

"y olle, tranquilo viejo XD"
Título: PlayerPrefs.Save Peor?
Publicado por: Final Level en Septiembre 27, 2015, 04:04:20 PM
¿Tranquilo? yo apenas me altero. Si vas a ayudar en algo, responde como puedas. Pero si pides ayuda, asegúrate antes de clickar el botón de enviar, de que las demás personas no van a perder el tiempo leyéndote. Eso era todo lo que te decía y en ningún momento me he alterado lo más mínimo. Al fin y al cabo, tenemos la libertad de ignorar los post que queramos, pero supongo que eso no es lo que quiere el que pide ayuda, no? Has necesitado tres mensajes para explicarte medio adecuadamente, pero al menos lo has conseguido y solo por eso te voy a contestar una vez más xDComo bien dice la documentación, PlayerPrefs.Save almacenará los datos en el disco, aunque por defecto, si hay datos de PlayerPrefs en memoria, Unity los guarda automáticamente al dispararse el evento Application Quit, es decir, cuando el usuario cierra la aplicación. Pero si no usas PlayerPrefs.Save, los datos no se guardarán en el disco si el juego se ha cerrado inesperadamente por cualquier error, corte de electricidad, o lo que sea, ya que esto no disparará el evento Application Quit. Como imaginarás, esto es menos probable en juegos para Android a no ser que se te acabe la batería o tu juego tenga errores que provoquen un crash repentino. Además, menciona que puede congelarse el juego durante el proceso de guardado, pero como te dije antes, esto dependerá de la cantidad de datos a guardar y también de las prestaciones del dispositivo. Así que se recomienda usar "momentos" clave para el guardado con PlayerPrefs.Save() y no durante el gameplay. Fíjate en los juegos de la Playstation antigua, tiene pausas para guardar el juego porque el acceso a la memory card es lento y el juego se quedaría trabado 5 o 6 segundos hasta que almacena los datos  Lo que habrá pasado en tu último juego, es que los datos se han almacenado porque Unity los guarda automáticamente si cierras la aplicación manualmente, pero si un usuario de tu juego está jugando tranquilamente y de pronto el juego crashea o se le apaga por no tener batería, los últimos datos actualizados se habrían perdido en el limbo.
Título: PlayerPrefs.Save Peor?
Publicado por: kaito en Septiembre 27, 2015, 04:47:05 PM
@FiroH, quizás lo que necesitas es crear un Streaming Database(base de datos de emision en tiempo real), que guarda distintos tipos de datos en un mismo archivo. Puedes ver: 
Título: PlayerPrefs.Save Peor?
Publicado por: iRobb en Septiembre 27, 2015, 07:32:31 PM
[quote author=Final Level" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26335" data-ipsquote-contentcommentid="114040">¿Tranquilo? yo apenas me altero. Si vas a ayudar en algo, responde como puedas. Pero si pides ayuda, asegúrate antes de clickar el botón de enviar, de que las demás personas no van a perder el tiempo leyéndote. Eso era todo lo que te decía y en ningún momento me he alterado lo más mínimo. Al fin y al cabo, tenemos la libertad de ignorar los post que queramos, pero supongo que eso no es lo que quiere el que pide ayuda, no? Has necesitado tres mensajes para explicarte medio adecuadamente, pero al menos lo has conseguido y solo por eso te voy a contestar una vez más xDComo bien dice la documentación, PlayerPrefs.Save almacenará los datos en el disco, aunque por defecto, si hay datos de PlayerPrefs en memoria, Unity los guarda automáticamente al dispararse el evento Application Quit, es decir, cuando el usuario cierra la aplicación. Pero si no usas PlayerPrefs.Save, los datos no se guardarán en el disco si el juego se ha cerrado inesperadamente por cualquier error, corte de electricidad, o lo que sea, ya que esto no disparará el evento Application Quit. Como imaginarás, esto es menos probable en juegos para Android a no ser que se te acabe la batería o tu juego tenga errores que provoquen un crash repentino. Además, menciona que puede congelarse el juego durante el proceso de guardado, pero como te dije antes, esto dependerá de la cantidad de datos a guardar y también de las prestaciones del dispositivo. Así que se recomienda usar "momentos" clave para el guardado con PlayerPrefs.Save() y no durante el gameplay. Fíjate en los juegos de la Playstation antigua, tiene pausas para guardar el juego porque el acceso a la memory card es lento y el juego se quedaría trabado 5 o 6 segundos hasta que almacena los datos :(
Título: PlayerPrefs.Save Peor?
Publicado por: Final Level en Septiembre 27, 2015, 08:17:58 PM
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26335" data-ipsquote-contentcommentid="114074">Lo que comentas del playerprefs.save, "que almacenará etc, y si no lo usas los datos etc" puedes colocar el link de la documentación? Estoy muy interesado.[/quote]Te refieres a la documentación de la clase PlayerPrefs? Título: PlayerPrefs.Save Peor?
Publicado por: iRobb en Septiembre 27, 2015, 08:32:12 PM
[quote author=Final Level" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26335" data-ipsquote-contentcommentid="114085"> Te refieres a la documentación de la clase PlayerPrefs?http://docs.unity3d.com/ScriptReference/PlayerPrefs.html[/quote]Particularmente esto:"
Título: PlayerPrefs.Save Peor?
Publicado por: Final Level en Septiembre 27, 2015, 08:43:40 PM
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26335" data-ipsquote-contentcommentid="114086">Particularmente esto:"PlayerPrefs.Save almacenará los datos en el disco, aunque por defecto, si hay datos de PlayerPrefs en memoria, Unity los guarda automáticamente al dispararse el evento Application Quit, es decir, cuando el usuario cierra la aplicación. Pero si no usas PlayerPrefs.Save, los datos no se guardarán en el disco si el juego se ha cerrado inesperadamente por cualquier error, corte de electricidad, o lo que sea, ya que esto no disparará el evento Application Quit"[/quote]  Título: PlayerPrefs.Save Peor?
Publicado por: iRobb en Septiembre 27, 2015, 08:52:56 PM
Entendido