Jump to content
enelmenu

Help Resets bien echos + Info de "XML vs JSON" (yapa)

Recommended Posts

Hola queridos, bueno basicamente estoy por terminar mi juego luna de pluton disponible... no digo mi juego Kuboi disponible en unas semanas, se viene con todo!
Ah re que a nadie le importaba, pero tiro el chivo pronto se van a enterar cuando salga ;)

En fin.. me encuentro con un problema de novato tras dias y noches y diasynoches sin dormir me lei bastante sobre la serializacion de objectos,  basicamente el tema de acceder a estructuras de datos, obtenerlas y/o editarlas, me lei bastante sobre XML y JSON cada uno tiene sus pro y sus contra, la diferencia que encontre por definicion teorica es que XML se mueve mejor en grandes bases de data, donde manipula grandes cantidades de informacion, donde podemos crear encabezados, hijos, subhijos y demas... un manera muy comoda para el ojo humano, y el tema cognitivo pero bastante complicado en el tema codigo y raiz de todo... de lo contrario JSON ya trae "estructuras" armadas pura exclusivamente orientada a objectos donde acceder es mas rapido hablando de rendimiento y dedicacion de codigo, pero al ser algo ya "estructurado" tiene algo limitado siertas cuestiones.

Que es JSON? JSON es simplemente una manera de pasar objetos y estructuras de datos desde Javascript a cualquier lenguaje del servidor (originalmente), XML no transmite directamente objetos ni estructuras de datos (int, bool .. ect), es decir, los datos con JSON estan listos para ser usados cuando se reciben, esta, a queridos amigos, es la clave de JSON. Cuando trabajamos con Javascript usar JSON es lo ideal

Algo muy curioso que lei tambien es que cuando XML maneja pocas variables tiene una velocidad de respuesta mas retardada, encambio cuando maneja una buena cantidad de infromacion es mas lijera su respuesta. Hablando de peso neto en bytes son muy equivalentes.

 

Llendo al topic del tema dejando de lado esta informacion, yo pense en usar este tipo de metodo para usarlo en los resets de algunos objetos, guardar datos de variables y igualarlas cuando se resetee, pero me puse a analizar bien esto y me encuentro bastante limitado, y bastante enrroscado con este metodo para usar en mis mecanicas que necesitan ser reniciadas...

Primero que yo si guardo ciertas variables ya de primeras necesito crear Arrays double que simulen un Vector3 x,y,z, lo cual ya ahi empieza el spagetti
Segundo que necesito guardar datos de una curve para una interpolacion lo cual ya se me hace basatante complicado
Tercero que tengo que crear una especie de imitacion del script de la mecanica que resetee que esa nunca se destruye y carga los valores al objeto reseteado... bastante trambolico

Entonces me puse a pensar y pensar y no se como resetear de manera correcta, sin usar mucho codigo para el reseteo, algo simple.
Tambien pense en crear prefabs a los reseteos, pero voy a hacer 50 niveles con muchos reseteos... no tiene sentido crear mas de minimo 8 prefab por nivel es una locura demaciado para tan poco, yo se que hay alguna forma mas sencilla pero no seme viene a la cabeza.

Pregunta resumida: Como puedo resetear un GameObject correctamente? No solo resetear transform, sino que el script que tenga sea reseteado tambien.
Acepto cualquier idea o alguna clave que me tiren ahi asi me avivo, tiene q ser algo simple que no se me viene nose porque.

Hasta ahora lo que tengo es que tengo mi prefab de mi mecanica, con su script de su mecanica, cuando lo instancio ese script de la mecanica (ejemplo mecanica: MovingPlatform Tiene script MovingPlatform con muchas variables una curve y unas cosas mas instanciado es el que tengo que guardar sus variables iniciales, donde las puedo guardar? como puedo acceder de una manera comoda?

 

Saludos!:134_spy:

Edited by pioj
uso correcto de los tags... O te pego bronca! XD

Share this post


Link to post
Share on other sites
7 hours ago, enelmenu said:

Pregunta resumida: Como puedo resetear un GameObject correctamente? No solo resetear transform, sino que el script que tenga sea reseteado tambien.

Y si en la misma clase del script o en otro script o donde sea guardas los datos del transform y de otros componentes? y cuando tengas que resetear simplemente asignas lo que tengas que asignar (pos,rot,escala), resetear componentes, sin necesidad ni de xml ni de json. Podrias usarlo tambien tendrias que definir una clase base (la data del json) que tenga los datos a guardar y cada vez que das el reset recorrer todos los reseteables y cargar los datos, pasa que cada vez que reseteas terminas leyendo del json, pero si la pensas mas podrias leer los datos al comienzo y guardarlos en cada obj reseteable, que es exactamente lo mismo que la primer propuesta.

Para el script acordate que podes usar Reset, te fijaste esto? https://docs.unity3d.com/ScriptReference/MonoBehaviour.Reset.html

No le he usado pero segun la descripcion deberia hacer el truco.

 

Share this post


Link to post
Share on other sites
hace 3 minutos, lightbug said:

Para el script acordate que podes usar Reset, te fijaste esto?

Nono eso es lo mismo que apretar Reset en el inspector, eso dice la descripcion, devuelve lo mismo que el reset del inspector osea todo por default no me sirve.

hace 4 minutos, lightbug said:

Podrias usarlo tambien tendrias que definir una clase base (la data del json) que tenga los datos a guardar y cada vez que das el reset recorrer todos los reseteables y cargar los datos

Eso vengo pensando desde las 8 de la mañana cuando me tome mi tercer cafe y mirando a la ventana dije listo ya esta... cuando me puse a codificar me encuentro con el lerp de una curve.... como guardo una curve en un JSON?..... gran incognita....

Share this post


Link to post
Share on other sites
7 hours ago, enelmenu said:

Eso vengo pensando desde las 8 de la mañana cuando me tome mi tercer cafe y mirando a la ventana dije listo ya esta... cuando me puse a codificar me encuentro con el lerp de una curve.... como guardo una curve en un JSON?..... gran incognita....

La idea de guardar es hacer si es totalmente necesario, mientas menos datos pongas en juego mejor, decime la curva esa cuantas veces las modificas por segundo? dejame adivinar ... ninguna, entonces para que guardarla?

7 hours ago, enelmenu said:

Nono eso es lo mismo que apretar Reset en el inspector, eso dice la descripcion, devuelve lo mismo que el reset del inspector osea todo por default no me sirve.

Pero no es eso lo que queres? reseter el componente/script como estaba al principio de la escena? o por lo menos es la definicion de hacer un "Reset"

Share this post


Link to post
Share on other sites
hace 1 minuto, lightbug said:

decime la curva esa cuantas veces las modificas por segundo? dejame adivinar ... ninguna, entonces para que guardarla?

Es que cada GameObject tiene diferentes valores de Curve en su mecanica usando el mismo script obvio, osea es como una interpolacion de pi a pa(int inicial, int final) eso seria facil de guardar, pero tendria un lerp feo y lineal, por eso necesito q sea un lerp que tome la curve modificada, nose como guardar una  curve, sus datos...

hace 3 minutos, lightbug said:

Pero no es eso lo que queres? reseter el componente/script como estaba al principio de la escena? o por lo menos es la definicion de hacer un "Reset"

Al principio de la escena??? Pero si apretar reset en un componente reseta a valores default del script, no de como inicie en el start de la compilacion.... o eso creo(?

Share this post


Link to post
Share on other sites
7 hours ago, enelmenu said:

Al principio de la escena??? Pero si apretar reset en un componente reseta a valores default del script, no de como inicie en el start de la compilacion.... o eso creo(?

Vamos a empezar por lo basico, da un ejemplo de la escena modificada y cuando das reset que deberia pasar, no se si queres hacer un reset u otra cosa.

7 hours ago, enelmenu said:

Es que cada GameObject tiene diferentes valores de Curve en su mecanica usando el mismo script obvio, osea es como una interpolacion de pi a pa(int inicial, int final) eso seria facil de guardar, pero tendria un lerp feo y lineal, por eso necesito q sea un lerp que tome la curve modificada, nose como guardar una  curve, sus datos...

No importa, vos no vas a guardar la curva, la curva le dice que movimiento hacer, y una vez cargada la escena el objeto que la tiene siempre la tendrá, el reset lo unico que deberia hacer es resetear el transform y otros componentes, estoy hablando basandome en lo que vi de tu juego y en como usas la curva esta (para movimiento supongo). Sospecho que vos queres instanciar todo y generar las curvas estas, lo cual no creo que sea lo correcto ni mas efectivo, para eso existe el concepto de escena, para tener todo guardado (serializado) y no cargar las cosas asi.

Pensalo como que cada objeto es responsable de su propio reset, contiene su propia informacion (incluso su propia version del reset como te mencione en un topic parecido a este), un comando externo o evento le dira que haga el reset, él mismo (el objeto a resetar) pondra su transform, datos, componentes, etc. Es decir que la curva ya existe y es propia de cada objeto y esta siempre ahi, incluso al resetear porque nunca la modificas, no hay necesidad de cargarla ni guardarla.

Share this post


Link to post
Share on other sites
hace 6 horas, lightbug said:

da un ejemplo de la escena modificada y cuando das reset que deberia pasar

hace 6 horas, lightbug said:

y una vez cargada la escena el objeto que la tiene siempre la tendrá, el reset lo unico que deberia hacer es resetear el transform y otros componentes,

Claro ahi entendi lo que vos decis, yo ahora mismo con el reset me estoy refiriendo a "reinstanciar" el objeto, destruyendolo y volviendolo a instanciar, un poco costoso pero era lo mas "limpio" y bien reseteado que se me habia ocurrido, ahora me abriste otra puerta, el resetear sin reinstanciar el objeto...

Vamos con ejemplos practicos:
Yo lo que estoy haciendo ahora mismo es cargar mi nivel desde mi LevelHandler donde controlo varias cuestiones, LevelHandler carga mi scena Level_3 porejemplo, dentro de mi scena nivel(Level_) en este caso Level_3 tengo un Gameobject Level que contiene el script del nivel DataLevel, donde en el Awake crea una lista con los prefabs que voy a reiniciar (path: "Assets/Resources/LevelReset/prefabs[]" con prefabs[] me refiero a que ahi mismo estan los prefab base que guarde que vienen todo en default, todo listo para obtener datos)(plataformas que cambiaron su posicion, plataformas q se calleron, puntos que fueron agarrados) lo que se debe reiniciar yo lo tengo salidito de fabrica para darles todas sus chucherias, pero claro al yo tener el prefab "base" cuando instancio la carpeta LevelResets, lo que hago es eleiminar todo mis resets que fueron modificados y instanciar los prefab base, y AHI darle el valor que yo guardo en el inicio de la scena antes de eliminar y reinstanciar los objectos que van a ser reseteados.... bastante confuso creo que me enrrosque demaciado... me parece que tengo que recapitular varias cuestiones.

Lo que vos decis segun lo que yo te entendi, es intentar hacer un reset de variables tanto transform, y componentes y en ningun momento destruir el objeto a resetear, hmmm me parece bastante logico la verdad, y lo unico que tendria que guardar seria la posicion la rotacion e igualara a 0 algunos lerps y demas... bueno ahora me pongo bien aver que pasa, creo que me solucionaste la vida jajaja ahora veo

Share this post


Link to post
Share on other sites
7 hours ago, enelmenu said:

Lo que vos decis segun lo que yo te entendi, es intentar hacer un reset de variables tanto transform, y componentes y en ningun momento destruir el objeto a resetear, hmmm me parece bastante logico la verdad, y lo unico que tendria que guardar seria la posicion la rotacion e igualara a 0 algunos lerps y demas... bueno ahora me pongo bien aver que pasa, creo que me solucionaste la vida jajaja ahora veo

Pensalo asi, jugaste alguna vez al crash bandicoot? cuando perdes (el personaje se cae por ejemplo), hace un sonido gracioso y/o la animacion de muerte, la camara se apaga (un fade out negro) y apareces en el checkpoint y la camara se prende (fade In), lo que ocurre es que el personaje se traslada o podria reinstanciarse en el lugar correspondiente (es lo mismo al efecto final, no en performance es preferible simplemente trasladarlo). El resto del nivel sigue estando exactamente igual, las plataformas, enemigos, cajas destruidas, todo sigue igual. Entonces si me tocaria hacer eso lo que haria seria resetear dos cosas, estado del player (ponerlo en vivo e idle) y modificar su posicion a la ultima posicion checkpoint. Y listo no me interesa nada mas. Vos queres eliminar los modificados y reinstanciarlos luego desde un prefab?

Cuando te pregunte de un caso de tu reset no queria que me digas que hiciste (ni idea que es tu carpeta "levelResets") sino un ejemplo del producto final, por ejemplo : la caja se cae, reaparecen los "puntos" ya agarrados en el nivel (osea los perdes) en sus lugares manteniendo su giro instacto, las plataformas se resetean, quizas las activadas se desactivan (q se yo), la camara nunca se apaga y hace un lerp a la posicion inicial, bla bla bla. Algo asi, de esa forma se puede entender mas tu situacion y determinar la mejor opcion.

 

Share this post


Link to post
Share on other sites
hace 2 minutos, lightbug said:

Vos queres eliminar los modificados y reinstanciarlos luego desde un prefab?

eliminar los modificados, instanciar el prefab base con todo default, y darle los valores que le corresponde en dicho nivel, por ejemplo, dame la mecanica que mueva una plataforma y como estoy en el nivel 7 dale los valores que tiene en el nivel 7, aparece aca con estos datos...

Complicado..

hace 4 minutos, lightbug said:

sino un ejemplo del producto final,

Claro sorry, si bien entinedo tu ejemplo del crash, yo en mi caso no necesito solamente reiniciar el player en determinado checkpoint, en mi juego si vos te caes te moris, si te moris empieza todo de nuevo.
Ejemplo:
vos venis manejando el player, agarras un punto (un punto que ya no se ve esto neceseta ser reiniciado su render y el score a 0 cuando te moris), moves una plataforma de lugar con una placa (una plataforma cambio de lugar, variables lerp cambiaron algunas necesitan ser igualadas a 0 para volverse a iniciar cuando te moris, un plate fue apretado y su transform se bajo como si se presionara, necesita ser reiniciado cuando te moris) te caes pisando una plataforma que se cae cuando la pisas (una plataforma drop cambio de lugar, su transform necesita ser reiniciado cuando te moris)

Ese es mi concepto basicamente, espero que se entienda

Share this post


Link to post
Share on other sites
9 hours ago, enelmenu said:

Ejemplo:
vos venis manejando el player, agarras un punto (un punto que ya no se ve esto neceseta ser reiniciado su render y el score a 0 cuando te moris), moves una plataforma de lugar con una placa (una plataforma cambio de lugar, variables lerp cambiaron algunas necesitan ser igualadas a 0 para volverse a iniciar cuando te moris, un plate fue apretado y su transform se bajo como si se presionara, necesita ser reiniciado cuando te moris) te caes pisando una plataforma que se cae cuando la pisas (una plataforma drop cambio de lugar, su transform necesita ser reiniciado cuando te moris)

Ese es mi concepto basicamente, espero que se entienda

Entonces como yo te lo planteaba deberia funcionar, que cada uno se encargue de su reset, exactamente igual que en el topic anterior, (tambien del reset) O por lo menos es lo que yo haría.

Esto es un problema de diseño, cuando perdes en tu juego, que perdes? perdes tus puntos-> anda pensando en resetear los puntos del escenario y las estadisticas del jugador, perdes el progreso que hiciste --> pensa en resetear placa, plataforma, etc, perdes X --> anda pensando en resetear lo relacionado a X. De aca sacas que cosas se resetean ante la muerte del player, no importa que paso mientras tanto ni si era de nivel 7, si el Player murio, a todo lo reseteable dale reset y fin de la historia.

 

9 hours ago, enelmenu said:

eliminar los modificados, instanciar el prefab base con todo default, y darle los valores que le corresponde en dicho nivel, por ejemplo, dame la mecanica que mueva una plataforma y como estoy en el nivel 7 dale los valores que tiene en el nivel 7, aparece aca con estos datos...

Y para que eliminarlos? porque no solo darle el reset derecho y listo?

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...