Unity Spain
Mesa de ayuda => Unity3D => Scripting => Mensaje iniciado por: Stradmann en Enero 22, 2019, 03:00:48 PM
Hola, estoy haciendo un proyecto de rol para el cual he decidido usar Scriptable Objects. La idea es que me creo un conjunto de SO del tipo "Personaje" y almaceno alli todos los datos de los personajes, u otro conjunto de "Misiones" con la info de cada mision, etc. El problema viene cuando inteto usarlos. Para poder tener disponibles los datos que me guardan los ScriptableObjects y dado que son muchos y no voy a referenciarlos manualmente uso el Resoursces.FindObjectsOfTypeAll y asi creo un array con todos los objetos de un tipo, ya sean misiones, areas, personajes, etc. Lo que pasa es que no funciona siempre, de vez en cuando, o cuando cargo otra escena en el editor, la instrucción deja de encontrar nada. Un truco barato que he encontrado es mover los SO de carpeta y los vuelve a encontrar durante un rato. Quisiera saber porque deja de encontrar los SO y como hacer para que siempre me los encuentre y el juego funcione. Tengo que añadir algo de codigo? Como funcionan estos SO? Gracias.
Tienes tres opciones,
Poner todos los Scriptables-Objects dentro de la carpeta Resources (https://docs.unity3d.com/Manual/LoadingResourcesatRuntime.html) y seguir las instrucciones que describe en el link.
Crear una lista de Scriptable-Objects dentro de un script, por ejemplo DataSO y luego que tienes todo cacheado buscar por nombre, si esa lista no va a cambiar a lo largo de la ejecución del juego entonces podrias optar para que los Scripts hagan un referencia al índice de la lista para no tener referencia de memorias múltiples a un objeto.
Mezclar ambas, para que DataSO cargue y asigne a una lista todos los SO dentro de Resources.
Aunque parezca opciones diferentes la realidad es que los assets dentro de Resources se deben cargar completamente antes de que la escena finalice la etapa de carga, por lo que sería equivalente a tener todos los SO en una lista dentro de un scripts.
Si los SO solo contienen información podías crear archivos con formato Json y utiliza JsonUtility de unity para cargar la información y deserializar sobre un clase, de esta manera tendrías un sistema más flexible al exterior.
Si ninguna de las formas te convence te propongo utilizar Lite DB (http://www.litedb.org) un sistema de base de datos basado en archivo, es NoSQL y se integra con Linq para su funcionamiento.
Gracias!! Voy a estudiar esto que me has dicho y a probarlo..