Noticias

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

como guardar partida ?

Iniciado por neiro, Enero 29, 2017, 01:39:01 PM

Tema anterior - Siguiente tema
Enero 29, 2017, 01:39:01 PM Ultima modificación: Enero 31, 2017, 12:06:27 AM por pioj
Llevo un par de semanas en las que estoy intentando guardar partida en un juego y cargar pero lamentablemente no me salen.
 
Este es el código que llevo por ahora y me da error de cifrado creo que es el MonoBehaviour en un objeto al guardar o el cifrado.
 
y ya no se como arreglarlo sinceramente yo quiero que el script fecha o que objetos spawneables al guardar se queden en el mismo sitio (aun no meti el codigo) se puedan  guardar y cargar pero me da siempre ese error
 
Los scripts los tengo en un objeto donde arrastro los scripts.
 
 
 
 
 

Hola, el error se debe en principio por lo que te dice la consola, fijate que nunca se debe crear un monobehavior con el new, generalmente se declara y se asocia a algun componente.
 

RigidBody rg = new RigidBody();   //mal
RigidBody rg = gameObject.AddComponent<RigidBody>();   //bien

 
En lo referente a guardar la partida, la clase serializable no debe heredar de monobehavior, tenes que utilizar una clase que lleve los datos "puros" como quien dice, nativos de C# (int, float ,strings). Existen en el asset store "serializadores" de todo, ni idea como funcionan. Yo en un momento tambien tenia problemas para guardar las posiciones y demas, proba con almacenar los floats de las coordenadas en vez de los vector3. Al final utilice xml y santo remedio, para los transforms usaba estructuras definidas por mi y listo. Incluso estaba tan desesperado que me hice un sistemita txt xD (funcionó de maravilla).
 
Como observacion que cada vez que guardas ademas estas creando fecha (que estaria mal por el error que te dice la consola), cuando el objeto que seguramente tiene los datos no lo estas considerando. A la hora de guardar tenes que pedirle a ese objeto (unico quizas) que está en escena que te pase los datos, a esos datos lo metes en la clase serializable, y luego serializas dicha clase con el binaryformatter.
 
Saludos

Enero 29, 2017, 04:54:02 PM #2 Ultima modificación: Enero 29, 2017, 04:58:14 PM por neiro
Cita de: lightbug date=1485704047Hola, el error se debe en principio por lo que te dice la consola, fijate que nunca se debe crear un monobehavior con el new, generalmente se declara y se asocia a algun componente.
   
   

RigidBody rg = new RigidBody();   //mal
RigidBody rg = gameObject.AddComponent<RigidBody>();   //bien

   
      En lo referente a guardar la partida, la clase serializable no debe heredar de monobehavior, tenes que utilizar una clase que lleve los datos "puros" como quien dice, nativos de C# (int, float ,strings). Existen en el asset store "serializadores" de todo, ni idea como funcionan. Yo en un momento tambien tenia problemas para guardar las posiciones y demas, proba con almacenar los floats de las coordenadas en vez de los vector3. Al final utilice xml y santo remedio, para los transforms usaba estructuras definidas por mi y listo. Incluso estaba tan desesperado que me hice un sistemita txt xD (funcionó de maravilla).
   
   
      Como observacion que cada vez que guardas ademas estas creando fecha (que estaria mal por el error que te dice la consola), cuando el objeto que seguramente tiene los datos no lo estas considerando. A la hora de guardar tenes que pedirle a ese objeto (unico quizas) que está en escena que te pase los datos, a esos datos lo metes en la clase serializable, y luego serializas dicha clase con el binaryformatter.
   
   
      Saludos
   


me podrias enseñar a como guardar y cargar bien partida con algun ejemplo, te lo agradeceria muchisimo
 
sobretodo lo que quiero es que cuando spawne un objeto (ej enemigo) se guarde y al cargar siga en el mismo lugar con los mismos datos en sus scripts
 
y la verdad llevo dos semanas volviendome loco

Hola Neiro.

No lo estás haciendo mal. La mejor manera de cargar y guardar datos es creando una clase serializada con todos los datos que quieras guardar. Hasta ahí bien.
 
Pero creo que el problema que tienes, como te dice la consola, es que estás intentando acceder a una instancia de una clase que no está instanciada. Apostaría a que es el objeto "fecha" de la clase "Fecha". Cuando lo asignas a Calendario, esta clase está correctamente instanciada con new Fecha(); pero "fecha" que lo tienes declarado como public, parece no estar instanciado. ¿Tienes la clase "SaveLoad" asignada como componente de script a algun GameObject?. Deberías ver en el inspector de este GameObject las variables de la clase "Fecha".
 
Prueba a depurar paso a paso y ver en qué línea te salta la excepción... Yo creo que es en la línea 31: "calendario.dia = fecha.dia;"
 
No se si me he explicado...
 
Te adjunto un script que funciona como tu quieres, pero tienes que asociarlo a un GameObject.
 
Nos cuentas!!

Un saludo.
 
//www.unityspain.com/applications/core/interface/file/attachment.php?id=10144">saveload.cs

Febrero 11, 2017, 01:15:47 AM #4 Ultima modificación: Febrero 11, 2017, 01:18:58 AM por Ness
Deberia probar playerprefac es mucho mas persistente y no importa si se cierra el programa los datos se mantiene dentro de una carpeta en el proyecto.

Cita de: Ness date=1486772147Deberia probar playerprefac es mucho mas persistente y no importa si se cierra el programa los datos se mantiene dentro de una carpeta en el proyecto.
   


Justamente eso significa persistente que los datos no desaparecen con ninguno de los metodos, no es que uno sea "mas" persistente que otro, para proyectos de la vida real playerprefs es muy limitado, y no usado casi. Con serializacion podes setear el directorio donde vos quieras, con player prefs estas limitado a un solo lugar dependiendo del Sistema Operativo:
 
https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
 
Eso si es muy comodo, seteas los parametros a guardar le das Save y listo (incluso se guardan aunque no les des Save siempre que la App no salga prematuramente), pero estas limitado a este tipo de datos, es lindo cuando queres guardar brillo, fullscreen on/off y ese tipo de cosas, pero cuando queres guardar transforms, vectores y demas si o si tenes que serializar.

Cita de: Ness date=1486772147Deberia probar playerprefac es mucho mas persistente y no importa si se cierra el programa los datos se mantiene dentro de una carpeta en el proyecto.
   


Enserio no usen PlayerPrefs, Esto no se usa para guardar ni cargar partidas ¡NUNCA! como mucho guarden configuracion tal como la resolucion o opciones graficas pero no mas.
 
Esos datos se guardan en:
 
Windows-> Registro de windows-> HKCU\Software\[company name]\[product name]\Key
 
Linux-> ~/.config/unity3d/[CompanyName]/[ProductName]\... (donde la virgulilla '~' es /home/[nombre usuario]) y la carpenta config es de tipo oculto ya que empieza por '.'
 
______________________________________
 
Para guardar hazlo en un archivo con las librerias IO para datos. tambien tienes JSON.

····>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()_๑۩۞۩๑ 



Al final lo logre hace unos días crear un sistema de serializado, gracias a  todos

Etiquetas: