Noticias

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

Serializar GameObjects

Iniciado por zelleGames, Mayo 20, 2017, 01:22:20 PM

Tema anterior - Siguiente tema
Mayo 20, 2017, 01:22:20 PM Ultima modificación: Mayo 20, 2017, 02:51:16 PM por pioj
Buenas gente, 
 
 
 
Estoy cacharreando con un juego de coger recursos como metal, fristal etc... y construir cosas y estoy aprendiendo a guardar el juego y mas o menos lo tengo pillado, ahora estoy intentando serializar objetos de la escena, en este caso los recursos que hay en la escena, para luego cargarlos en la posicion donde estaban. El caso es que parece que GameObjects no se pueden serializar, me sale un error que indica lo siguiente:
 



   
      SerializationException:TypeUnityEngine.GameObject is not marked as Serializable...
   

[/quote]
 
Sabeis sino se puede o estoy haciendo algo mal?
 
 
 
Es una pena porque seria muy util ya que meto los GameObjects en un array y luego al cargarlos los instancio.
 
 
 
Un saludo!!

Hola! Tienes varias formas de conseguir lo que quieres, pero las clases que hereden de MonoBehaviour no se pueden serializar.
 
Para serializar los objetos puedes usar XML, binario o PlayerPrefs.
 
Hay bastante info y ejemplos, mucha suerte!!

En binario me parece que no podes poner un gameObject como serializable asi nomas, sino que tenes que ir guardando sus datos mas basicos de C# como float int string etc y luego juntarlos al cargar para alimentar a tus gameobjects con los datos. Yo uso JSON por su simpleza, podes guardar casi todo especifico de Unity, un gameObject, un transform, lo que sea. No es binario.
 
Cita de: memonic date=1495279340Es una pena porque seria muy util ya que meto los GameObjects en un array y luego al cargarlos los instancio.
   


Una de las cosas que tenes que hacer es encontrar lo minimo e indispensable que te va a ser de utilidad a la hora de guardar, aunque no se bien que es lo que estas haciendo. Por ejemplo yo tengo un scritp que el objeto que lo tiene se guardara, y tengo un enum que le digo el que se va a guardar de dicho objeto. Cada objeto con este script tiene un ID, ya que el id que proporciona Unity cambia de carga en carga de escena y no sirve. Entonces los datos a guardar indispensable son posicion (Vector3), existe o no (bool) ,rotacion (Quaternion) y floats relacionado a stats del Player.
 
saludos

Gracias por las respuestas!!
 
He estado trasteando y en binario es mucho lio, para el inventario y valores del jugador como nivel, fuerza, agilidad etc...si me va bien. Ademas por lo que he leido no se puede modificar, asi que es mas sefuro. Pero luego como en el juego hay muchos recursos naturales que puedes coger y una vez cogidos desaparecen, tambien puesdes crear casas, farolas, tiendas, molinos etc...y los puedes poner donde quieras, meto todo eso en un array de objetos y no consigo recorrerlo bien y salvar y cargar los datos.
 
He visto tutoriales de JSON y XML y parece mas sencillo que con arrays. Probare con json y ya os ire contando.
 
Unity tiene su propia utilidad de json ¿verdad? He visto que hay gente que usa librerias externas como LITEJSON,¿que es mejor?
 
 
 
Gracias de nuevo!!

Cita de: memonic date=1495535581Unity tiene su propia utilidad de json ¿verdad? He visto que hay gente que usa librerias externas como LITEJSON,¿que es mejor?
   


de 5.3 en adelante Unity trae JSONUtility, yo arranque usando esa cuando lo conocí y muchos dicen que es genial asi que, para lo basico me parece que alcanza y sobra. Json se usa como xml para datos que incluso se pueden agregar a mano, editores de niveles, etc. Si estas guardando datos de una partida y cosas por el estilo el jugador podria ir y modificar datos claves o incluso buguear algo, por eso el binario es el favorito aca, pero si el jugador tiene la idea de meterse a tocar algo del juego para hacer trampa yo digo que el del problema es el jugador y ojala me haya comprado el juego y se le buguee todo y no le ande mas por tramposo hijo de p#%&!!!

Junio 19, 2017, 08:46:51 PM #5 Ultima modificación: Junio 19, 2017, 09:52:45 PM por pioj
Buenas, 
 
He conseguido al final guardar objetos y serializarlos mediante listas, guardando los datos importantes, en este caso el tipo de objeto, la posicion y su rotacion.
 
Los objetos los carga bien, los instancio en su posicion correcta pero no con su rotacion...
 
 
 
Al guardarlos guardo su transform.rotation.x,  la Y y la Z.
 
Y luego cuando los instancio hago lo siguiente:
 



   
      Instantiate(Resource.Load("TIENDA"), new vector3(item.xPos, item.yPos, item.zPos), Quaternion.Euler(item.xRot,item.yRot,item.zRot));
   

[/quote]
 
 
 
La posicion funciona bien pero la rotacion no.... ¿Sabeis que tengo que poner?
 
 
 
 
 
Muchas gracias!!

Cita de: memonic date=1497898011Buenas, 
   
   
      He conseguido al final guardar objetos y serializarlos mediante listas, guardando los datos importantes, en este caso el tipo de objeto, la posicion y su rotacion.
   
   
      Los objetos los carga bien, los instancio en su posicion correcta pero no con su rotacion...
   
   
       
   
   
      Al guardarlos guardo su transform.rotation.x,  la Y y la Z.
   
   
      Y luego cuando los instancio hago lo siguiente:
   
   
      Instantiate(Resource.Load("TIENDA"), new vector3(item.xPos, item.yPos, item.zPos), Quaternion.Euler(item.xRot,item.yRot,item.zRot));
   
   
       
   
   
      La posicion funciona bien pero la rotacion no.... ¿Sabeis que tengo que poner?
   
   
       
   
   
       
   
   
      Muchas gracias!!
   


Es porque lo estas haciendo mal, no tenes que usar Quaternion.euler eso traduce un eulerAngle en un quaternion cuando lo que vos tenes de datos es un quaternion, usa mas bien algo asi (no se si estara bien):
 

Quaternion rotationLoaded = new Quaternion( x , y, z , w );
Instantiate( (obj), (pos), rotationLoaded );

 
Un quaternion es un vector de 4 dimensiones, guarda tambien el cuarto componenete aunque me parece que siempre es 1, no lo se, por las dudas guardalo.
 
https://docs.unity3d.com/ScriptReference/Quaternion.html

Los objetos/clases de UnityEngine no están serializados.
 
Tampoco dispone de una sistema de guardado propio.
 
Tienes que crear tu propio método/sistema para guardar la partida y sus diferentes GameObjects y Componentes.
 
Yo he utilizado/creado este: http://creacionvideojuegos.foroactivo.com/t118-save-load-del-juego-utilizando-clases-serializadas
 
Que consiste en utilizar clases derivadas de un Script Base en cada GameObject para guardar los datos de los componentes. Puedes utilizar prefabs de los GameObjects para facilitar la tarea.

Junio 23, 2017, 09:15:47 PM #8 Ultima modificación: Junio 24, 2017, 01:03:39 AM por pioj
Gracias por las respuestas¡ Al final ya consegui guardar y cargar la rotacion de los objetos
 
Al final lo que hice fue guardar en vez de "objeto.transform.rotation.x"  guarde  "objeto.transform.rotation.euler.x"
 
y luego para cargar el objeto al instanciarlo en la parte de la rotación puse:
 



   
        Quaternion.Euler(objeto.xRot, objeto.yRot, objeto.zRot)
   

[/quote]
 
Al guardarlo en rotation.Euler  luego si que he podido usar el valor cargado con Quaternion.Euler.
 
Un saludo y gracias¡¡

Etiquetas: