CURSO de Unity y C# para principiantes (Diciembre 2024): www.udemy.com/course/unity-y-c-fundamental-desarrollo-de-videojuegos-2d/?couponCode=INDIERAMA2024S Si REALMENTE querés apoyar al canal, asegurate de comprar con el link, sino Udemy se queda con la mayor parte de la venta.
Gracias por crear este canal y tomarte el trabajo de subir contenido de calidad, contenido que aporta muchísimo a la comunidad de desarrolladores hispana. Tu forma de explicar hace que se entienda muy fácilmente el tema de cada video, además subes el proyecto inicial para que podamos aplicar lo aprendido de forma práctica, que eso nos ahorra tiempo y nos permite centrarnos en lo realmente importante. Te mando un abrazo desde Uruguay y sigue así, que este canal en poco tiempo será uno de los canales más grandes que enseñe Unity y C# en español, solo es cuestión de tiempo para que la gente lo descubra.
Gracias Rodrigo! Me alegra mucho que te este gustando el contenido y tu comentario me llena de orgullo!. Espero seguir manteniendo la calidad para que esto siga creciendo! Un abrazo grande!
Este video me es muuuuuuuy util hermano, te juro que si trabajase como desarrollador unity yo te daba dinero por compartir esta informacion tan versatil y poderosa!
@@Indierama Muchas gracias por el video :) el canal es grandioso, hoy estuve intentando guardar elementos (una especie de inventario) en un array según el usuario los consiga, cuando consigue un elemento lo guardo, luego si consigue otro elemento lo guardo pero al guardar este nuevo elemento el anterior se borra, intente con array y también en una lista pero el array y la lista nunca guardan mas de dos elementos, estaré haciéndolo mal o en este caso no aplica ? El parámetro que estoy pidiendo como el del ejemplo del video 'Player player' es un 'int', lo que quiero es que el usuario tenga un inventario de objetos coleccionables según los consiga, ósea uno por uno. Pensaba guardar uno por uno en archivos separados ya que no son muchos 'objetos coleccionables' pero no se si hay una mejor manera.
Excelente video gracias me sirvió mucho; explicado perfectamente. Si pudieras hacer mas ejemplos como si se utilizara un checkpoint o si se quisiera guardar otras variables además de las del jugador con una sola llamada a guardar y una sola a cargar
Muchas gracias , una consulta y si tienes los datos serializados y ahora quieres tomar solo algunos de esos datos desde un servidor mysql? si pudieses hacer un video. Y otro video si puedes enseñar a convertir la misma base serializada que hiciste a mysql en server online gracias. Enseñas muy bien.👍 Ya me suscribi a tu canal💪
Gracias! Exactamente eso. Estamos indicando explícitamente que el tipo de dato que queremos para nuestros datos es PlayerData, por lo que se convierten a ese tipo. Te recomiendo que intentes buscar ejemplos de casteos mas simples (por ejemplo de entero a float, o de Vector3 a Vector2), creo que te va a quedar mas claro.
Que buen canal. Una duda con el tema de la posición. Si tengo varios niveles en diferentes escenas, se guardaría la posición en dicha escena? Muchas gracias!
Muchas gracias! Se guardaría siempre la posición en la escena activa. Por ejemplo, digamos que estás jugando una escena que sería el nivel 3 de tu juego. Entonces, como está implementado en el video, se guardaría la posición de del jugador en dicho nivel. En realidad, no tiene que ver con la escena, sino únicamente con la posición actual de tu jugador.
@@Indierama no guarda, es mas no marca en aqua el Player, paso al nivel 2 y cuando dejo de ejecutar y ejecuto otra vez cargo los datos y me sale la misma posicion
Como debo hacerlo para guardar y cargar desde un boton del textMesh pro , porque al arrastrarle el script SaveManager al onClick del boton en el inspector , no me lee los metodos de esa clase statica , por lo tanto no me deja asignarle los metodos al pulsar dicho boton .
¡Muy buen video! Tengo una consulta, si voy a estar cargando y guardando datos de manera constante mientras se está jugando (guardado automático de puntos al atrapar una moneda) cual sería la forma más optima para tratar esos datos? player prefs? ¡Saludos!
Hola, simplemente deberías detectar una tecla y llamar al método de guardado cuando esto pase. Si no sabes como hacer detección de una tecla te recomiendo que pases por mi guia de principiantes.
Gracias buen video, me sirvio para lo que estaba haciendo. pero me pregunto si se puede usar par acrear varias partidas de guardado, o guardar datos de varios jugadores, por ejemplo crear una lista de high scores de varios jugadores XD
Hola amigo, yo lo queria hacer poniendo unos botones en la pantalla, pero los scrips de vida, y el jugador (la posición) los tengo por separados, entonces los tengo ambos scrips dentro del player, donde tu pones this, yo que debería poner? por que me tira este error: " Argument 1: cannot convert from 'Guardar_Cargar' to 'Vida_Daño' " SaveManager.SavePlayerData(this); Debug.Log("Datos guardados"); En el PlayerData lo hice asi, creo que esta bien [System.Serializable] public class PlayerData { public int vida; public float[] position = new float[3]; public float[] rotation = new float[3];
public PlayerData(CharacterControllerFPS player) { position[0] = player.transform.position.x; position[0] = player.transform.position.y; position[0] = player.transform.position.z; } public PlayerData(Vida_Daño player) { vida = player.vida; } }
Y como se haría para que también se guarden los gameobjects que se hallan activado una vez y que luego se desactive y que durante el juego se mantenga desactivado
Muchas gracias por el video! Me has ayudado un monton! Aunque tengo un pequeño problema, y es que cuando trato de cargar la posicion de mi jugador despues de cambiar la escena, me lo posiciona en el lugar donde estaba el jugador al momento de crear la escena y no con la posición guardada, si alguien pudiera ayudarme plis, ya busque en todos los foros y no encuentro respuesta jaja
Hola. Una pregunta relacionada con la parte de "deserialización". Tengo entendido que debido a la forma en la que está implementada la "deserialización", ésta tiene problemas muy graves de seguridad. Sé que hay otras formas de hacerlo más seguras pero no tengo claro cómo, una de ellas sería encriptando la información pero no sé muy bien si se encripta antes o después de hacer el binario. Otra forma sería usando "XMLSerializer", creo (hay más pero mi conocimiento de C# es un poco limitado en éste sentido), pero no tengo claro cómo usarlo. Si sabes de lo que hablo (ahora viene la petición), ¿puedes hacer un vídeo, plis!!!??? Muchas gracias.
Hola!, no está tan accesible, pero se puede. Para un juego pequeño en Android no estarían mal los PlayerPrefs, pero no te daría mucha facilidad para guardar datos más complejos.
Buenas, no se si puedas contestarme esta duda, pero esto se puede aplicar ante archivos ".BYTES"? Es que he estado tratando de abrir ese tipo de archivos y esto de datos binarios es lo mas cercano que he visto relacionado a los archivos tipo BYTES asi que queria estar seguro, pero entonces si es asi para poder abrir esta informacion necesito tres componentes entonces? Un objeto, el metodo que guarda la informacion en el objeto y aque que saca la informacion del objeto y la carga, no?
la extension .Bytes o la extension que sea . save .info .etc, solo tiene un significado en el contexto del programador que lo haya generado, por lo tanto vas a poder abrir el archivo si conoces la estructura y el tipo de datos que contiene (y también la forma en que el mismo ha sido generado). Podrías tratar descifrar su contenido leyendo y deserializando el archivo, pero no hay garantía de que el archivo se haya generado de la misma forma y de que los datos sean legibles. La solución seria descompilar el programa o juego que genero el archivo y buscar leer el procedimiento usado, entiendo que existen programas para descompilar juegos de Unity con C# y ver su código fuente.
Como estas idolo? A mi no me funciono. Mas que nada la parte de que persista entre sesiones que es lo mas importante. Cuando salgo de play y le doy otra vez, no se guardo, o me guardo solo el ultimo score pero no me lo suma al anterior. Tal vez el problema esta en algun = que va +=... Pero ya intente bastante por hoy. Si me contestas ma;ana intento nuevamente... Gracias desde ya, sos el 1!
hola, use este tutorial para guardar un array de todas las maximas puntuaciones en el juego(que estan en distintas escenas) y funciona bien ya que cada valor del array corresponde a un nivel. pero cuando guardo en una escena, me voy a otra y guardo ahi, se pierde lo de la primera y cuando lo quiero cargar me da este error: IOException: Sharing violation on path C:\Users\Usuario\AppData\LocalLow\DefaultCompany\Angry Birds Rebirth\puntosMaximos.save System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at :0) System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode) (at :0) (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode) saveController.Load () (at Assets/saveController.cs:25) PuntosMaximos.Update () (at Assets/PuntosMaximos.cs:39) solo me deja guardar en una escena a la vez
Hola! disculpa, hice el código, pero no me funcionará hasta que resuelva esto --> Assets\Script\UI\SaveManager.cs(9,39): error CS0246: The type or namespace name 'Player' could not be found (are you missing a using directive or an assembly reference?) ¿A qué se refiere exactamente? :( ayuda pls xD
Hola Gabriel! La forma más rápida, si lo que querés es borrar todos los datos, deberías implementar un método en el SaveManager, donde haciendo uso de File.Delete(dataPath); estarías borrando el archivo y obviamente eliminando los datos. Luego, en el próximo guardado, se estaría creando uno nuevo.
Buenas! El script PlayerData me da el siguiente error: NullReferenceException: Object reference not set to an instance of an object PlayerData..ctor (Player player) (at Assets/Scripts/PlayerData.cs:12) No se porque será... El GameObjetc del player se llama Player y el script que maneja la info del personaje tambien se llama Player. Incluso tiene el tag Player y está en la capa Player. Alguien sabe porque es? El error solo ocurre al intentar guardar.
Lo solucioné creando un intermediario entre Dataplayer y Player no se que era... pero por si a alguien también le pasó, creé un DatosGuardables.cs y en DataPlayer en vez de levantar los datos de Player player, lo hago desde DatosGuardables datosGuardables.. lo mismo para cargar... Suerte!
CURSO de Unity y C# para principiantes (Diciembre 2024):
www.udemy.com/course/unity-y-c-fundamental-desarrollo-de-videojuegos-2d/?couponCode=INDIERAMA2024S
Si REALMENTE querés apoyar al canal, asegurate de comprar con el link, sino Udemy se queda con la mayor parte de la venta.
Gracias por crear este canal y tomarte el trabajo de subir contenido de calidad, contenido que aporta muchísimo a la comunidad de desarrolladores hispana. Tu forma de explicar hace que se entienda muy fácilmente el tema de cada video, además subes el proyecto inicial para que podamos aplicar lo aprendido de forma práctica, que eso nos ahorra tiempo y nos permite centrarnos en lo realmente importante. Te mando un abrazo desde Uruguay y sigue así, que este canal en poco tiempo será uno de los canales más grandes que enseñe Unity y C# en español, solo es cuestión de tiempo para que la gente lo descubra.
Gracias Rodrigo! Me alegra mucho que te este gustando el contenido y tu comentario me llena de orgullo!. Espero seguir manteniendo la calidad para que esto siga creciendo! Un abrazo grande!
Increíble la calidad de la explicación del vídeo. Simplemente perfecto.
Muchísimas gracias Kappy! Me alegro que te haya gustado! 💪💪
Esto es maravilloso!, tremenda calidad de enseñanza, gracias!
Muchísimas gracias Victor! 🙌🙌🙌🙌
Muchas gracias!!! Ojalá pudieras tener más seguidores para hacer más de estos vídeos. Tus explicaciones son las mejores ♥️
Ojalá tuviera más tiempo para poder subir más seguido 😢. Muchas gracias por el apoyo! 💖
Este video me es muuuuuuuy util hermano, te juro que si trabajase como desarrollador unity yo te daba dinero por compartir esta informacion tan versatil y poderosa!
Gracias!!! ✨✨✨
Muchas gracias por tu video!! La explicación fue perfecta y fácil de entender!!
Me alegro que te haya gustado Irvin! 🙌🙌
Gran utilidad y como siempre explicado de forma clara, mil gracias.
Ya lo estoy implementado y me sirvió de maravilla, mil gracias.
En la computadora me estaba funcionando de maravilla, pero al crear la APK no funcionó, incluso se quedó colgado el juego ☹
Muy util este sistema de guardado gracias por tus videos
Muchas gracias! ✨✨
Este canal es oro puro, gracias me sirvió muchísimo :))
Muchísimas gracias Carlos! 💪💪
@@Indierama Muchas gracias por el video :) el canal es grandioso, hoy estuve intentando guardar elementos (una especie de inventario) en un array según el usuario los consiga, cuando consigue un elemento lo guardo, luego si consigue otro elemento lo guardo pero al guardar este nuevo elemento el anterior se borra, intente con array y también en una lista pero el array y la lista nunca guardan mas de dos elementos, estaré haciéndolo mal o en este caso no aplica ? El parámetro que estoy pidiendo como el del ejemplo del video 'Player player' es un 'int', lo que quiero es que el usuario tenga un inventario de objetos coleccionables según los consiga, ósea uno por uno. Pensaba guardar uno por uno en archivos separados ya que no son muchos 'objetos coleccionables' pero no se si hay una mejor manera.
Tus videos son oro puro!!!!
Muchas gracias Alejandro! 🙌🙌
Me re salvaste!!! Justo queria saber como podia hacer esto!!! Genio!
Muchas gracias! Espero que te ayude! Saludos!
Muy bueno el video. Felicitaciones.
Muchísimas gracias Nahuel!
Excelente video gracias me sirvió mucho; explicado perfectamente. Si pudieras hacer mas ejemplos como si se utilizara un checkpoint o si se quisiera guardar otras variables además de las del jugador con una sola llamada a guardar y una sola a cargar
Eres un genio maestro, muchas gracias :D woow además tienes otros tutoriales, ojalá crezcas mucho con tu canal, me suscribo :)
Esto es Oro, mil gracias!
Excelente video. Gracias
Fascinante!!
Muy bueno el video!!!
Gracias Tortu!
muy interesante, podrías reseñar esos assets, si hacen la vida mas facil no me molestaria pagar alguno.
muchas gracias
maquinaaa
🧉😎
Muchas gracias , una consulta y si tienes los datos serializados y ahora quieres tomar solo algunos de esos datos desde un servidor mysql? si pudieses hacer un video. Y otro video si puedes enseñar a convertir la misma base serializada que hiciste a mysql en server online gracias. Enseñas muy bien.👍 Ya me suscribi a tu canal💪
Excelente, Entendi todo excepto lo del 'casteo' del min 13:00. a que se refiere exactamente? es alguna forma de cambiar el tipo de dato?
Gracias! Exactamente eso. Estamos indicando explícitamente que el tipo de dato que queremos para nuestros datos es PlayerData, por lo que se convierten a ese tipo. Te recomiendo que intentes buscar ejemplos de casteos mas simples (por ejemplo de entero a float, o de Vector3 a Vector2), creo que te va a quedar mas claro.
@@Indierama Sip, ya lo he revisado y es tal y como dices.🤑 Gracias por todos estos tutoriales
Excelente explicación. También se puede guardar datos boleanos? O debo traducirlo a 1 y 0?.
No habría problema con booleanos!
Tiene juegos publicados maestro ???
Bellisimo
Que buen canal. Una duda con el tema de la posición. Si tengo varios niveles en diferentes escenas, se guardaría la posición en dicha escena?
Muchas gracias!
Muchas gracias! Se guardaría siempre la posición en la escena activa. Por ejemplo, digamos que estás jugando una escena que sería el nivel 3 de tu juego. Entonces, como está implementado en el video, se guardaría la posición de del jugador en dicho nivel. En realidad, no tiene que ver con la escena, sino únicamente con la posición actual de tu jugador.
@@Indierama no guarda, es mas no marca en aqua el Player, paso al nivel 2 y cuando dejo de ejecutar y ejecuto otra vez cargo los datos y me sale la misma posicion
Como debo hacerlo para guardar y cargar desde un boton del textMesh pro , porque al arrastrarle el script SaveManager al onClick del boton en el inspector , no me lee los metodos de esa clase statica , por lo tanto no me deja asignarle los metodos al pulsar dicho boton .
¡Muy buen video! Tengo una consulta, si voy a estar cargando y guardando datos de manera constante mientras se está jugando (guardado automático de puntos al atrapar una moneda) cual sería la forma más optima para tratar esos datos? player prefs? ¡Saludos!
Si no te importa que el jugador pueda modificar fácilmente la cantidad de puntos creo que si.
Muchas gracias por todo una duda si quisiera guardar automáticamente si apretar la tecla que debería hacer... Muchísimas gracias
Hola, simplemente deberías detectar una tecla y llamar al método de guardado cuando esto pase. Si no sabes como hacer detección de una tecla te recomiendo que pases por mi guia de principiantes.
Muchas gracias por el video, tengo una duda, como podría traer todos los elementos guardados? para mostrar el listado de puntuaciones.
Gracias buen video, me sirvio para lo que estaba haciendo.
pero me pregunto si se puede usar par acrear varias partidas de guardado, o guardar datos de varios jugadores, por ejemplo crear una lista de high scores de varios jugadores XD
Hola gran video, con este método podría guardar una list de enums?
Hola amigo, yo lo queria hacer poniendo unos botones en la pantalla, pero los scrips de vida, y el jugador (la posición) los tengo por separados, entonces los tengo ambos scrips dentro del player, donde tu pones this, yo que debería poner?
por que me tira este error: " Argument 1: cannot convert from 'Guardar_Cargar' to 'Vida_Daño' "
SaveManager.SavePlayerData(this);
Debug.Log("Datos guardados");
En el PlayerData lo hice asi, creo que esta bien
[System.Serializable]
public class PlayerData
{
public int vida;
public float[] position = new float[3];
public float[] rotation = new float[3];
public PlayerData(CharacterControllerFPS player)
{
position[0] = player.transform.position.x;
position[0] = player.transform.position.y;
position[0] = player.transform.position.z;
}
public PlayerData(Vida_Daño player)
{
vida = player.vida;
}
}
tengo el mismo problema
Buenas amigo, gran video. Una pregunta: como puedo eliminar los datos guardados?
Hola, si lo que querés es borrar todos los datos, la forma más fácil es implementar un método en el Manager que haga uso de File.Delete(dataPath)
@@Indierama Perfecto, gracias.
Y como se haría para que también se guarden los gameobjects que se hallan activado una vez y que luego se desactive y que durante el juego se mantenga desactivado
Muchas gracias por el video! Me has ayudado un monton!
Aunque tengo un pequeño problema, y es que cuando trato de cargar la posicion de mi jugador despues de cambiar la escena, me lo posiciona en el lugar donde estaba el jugador al momento de crear la escena y no con la posición guardada, si alguien pudiera ayudarme plis, ya busque en todos los foros y no encuentro respuesta jaja
crack
Gracias Andres! ✨
te amo
ojala me reponda brou. como yo haria con wampserver guardar el proceso de mi app o apk
Hola.
Una pregunta relacionada con la parte de "deserialización".
Tengo entendido que debido a la forma en la que está implementada la "deserialización", ésta tiene problemas muy graves de seguridad.
Sé que hay otras formas de hacerlo más seguras pero no tengo claro cómo, una de ellas sería encriptando la información pero no sé muy bien si se encripta antes o después de hacer el binario.
Otra forma sería usando "XMLSerializer", creo (hay más pero mi conocimiento de C# es un poco limitado en éste sentido), pero no tengo claro cómo usarlo.
Si sabes de lo que hablo (ahora viene la petición), ¿puedes hacer un vídeo, plis!!!???
Muchas gracias.
Una duda, PlayerPrefs puede ser modificado aunque el juego sea de Android? Buen video bro
Hola!, no está tan accesible, pero se puede. Para un juego pequeño en Android no estarían mal los PlayerPrefs, pero no te daría mucha facilidad para guardar datos más complejos.
@@Indierama muchas gracias por la respuesta, ahora toca cambiar algunos sistemas de guardado de mi juego para que sean más seguros, eres un grande bro
bro como se emplea en un menú de guardado
Buenas, no se si puedas contestarme esta duda, pero esto se puede aplicar ante archivos ".BYTES"? Es que he estado tratando de abrir ese tipo de archivos y esto de datos binarios es lo mas cercano que he visto relacionado a los archivos tipo BYTES asi que queria estar seguro, pero entonces si es asi para poder abrir esta informacion necesito tres componentes entonces?
Un objeto, el metodo que guarda la informacion en el objeto y aque que saca la informacion del objeto y la carga, no?
la extension .Bytes o la extension que sea . save .info .etc, solo tiene un significado en el contexto del programador que lo haya generado, por lo tanto vas a poder abrir el archivo si conoces la estructura y el tipo de datos que contiene (y también la forma en que el mismo ha sido generado). Podrías tratar descifrar su contenido leyendo y deserializando el archivo, pero no hay garantía de que el archivo se haya generado de la misma forma y de que los datos sean legibles. La solución seria descompilar el programa o juego que genero el archivo y buscar leer el procedimiento usado, entiendo que existen programas para descompilar juegos de Unity con C# y ver su código fuente.
Como se haría para guardar los itens de la ecena para que los que ya recogi no aparezcan otra vez
Para editar los datos guardados, como seria?
Como hago bonotes de guardado
me marca un error cuando ago el constructor player data
Como estas idolo? A mi no me funciono. Mas que nada la parte de que persista entre sesiones que es lo mas importante. Cuando salgo de play y le doy otra vez, no se guardo, o me guardo solo el ultimo score pero no me lo suma al anterior. Tal vez el problema esta en algun = que va +=... Pero ya intente bastante por hoy. Si me contestas ma;ana intento nuevamente... Gracias desde ya, sos el 1!
hola, use este tutorial para guardar un array de todas las maximas puntuaciones en el juego(que estan en distintas escenas) y funciona bien ya que cada valor del array corresponde a un nivel. pero cuando guardo en una escena, me voy a otra y guardo ahi, se pierde lo de la primera y cuando lo quiero cargar me da este error: IOException: Sharing violation on path C:\Users\Usuario\AppData\LocalLow\DefaultCompany\Angry Birds Rebirth\puntosMaximos.save
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at :0)
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode) (at :0)
(wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode)
saveController.Load () (at Assets/saveController.cs:25)
PuntosMaximos.Update () (at Assets/PuntosMaximos.cs:39)
solo me deja guardar en una escena a la vez
Hola! disculpa, hice el código, pero no me funcionará hasta que resuelva esto --> Assets\Script\UI\SaveManager.cs(9,39): error CS0246: The type or namespace name 'Player' could not be found (are you missing a using directive or an assembly reference?)
¿A qué se refiere exactamente? :( ayuda pls xD
Me pasa igual :(
cómo puedo eliminar los datos ¿?
Hola Gabriel! La forma más rápida, si lo que querés es borrar todos los datos, deberías implementar un método en el SaveManager, donde haciendo uso de File.Delete(dataPath); estarías borrando el archivo y obviamente eliminando los datos. Luego, en el próximo guardado, se estaría creando uno nuevo.
@@Indierama gracias! me sirvió muchísimo. Ahora tengo otra duda y me preguntaba cómo puedo hacer un if que se pregunte si hay datos guardados
@@gabitzzo 12:09
Hola, como puedo actualizar los datos salvados sin tener que usar filemode.create? porque eso crea un archivo nuevo y reemplaza al anterior.
Pudo resolverlo?
Buenas!
El script PlayerData me da el siguiente error:
NullReferenceException: Object reference not set to an instance of an object
PlayerData..ctor (Player player) (at Assets/Scripts/PlayerData.cs:12)
No se porque será... El GameObjetc del player se llama Player y el script que maneja la info del personaje tambien se llama Player. Incluso tiene el tag Player y está en la capa Player.
Alguien sabe porque es?
El error solo ocurre al intentar guardar.
Lo solucioné creando un intermediario entre Dataplayer y Player
no se que era... pero por si a alguien también le pasó, creé un DatosGuardables.cs
y en DataPlayer en vez de levantar los datos de Player player, lo hago desde DatosGuardables datosGuardables..
lo mismo para cargar...
Suerte!
no me funciona en mi juego para Android
Y para borrar?
Lo has logrado hacer? Si es así como lo hiciste?
@@javier0047 Uso otra manera mas sencilla de guardar datos por json. No me acuerdo porque puse el comentario hace 3 meses. Sorry.
Explicacion mas facil no puede haber
Me sirvió, muchas gracias!