Noticias

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

PlayerPrefs.Save Peor?

Iniciado por FiroH, Septiembre 24, 2015, 11:46:43 PM

Tema anterior - Siguiente tema
A grandes rasgos leí que http://docs.unity3d.com/ScriptReference/PlayerPrefs.html" rel="external nofollow">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, http://docs.unity3d.com/ScriptReference/PlayerPrefs.html" rel="external nofollow">PlayerPrefs.Save crea un player pref para cada variable del juego? =/
Hay alguna forma de pasar http://docs.unity3d.com/ScriptReference/PlayerPrefs.html" rel="external nofollow">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");
         }
}

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.  

Septiembre 26, 2015, 03:36:05 PM #2 Ultima modificación: Septiembre 26, 2015, 06:22:11 PM por Final Level
[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 http://docs.unity3d.com/ScriptReference/PlayerPrefs.html">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, http://docs.unity3d.com/ScriptReference/PlayerPrefs.html">PlayerPrefs.Save crea un player pref para cada variable del juego? =/
Hay alguna forma de pasar http://docs.unity3d.com/ScriptReference/PlayerPrefs.html">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 PlayerPrefs.Save(), los datos de la memoria son escritos en el archivo, por lo que, el hecho de que se te quede pillado o no en el momento de hacer Save, supongo que dependerá de la cantidad de datos que hay que almacenar. Aunque generalmente, este es un proceso bastante rápido. El programador es el que decide cuáles datos se guardarán, obviamente. El tamaño del archivo es ilimitado excepto en juegos para el WebPlayer, que es de 1MB máximo, creo recordar.

Entonces playerpref.save() solo guardaria a un archivo en binario todo lo que ya exista con un haskey anterior?

Septiembre 26, 2015, 11:28:09 PM #4 Ultima modificación: Septiembre 26, 2015, 11:31:19 PM por Final Level
[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: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.

Septiembre 27, 2015, 01:29:10 PM #5 Ultima modificación: Septiembre 27, 2015, 01:30:44 PM por FiroH
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:
 

file:///C:/Program%20Files/Unity/Editor/Data/Documentation/en/ScriptReference/PlayerPrefs.html">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"

¿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.

Septiembre 27, 2015, 04:47:05 PM #7 Ultima modificación: Septiembre 27, 2015, 04:48:47 PM por kaito
@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: http://unityspain.com/topic/15882-byte-streaming-database-facil-de-utilizar/?preview=1" data-ipshover-timeout="1.5" itemprop="url" data-role="editableTitle" id="ips_uid_3" style="box-sizing: border-box; color: rgb(205, 56, 22); text-decoration: none; outline: 0px; line-height: 18px;" href="<___base_url___>/topic/15882-byte-streaming-database-facil-de-utilizar/">Byte Streaming DataBase (Facil de utilizar)

[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 :(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 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?http://docs.unity3d.com/ScriptReference/PlayerPrefs.html" rel="external nofollow date=1443375151]http://docs.unity3d.com/ScriptReference/PlayerPrefs.html

[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">http://docs.unity3d.com/ScriptReference/PlayerPrefs.html[/quote]Particularmente esto:"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 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] PlayerPrefs.Save es la función para almacenar los datos en el disco y no las funciones SetInt, SetFloat y SetString. Sólo tienes que hacer la prueba tú mismo.- En el artículo de PlayerPrefs.Save en la documentación, pone claramente que los datos se guardan automáticamente en el disco si existen(si has hecho algún SetInt, SetFloat, SetString), al dispararse el evento de Unity OnApplicationQuit.- El evento ApplicationQuit solo puede ser invocado si se ha cerrado la aplicación manualmente y no forzadamente(corte de electricidad, finalizar forzadamente el proceso del SO, Crash). Esto no tiene nada que ver con Unity, es algo básico de como funciona un programa informático.


Etiquetas: