Noticias

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

[Aporte] JSON GameObject

Iniciado por mcklem, Marzo 12, 2018, 09:09:09 PM

Tema anterior - Siguiente tema
Buenas noches, acabo de llegar después de mucho tiempo como alguno ya habrá visto en la sección de presentaciones y bueno, hace unos días me dio por pensar que es un problema muy grande que unity no incorpore una auto serialización de GameObjects a Json y viceversa por lo que me puse a crear una herramienta que permitiese de la forma mas sencilla generar este tipo de datos.
 
 
 
He creado un proyecto en GitHub donde cualquiera puede descargárselo y/o colaborar, no seáis muy duros ya que tiene pocas horas y esta verde en algunos aspectos, pero cuanto mas pruebas se realizen con diferentes componentes más errores podremos solucionar y más fina será la herramienta.
 
 
 
Espero que podáis disfrutarla y cualquier cosa estaré atento por aqui y por GitHub, nos vemos.
 
 
 
JSONGameObject

¡Muchas gracias por el aporte!

Cita de: BAMF date=1520885608¡Muchas gracias por el aporte!
   


De nada, ¡estoy ansioso por recibir algún feedback!

Muy chachi! Deberías incluir algo más de información sobre qué tipos de datos y variables soporta y cuáles no, en la descripción del github...
 
Y ya de paso, por pedir, incluir alguna guía sencillita de cómo instalar y configurar cualquiera de las libs de JSON con las que sea compatible tu código(por cierto, ¿por qué no es compatible precisamente con el nativo de JsonUtility?).

Cita de: pioj date=1520929155Muy chachi! Deberías incluir algo más de información sobre qué tipos de datos y variables soporta y cuáles no, en la descripción del github...
   
   
      Y ya de paso, por pedir, incluir alguna guía sencillita de cómo instalar y configurar cualquiera de las libs de JSON con las que sea compatible tu código(por cierto, ¿por qué no es compatible precisamente con el nativo de JsonUtility?).
   


No es compatible porque los gameobjects no se puede serializar ni deserializar, o mejor dicho, no se deberian (poderse todo se puede). El json nativo de unity no lo hace para evitar problemas con el engine y con las plataformas destino.
 
Serializar gameobjects y cargarlos tiene muchas implicaciones internas, y es una de las razones por las que unity no lo integra. Un gameobject se compone de muchos componentes, renderers, meshes, materiales, otros scripts asociados, etc, etc y cuando se crea se le asocian unos IDs internos, si "creas" el objeto de nuevo y tratas de modificar sus IDs con los que guardaste pues... se puede liar una bien gorda. 
 
Hace mucho se discutio esto en los foros de unity (años hace, unity 3 si mal no recuerdo).
 
Esta guay hacerlo como testing y para pruebas de concepto, por probar teorias y tal :)

Marzo 13, 2018, 08:42:32 PM #5 Ultima modificación: Marzo 13, 2018, 09:20:53 PM por mcklem
 
 
Cita de: pioj date=1520929155Muy chachi! Deberías incluir algo más de información sobre qué tipos de datos y variables soporta y cuáles no, en la descripción del github...
   
   
      Y ya de paso, por pedir, incluir alguna guía sencillita de cómo instalar y configurar cualquiera de las libs de JSON con las que sea compatible tu código(por cierto, ¿por qué no es compatible precisamente con el nativo de JsonUtility?).
   


Uno de los factores por los que no se puede con la librería nativa de JsonUtility debido a que esta no serializa ciertos tipos de dato, entre ello los Dictionary<k,v>, otro gran problema es que esta serializa las variables publicas y no da opción a elegir entre privadas o getters y setters, respecto a la información, tienes toda la razón del mundo, añadiré mas información acerca de todos los aspectos que mencionas.
 
 
 
En principio estoy orientando la herramienta para que funcione con el 100% de los tipos y variables existentes, ya que será capaz de generar cualquer Tipo contenido en el Assembly incluso en una compilación en tiempo real, donde no haya un StripCode, por esto mismo, debo añadir también la nota de que probablemente no funcione en WebGL.
 
 
 
Cita de: Eskema date=1520940248No es compatible porque los gameobjects no se puede serializar ni deserializar, o mejor dicho, no se deberian (poderse todo se puede). El json nativo de unity no lo hace para evitar problemas con el engine y con las plataformas destino.
   
   
      Serializar gameobjects y cargarlos tiene muchas implicaciones internas, y es una de las razones por las que unity no lo integra. Un gameobject se compone de muchos componentes, renderers, meshes, materiales, otros scripts asociados, etc, etc y cuando se crea se le asocian unos IDs internos, si "creas" el objeto de nuevo y tratas de modificar sus IDs con los que guardaste pues... se puede liar una bien gorda. 
   
   
      Hace mucho se discutio esto en los foros de unity (años hace, unity 3 si mal no recuerdo).
   
   
      Esta guay hacerlo como testing y para pruebas de concepto, por probar teorias y tal :)
   


En este caso no estamos serializando un GameObject directamente, hay un paso intermedio donde se deben inyectar las propiedades del GameObject en un nuevo objeto que seamos capaz de gestionar (De ahi el JSONGameObject), la reconstrucción del JSONGameObject a partir de un string (JSON) nos lo facilita Newtonsoft, después internamente, empleando System.Reflections reconstruimos cada una de las propiedades del GameObject.
 
La herramienta no pretende forzar los IDS internos, es capaz de generar un clón del gameObject a partir de un modelo de datos extraido/generado a partir de otro GameObject, por ello no está forzando nada, el unico "esfuerzo" es la inyección de las propiedades empleando Reflections.
 
Efectivamente en los casos de referencia a materiales o texturas no se puede serializar de una forma sencilla, no obstante se me han ocurrido muchas formas de hacerlo y estoy trabajando en ello, una de las cosas que quiero incluir son ajustes globales para indicar como se desea gestionar estas referencias (Crear nuevas instancias, reciclar instancias existentes o forzar una serialización (En los casos que se puedan) de las mismas).
 
 
 
PD: Además de actualizar la información del readme, actualizaré la información en la descripción.
 
 
 
 

Etiquetas: