Cómo pasar DATOS ENTRE ESCENAS en Unity usando PlayerPrefs

Поделиться
HTML-код
  • Опубликовано: 16 сен 2024

Комментарии • 41

  • @GameDevTraum
    @GameDevTraum  3 года назад

    Tengo otro canal, por favor suscríbete aquí! 😄👉 www.youtube.com/@GameDevTraumDE
    *Aprende más de UNITY aquí* 👉 ruclips.net/video/BbxbNmZ45xw/видео.html

  • @EdoUchida
    @EdoUchida 3 года назад +4

    Saludos viejo, la verdad es que fue un excelente tutorial, sin embargo estoy un poco enredado debido a que mi proyecto consiste en lo siguiente:
    *Existen tres escenas.
    *Escena 1: Contiene un unico boton para ir a una mision.
    Escena 2: Contiene la mision 1.
    Escena 3: Contiene la mision 2.
    El flujo del juego consiste en lo siguiente.
    Iniciamos en escena 1, le damos clic al boton para iniciar una mision. --> Se inicia la Escena 2 mision 1 la cual consite en contestar 10 preguntas --> Se termina la Escena 2 mision 1 --> Regresamos a la Escena 1 ahora el boton para iniciar una mision debe de actualizarse para ir a Escena 3 mision 2.
    Me gustaria si me pudieras ayudar un poco con la logica de programación. De antemano gracias por leer mi mensaje.

    • @GameDevTraum
      @GameDevTraum  3 года назад +1

      En general hay muchas formas de resolver los problemas, voy a escribir lo que se me ocurrió, es un poco difícil de explicar pero aquí va:
      En PlayerPrefs habría que guardar una variable que indique el máximo nivel disponible, por defecto debería valer 1.
      Suponiendo que tienes 10 niveles en total, te haces los 10 botones para ir a esos niveles, quizás como hijos de un GameObject que tenga componente Vertical Layout para que se acomoden uno abajo del otro. Esos hijos estarían ordenados, es decir el primer hijo (índice 0) sería el botón para cargar el nivel 1, el segundo hijo con índice 1 sería el botón para cargar el nivel 2, etc. Entonces al iniciar el juego puedes hacer visibles los hijos hasta el máximo nivel disponible -1 y todos los demás hijos los ocultas. Con eso se resuelve lo de hacer aparecer los botones dependiendo de cuánto valga la variable que indica el máximo nivel disponible.
      Luego hay que ver cómo ir incrementando esa variable, por ejemplo si el máximo nivel alcanzado es 2, el jugador podría jugar al nivel 1 y al 2, si juega al nivel 1 y gana, la variable máximo nivel alcanzado no debería incrementarse.
      Solo cuando el jugador está jugando al nivel que coincide con el máximo nivel alcanzado y gana, ahí debería incrementarse la variable máximo nivel alcanzado y guardarla en PlayerPrefs, de esa forma en el menú aparecerá un nuevo botón.
      Así que hay que ver cómo hacer para saber en qué nivel se entra, por ejemplo en cada escena podrías tener un Script llamado Level, con un entero público que indica el número de nivel, por ejemplo para el nivel 1 ese entero vale 1, para el nivel 2 el entero vale 2. Entonces cuando se produce la condición de ganar, ejecutar una función dentro del script Level, si el número de nivel coincide con el máximo nivel alcanzado se incrementa el máximo nivel alcanzado y se guarda en PlayerPrefs.

    • @Sarv9208
      @Sarv9208 2 года назад

      @@GameDevTraum Hola amigo, primero excelente tus videos, lo siguiente, tengo un proyecto de preguntas también, aunque yo no retorno en las escenas solo avanzo, si tengo unas dudas para saber si puedes aclararlas:
      1ro, Si exporto el proyecto como webGL e incluso lo despliego una una pagina web, ese guardado sigue funcionando o solo guarda en memoria si es local?
      2do, Si yo hago 3 preguntas en cada escena que es mas optimo y liviano, en 1 escena hacer las 3 preguntas (es decir como 3 niveles diferentes en una escena) o buscar reutilizar la escena con las 3 preguntas (solo cargar los textos o preguntas sin crear mas niveles) Este ultimo no se si me hago entender

  • @leatherandpoemscharmyman5774
    @leatherandpoemscharmyman5774 4 года назад +1

    Excelente video , la clase PlayerPref, es un must para tener , para datos relevantes, string, float , int , medio limitado porque no guarda vectores , pero si guarda los floats, es comoda y accesible y bastante comoda para usar en cualquier lado y area de un clase. Gracias !

    • @GameDevTraum
      @GameDevTraum  4 года назад +1

      De una! Es bastante práctica.
      Estaba por hacer una serie de artículos para mostrar cómo rebuscarse para guardar otros tipos de datos con PlayerPrefs, pero hasta ahora hice el artículo para guardar bools nomás. Creo que me voy a poner con eso.

  • @stephanyhernandez1624
    @stephanyhernandez1624 3 года назад +1

    Excelente tutorial amigo, estábamos atorados en un proyecto por esta razón.

  • @halconf20
    @halconf20 3 года назад +1

    Muchas gracias, me sirvió mucho para mi proyecto

  • @XxshadefirestormxX
    @XxshadefirestormxX 3 года назад +1

    Saludos amigo, un excelente tutorial, me ha servido muchísimo para mi proyecto.
    Pero tengo una duda ¿Este código se puede utilizar para escenas que no sean idénticas?
    Como en tu tutorial las escenas 1 y 2 son idénticas pero que tal si quiero agregar digamos una escena 3 donde solo se pueda cambiar de escena y mostrar los datos, una escena 4 donde solo se pueda conseguir dinero, una escena 5 donde se pueda hacer todo lo mostrado en el video pero no aparezcan los datos.
    De antemano te agradezco de tu ayuda al leer este comentario.

    • @GameDevTraum
      @GameDevTraum  3 года назад

      holaa, sisi en mi caso es solo un ejemplo de las infinitas posibilidades, el punto es entender que la información se guarda en el disco rígido (o memoria interna de un móvil) bajo el nombre que le asignemos, luego esta información la podemos recuperar en cualquier momento, por ejemplo al cambiar de escena o cinco días despues.
      Para guardar la información los métodos Set de PlayerPref (SetInt, SetFloat y SetString), para cargar la información los métodos Get (GetInt, GetFloat y GetString), además estos métodos se pueden combinar y guardar datos más complejos, por ejemplo un Vector3 para la posición del personaje, se necesitarían guardar 3 datos tipo float para las componentes X, Y y Z.
      Entonces en cada escena tu tendrías que leer la información guardada y hacer con ella lo que necesites.
      Como extra, si ejecutas la instrucción:
      PlayerPrefs.DeleteAll();
      Se eliminan todos los datos guardados, esto puede ser un poco peligroso, pero sirve cuando hay que probar varias veces el funcionamiento de cosas que se muestran una única vez, por ejemplo este cartel de no volver a mostrar:
      ruclips.net/video/xo9SxRke65M/видео.html

    • @XxshadefirestormxX
      @XxshadefirestormxX 3 года назад

      @@GameDevTraum He estado experimentando un poco con tus códigos y la verdad es que he aprendido bastante, sin embargo estoy atorado en uno de mis experimentos y me serias de muchísima ayuda si me asesoraras.
      Continuando con el ejemplo que muestras en este video, agregue un botón llamado "Reiniciar" y agregue las siguientes líneas de código al "GenericScript"
      public void BorrarTodo()
      {
      PlayerPrefs.DeleteAll();
      }
      Esto hasta el fondo del código, con el fin de al momento de presionar el botón "Reiniciar " todos los valores volvieran a cero, pero no ocurrió nada, los valores de MONEY e ITEMS siguen guardados en todas las pantallas.
      ¿Podrías ayudarme un poco para que todos los valores regresen a cero?

    • @GameDevTraum
      @GameDevTraum  3 года назад

      @@XxshadefirestormxX pero al reiniciar el juego si vuelven a cero verdad?

    • @XxshadefirestormxX
      @XxshadefirestormxX 3 года назад

      @@GameDevTraum No, en ningun momento regresan a cero.

    • @GameDevTraum
      @GameDevTraum  3 года назад

      @@XxshadefirestormxX Pon un:
      Debug.Log("Se ha borrado todo");
      Dentro de la función BorrarTodo, para asegurarte de que se esté ejcutando, el mensaje tiene que aparecer en consola,
      Si estás seguro que se está ejecutando, entonces el problema está en los valores por defecto, al momento de hacer la carga de la información con los PlayerPrefs.Get, ahí se suele asignar un valor por defecto en caso de no encontrar información guardada, esos valores quizás deberían ser cero

  • @donmelonijr
    @donmelonijr 3 года назад

    Buenas, muchas gracias por el tutorial aunque no entiendo la razón por la que no funcionó en mi proyecto. Mi problema era que tenia que compartir una puntuación entre dos escenas con una copia del GameManager (donde se guarda la puntuación) cada una, para poder vincular los textos de puntuación de cada escena. Pero a la hora de cambiar la escena, esta puntuación no se guarda, no se si es porque son dos copias distintas del mismo programa o porque simplemente no lo estoy haciendo correctamente.
    Agradeceria si alguien pudiera ayudar. Muchas gracias.

  • @RYRD.
    @RYRD. Год назад

    Amigo necesito tu ayuda, tengo 2 escenas con una variable llamada "Monedas", yo lo que busco es que al recoger las monedas en la (Escena 1) el valor de la variable “Monedas” se vaya sumando, y que al terminar el nivel, ese valor se sume a la variable “Monedas” de la (escena 2), pero cuando inicie el nivel de nuevo me quede la variable de la (escena 1) en 0 para poder seguir recogiendo monedas. como puedo lograr eso, necesito que solo se guarde el valor en la escena 2, y que se reinicie el valor en la escena 1

  • @natalyarbelaeznunez3797
    @natalyarbelaeznunez3797 3 года назад +1

    Muy buen video. Funciona muy bien para conservar los datos entre los cambios de escena, pero si no quiero que se sigan almacenando esos datos cuando salgo del juego y vuelvo a ingresar, ¿cómo lo configuro?. Gracias!

    • @GameDevTraum
      @GameDevTraum  3 года назад +1

      Mmm si utilizas PlayerPrefs tendrías que borrar todos los datos al salir, hay un método, creo que es PlayerPrefs.DeleteAllKeys(), sin embargo en este caso quizás sería mejor usar las partes 4, 5 y 6 de esa mini serie de vídeos, que hablan sobre el concepto de singleton, cómo implementarlo y cómo usarlo para pasar datos entre escenas. La idea es tener un GameObject con un script asignado que contiene la información y el GameObject no se destruye al cambiar de escenas, de esa forma se conservan los datos y se pueden leer desde la otra escena

    • @natalyarbelaeznunez3797
      @natalyarbelaeznunez3797 3 года назад +1

      @@GameDevTraum Gracias, lo probaré!

  • @zoloboy
    @zoloboy 9 месяцев назад

    Tengo una duda esas escenas son cargadas con el mismo script?

  • @japon2403
    @japon2403 2 года назад

    Excelente video pero tengo una duda y es como le hago para refrescar la escena porque en el vídeo solo se invoco refreshUI();

  • @leanforever7814
    @leanforever7814 3 года назад

    buen video, pero tengo un problema, tengo un personaje con vida, quiero guardar su vida entre escenas, y funciona, excepto cuando moris que se guarda tu vida en 0 y en negativo

  • @puerkismevanjohnson2529
    @puerkismevanjohnson2529 2 года назад +1

    Y cual se supone que es el video anterior para ver bien lo del refreshUI???

    • @GameDevTraum
      @GameDevTraum  2 года назад +1

      Holaa, he actualizado la descripción con todos los vídeos de la serie, la verdad que estaba bastante difícil de encontrar, muchas gracias por el comentario.
      En general hago mis vídeos para mostrar herramientas, pieso que lo ideal sería pausar un momento aquello que quieres lograr en este momento y ver estos vídeos en los que resuelvo el pasaje de datos entre escenas pero en una situación muy particular que he planteado, entender qué es lo que quiero hacer, qué alternativas propongo y cómo se implentan estas alternativas, una vez hecho esto usar esa información para crear una solución que se adapte a tus necesidades.
      Dejo aquí la lista de vídeos de la mini serie:
      ----------------------------------------------------------
      VÍDEOS DE ESTA MINISERIE
      1 - Introducción + Descarga:
      ruclips.net/video/1FT3ZidAjzk/видео.html
      //Primera estrategia en los vídeos 2 y 3
      2 - Estrategia con PlayerPrefs (Planteo de la estrategia)
      ruclips.net/video/usp-6-eabxU/видео.html
      3 - Solución con PlayerPrefs (Implementación)
      ruclips.net/video/5D7rxEcaJQ4/видео.html
      //Segunda estrategia en los vídeos 4 y 5
      4-Otra estrategia usando un "Singleton" (Planteo de la estrategia)
      ruclips.net/video/RTUwKgx8aHs/видео.html
      5-Usar un Singleton para intercambiar datos entre escena (Implentación)
      ruclips.net/video/dcXyRxYdg8g/видео.html
      ----------------------------------------------------------
      La estrategia con PlayerPrefs es mas simple pero solo permite pasar datos primitivos, es decir variables int, float y strings, aunque con esos datos primitivos se pueden guardar datos mas complejos.
      El singleton es un poco mas complejo de implementar pero tiene la facilidad de guardar datos mas complejos como vectores, incluso componentes de manera mas simple.

    • @puerkismevanjohnson2529
      @puerkismevanjohnson2529 2 года назад

      @@GameDevTraum Muchas gracias Traum!

    • @ProyectoPandanejo
      @ProyectoPandanejo 2 года назад

      @@puerkismevanjohnson2529 Disculpa pero aun no encuentro el video en cuestion con lo del refreshUI BUen video de todas maneras

    • @Sarv9208
      @Sarv9208 2 года назад

      @@GameDevTraum En mingo de los videos explicas como hacer refreshUI, en todo los videos ya lo tienes creado

  • @harrissarmiento1642
    @harrissarmiento1642 3 года назад +1

    Buenas, estuve leyendo en tu pagina para hacer lo mismo con strings, pero en el debug.log no me los muestra, asi que no estoy seguro si los anda guardando.

    • @GameDevTraum
      @GameDevTraum  3 года назад +1

      Hola la instrucción:
      PlayerPrefs.SetString("idDato","dato");
      Donde "idDato" y "dato" son strings (conviene usar variables tipo strings).
      Si se ejecuta esa instrucción el dato "dato" queda guardado en la memoria bajo el nombre "idDato". En un momento posterior se puede ejecutar:
      string dato2=PlayerPrefs.GetString("idDato","Dato por defecto si no se ha guardado nada");
      Debug.Log(dato2);
      Si la instrucción de guardado se ejecuta el dato tiene que quedar en la memoria.

    • @harrissarmiento1642
      @harrissarmiento1642 3 года назад

      @@GameDevTraum Este es mi codigo, intente pero, es que no veo fallas ya que hice incluso lo que hiciste en el video, pero obviamente alterando la sintaxis en donde es necesario
      private string nombre;
      private string nombrePrefsName="Nombre";
      void Awake()
      {
      Cargar();
      Debug.Log(nombre);
      }
      void OnDestroy(){
      Guardar();
      }
      private void Guardar(){
      PlayerPrefs.SetString(nombrePrefsName, nombre);
      }
      private void Cargar(){
      nombre = PlayerPrefs.GetString(nombrePrefsName,"PruebaNombre");
      }

    • @harrissarmiento1642
      @harrissarmiento1642 3 года назад

      Por alguna razon al quitarle el valor a la variable nombrePrefsName y dejarla vacia, ya me guarda el string

    • @GameDevTraum
      @GameDevTraum  3 года назад +1

      puede ser que tengas dos instancias del script? osea que ese script lo has añadido a más de un GameObject. Si ese es el caso, cada instancia va a ejecutar la función guardar y cargar y van a guardar la información con el mismo nombre

    • @harrissarmiento1642
      @harrissarmiento1642 3 года назад +1

      @@GameDevTraum ah pues mira, si era eso e.e, muchas gracias

  • @ReinaYT
    @ReinaYT 2 года назад