Noticias

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

Como guardar Datos en un scriptableObject

Iniciado por ftejada, Septiembre 06, 2017, 12:58:20 PM

Tema anterior - Siguiente tema
Hola a todos!!!
 
Me preguntaba como puedo almacenar gameObjects (con los componentes que lleve) en una List<> dentro de un scriptableObject y poder guardar esos datos para poder utilizarlos en otros proyectos.
 
Imagino qué podría crear un prefab de un gameObject que contuviese todos los gameobjects que quiero almacenar como hijos. Pero no se si es la mejor manera para lo que quiero hacer. Por eso pensé en ScriptableObject y hacer algo como los profiles que tienen con el asset PostProccesing stack de Unity.
 
 
 
Explico un poco lo que quiero...
 
Estoy haciendo un sistema para que el character reconozca objetos y sepa como cogerlos, empujarlos, (posiciones a donde irian las manos, forma del objeto, peso, tamaño, nombre, etc)... y en función de esos datos pues mediante IK posicionar las manos y demas, donde convenga.
 
He pensado en hacer un sistema de "envoltorios/shapes" para asignarlos a cada objeto que vaya a ser interactuable. Estos "Shapes" contendrán toda la informacion necesaria para que el sistema haga el analisis correspondiente. Estos shapes no son mas que una coleccion de datos como la que he escrito arriba (posiciones a donde irian las manos, forma del objeto, peso, tamaño, nombre, etc). En definitiva un GameObject con sus componentes Transform y demas + los GameObjects hijos que contenga.
 
 
 
El sistema mas o menos ya lo tengo perfilado pero me encuentro con el escollo de que no se como almacenar / guardar todos los shapes que voy creando, para poderlos mover entre proyectos con el sistema de interactuación, e irlos ampliando a medida que vaya creando más shapes para distintos figuras geometricas interactuables y asi poder actualizar ese conjunto de Shapes antiguos + los nuevos en nuestro nuevo proyecto solo con importar un package que contenga ese conjunto de datos...
 
Habia pensado en almacenar de alguna manera todos los datos en una List<GameObject> dentro de un scriptableObject, mediante una ventana propia(programada me refiero) o arrastrando el Shape directamente al scriptableObject. Pero evidentemente creo que no es tan simple.
 
 
 
Alguan idea, sugerencia o consejo de como encarar esto de la mejor manera posible???
 
 
 
Saludos y gracias por adelantado.

Hola, una pregunta hiciste alguno y probaste arrastrarle gameObjects? te fijaste si los guardaba? yo he hecho varios y simplemente los creas y referencias cosas y los guarda lo mas bien, es la idea del SCO. Si queres guardar ese tipo de datos me parece que es la manera correcta y mas comoda de hacerlo con un SCO.
 
 
 
un ej bien basico:
 

[CreateAssetMenu(menuName = "SCO/Shape")]
public class Shape : ScriptableObject {
//por meter algo
public List<GameObject> m_prefabs = new List<GameObject>();
}

 
de aca seguramente tengas o no que indicar campos o clases serializables luego para que cuando pase el proceso de serializacion/deserializacion no se te vayan los datos, o por lo menos yo los tengo asi porque tengo un custom inspector para cada SCO que tengo (para hacerlo mas vistoso pero no es necesario), si lo haces un public del default insepector creo que no tenes este inconveniente, son campos serializables por defecto.
 
 
 
Las shapes esas que nombras pueden ser SCO, y guardar esas shapes en un gran contenedor de shapess que sea un SCO, creo que es lo que queres no?
 

[CreateAssetMenu(menuName = "SCO/granContenedor")]
public class TuGranContenedorDeShapes : ScriptableObject {
public Shape shape1;
public Shape shape2;
public Shape shape3;
}

 
Tenes variantes y formas de hacerlo mas prolijo pero solo para probar creo que deberia andar, podrias crear directamente el contenedor con una clase definina dentro de shapes con sus datos y todo y no hacer dos SCO.
 
Saludos

Hola @lightbug Gracias por contestar.
 
Guardarlos los guarda pero solo en ese mismo proyecto.Pero no mantiene esos datos cuando exporto el profile (SCO) en un package y lo cargo en otro proyecto... Ese es el problema, que necesito encontrar la manera de poder guardar esos datos, pero que se mantengan cuando los exporte en un package.
 
Supongo que tendré que crear un prefab con todos los shapes (hijos incluidos con sus componentes) y crear el package con ese prefab también incluido aparte del (SCO). Aunque asi no le veo mucho sentido al tener el (SCO).
 
No se... lo mismo si tiene sentido pero no lo veo claro...
 
Lo que me gustaria es poder encapsular todos los datos de el GameObject que hace de Shape (ShapePadre) y sus componentes + los hijos que tiene este shape con sus componentes ((que a su vez tambien tienen hijos y estos hijos tienen también otros hijos anidados)
 
¿Algun consejo de cual sería la mejor y más simple manera de hacer esto? teniendo en cuenta de que va a ser algo ampliable constantemente y hay que importarlo a diferentes proyectos que pueden o no, tener ya una lista previa de Shapes + el sistema de interactuación
 
 
 
Saludos

Cita de: ftejada date=1504753964¿Algun consejo de cual sería la mejor y más simple manera de hacer esto? teniendo en cuenta de que va a ser algo ampliable constantemente y hay que importarlo a diferentes proyectos que pueden o no, tener ya una lista previa de Shapes + el sistema de interactuación
   


no entiendo cuando decis los shapes padres con sus hijos, por eso te pregunto, que tipos de datos tenes dentro de tus Sco's, estaria bueno que subas un profile o lo que deseas que tenga uno para visualizarlo mejor, supongo que seran posiciones y cosas asi. Yo he copiado y pegado muchos proyectos con sus sco's y todo bien, por eso me queda la duda de porque no te funciona.
 
De ultima podrias guardar un Json con los datos, pero mejor subi uno de ejemplo.

Te subo un video, que creo que lo verás más claro.
 
Por otro lado...  no estoy seguro de que la manera en que lo estoy enfocando sea la más idonea.
 
https://youtu.be/F-KnUHsklxo
 
Saludos

Cita de: ftejada date=1504773858Te subo un video, que creo que lo verás más claro.
   
   
      Por otro lado...  no estoy seguro de que la manera en que lo estoy enfocando sea la más idonea.
   
   
      https://youtu.be/F-KnUHsklxo
   
   
      Saludos
   


Ah claro, solo para simplificar, quita lo de la ventana por ahora, manda derecho el shape al sco. Otra cosa, fijate que te dice "Type Mismatch", y eso por que? estas pasando un gameObject no? fijate que ese shape (gameobject) existe en la escena, en otra escena no creo que lo tengas. Creo que viene por aca la cosa. Un gameObject podes clasificarlo en dos, de la escena y parte de los assets (prefab) en definitiva si guardas un gameObject con todo de la escena version Sco estas queriendo guardar un prefab derecho, por eso segun lo que vi lo que queres guardar esta muchisimo mas orientado al prefab que al Sco, acordate que el sco se usa como una base de datos, sobre todo es comodo a la hora de cargar recursos como clips de audio, prefabs, texturas, etc, pero en tu caso vos queres guardar objetos de la escena, con sus hijos y nietos, y sus componentes.
 
Me parece que tenes que pasar los datos de estos, pos y rot (o transform) de todos los hijos y guardar esto, si es que queres tener un sco, pero la idea de tener uno es la de tocar el mismo Sco, por eso me parece que te tenes que preguntar, vos vas a tocar uno de estos por si solos? o solo queres que actuen de archivo guardado?. Si fuera el caso que aun queres Sco deberias tener "la forma" de todos los shapes (supongo que son iguales, para dedos, manos, etc). La idea es no usar objetos con sus transforms sino pasar todo eso a una estructura/clase de datos para guardarla, sea por Sco o por otro formato (json o xml por ejemplo).
 
 
 
Lo que podrias hacer para guardarlo en un  sco es (o por lo menos imagino que el proceso es asi):
 


  •    en la escena seteas todo como queres, posicion de dedos, falanges, manos, y lo que tengas, no importa


  •    creas un sco (un shape profile)


  •    con tu ventana de guardado (tiene que traducir el objeto en la estructura esta que dije) seleccionas el objeto de la escena (el shape) y le das guardar.


  •    En el Sco deberia estar los valores de todos los objetos organizados jerarquicamente, el problema es que al cargarlos tenes que hacer el proceso inverso que al guardarlo, por que los datos por si solos no se traducen al GameObject. Si fuera un prefab haces exactamente eso con solo arrastrar el GO a la carpeta de assets y viceversa para cargarlo,  el mismo Unity te guarda el gameObject intacto por eso me parece que si queres guardar exactamente todo te diria que vayas por el prefab.


 
 
Pensa mas al Sco como algo que podes jugar libremente (sin necesidad de recorrer inspectores) y que vas a usar no solo para un objeto sino para varios (tipo base de datos).
 
 
 
 

Bueno. He probado a crear una variable publica de Tipo GameObject en el (SCO) para arrastrar el shape desde el inspector. Pero no me lo acepta. No se porqué.
 
Pero si creo un prefab del GameObject padre que contiene todos los gameobject(shapes) hijos con sus conponentes, y estos a su vez los nietos y demas, SI me deja arrastrarlo directamente a la variable publica que sale en el inspector del (SCO).
 
Lo que no se es si se conservarán todos los datos de los hijos y nietos al exportar el profile como package a otra escena. Supongo que tendría que meter  también dentro del package el prefab de los Shapes. Aunque como tu dices y comenté yo... no le veo mucho sentido tener un (SCO).
 
Lo que me sale en el video de "Type Mismatch" no se por qué es. Y lo que le paso es un gameObject que meto en una List<GameObject>. Y ese Shape (gameobject) si existe en la escena.
 
 
 
Voy a pensar en estos dias si puedo darle a esto un mejor diseño tirando por lo de los prefabs o por guardar los datos de Transform de cada shape y de sus hijos y nietos y recomponerlos en gameobjects "jerarquizados" con sus hijos y nietos y que mediante una clase se encargue de agregarle los componentes que falten por codigo.
 
 
 
Si tengo alguna duda volveré retomaré este hilo.
 
 
 
Muchas gracias por la ayuda. Saludos

Cita de: ftejada date=1504946940Pero si creo un prefab del GameObject padre que contiene todos los gameobject(shapes) hijos con sus conponentes, y estos a su vez los nietos y demas, SI me deja arrastrarlo directamente a la variable publica que sale en el inspector del (SCO).
   


Tal cual me parece que va por ese lado, escena vs asset.
 
Cita de: ftejada date=1504946940Lo que no se es si se conservarán todos los datos de los hijos y nietos al exportar el profile como package a otra escena. Supongo que tendría que meter  también dentro del package el prefab de los Shapes. Aunque como tu dices y comenté yo... no le veo mucho sentido tener un (SCO).
   


No te sirve de nada, es mas facil tener una carpeta/s con tus prefabs.
 
Cita de: ftejada date=1504946940Lo que me sale en el video de "Type Mismatch" no se por qué es. Y lo que le paso es un gameObject que meto en una List<GameObject>. Y ese Shape (gameobject) si existe en la escena.
   


Sera algo que pasa del paso del gameObject de la ventana al sco, ya medio me perdi jaja...pero bueno si dice eso es algo a tener en cuenta
 
Cita de: ftejada date=1504946940Voy a pensar en estos dias si puedo darle a esto un mejor diseño tirando por lo de los prefabs o por guardar los datos de Transform de cada shape y de sus hijos y nietos y recomponerlos en gameobjects "jerarquizados" con sus hijos y nietos y que mediante una clase se encargue de agregarle los componentes que falten por codigo.
   


Si creo que la cosa va mas por el tipo de datos a guardar y en que "forma" lo queres (prefab o sco), me parece que por lo que queres o yo por lo menos iria por el prefab toda la vida, los sco que tengo tienen referencias a assets, utiles a la hora de crear instancias (balas, proyectiles, sonidos, valores,etc) entonces es logico tocarlos, modificar cosas, hacerlos mas interactuables. En tu caso seria lo contrario, nunca lo modificarias desde el mismo sco sino desde la escena (ya que supongo esas shapes dependen de otros objetos y demas, supongo)
 
Saludos

lo eh entendido mal, o tienes un script para cada parte de los dedos?
 
 cuando vas a utilizar las manos. vas a usar cada parte de los dedos. vamos 14 objetos no?
 
seguro que no sería mejor usar una clase por cada mano? en vez de cada parte de un dedo? 
 
a parte, sería mucho mas cómodo de exportar a otro proyecto y según mi punto de vista mas eficiente. (no se exactamente como los vas a utilizar eh).
 
 

Etiquetas: