- Cómo crear clases serializables
- Crear dos componentes y comunicarlos entre sí;
- Crear un JSON para almacenar datos mediante clases serializables y
- guardarlo en PlayerPrefs.
Clases serializables
nos permiten
Guardar/persistir datos de objetos, incluso después de cerrar el juego.
Para entrar en este concepto primero vamos a ver
cómo dos objetos se comunican entre sí a través de variables públicas;
en este caso María le quiere pedir hamburguesas como almuerzo a Bob.
Para lograr la comunicación vamos a:
BASE: Crear y conectar los objetos
- Crear un script Bob y declarar una variable pública almuerzo de tipo string ;
- Crear un script Maria y declarar una variable pública esposo de tipo Bob, que podrá ser asignada con algún objeto existente.
- Crear GameObject para cada uno y añadirle su script respectivo.
<h5>"Para seleccionar el objeto que cubra la variable esposo de Maria, podríamos elegir:</h5>
- Por dentro de la variable presentada en el Inspector apretar el ícono circular que aparece en su extremo, el cual desplegará un menú de los objetos aplicables.
|| - Arrastrar el objeto desde Hierarchy hasta ese mismo sitio.
Nota: para evitar tropiezos con el click del arrastre, podemos BLOQUEAR la selección del Objeto (Maria) con el botón del candado en la esquina superior derecha del Inspector y maniobrar todo el editor con la seguridad de que no se irá a deseleccionar accidentalmente.
Ahora podemos
CONFIGURACIÓN del envío del mensaje
- Declarando una variable pública string llamada antojo en Maria; para luego
- Asignar antojo como la re-asignación de la variable almuerzo en Bob, desde la activación (OnEnable) de María.
El script de María:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Maria : Monobehaviour {
public Bob esposo;
public string antojo;
void OnEnable () {
esposo.almuerzo = antojo;
}
El script de Bob:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Bob : Monobehaviour {
public string almuerzo;
}
Persistencia conPlayerPrefs
“María tiene Mascota”
-agregamos una variable pública del tipo Mascota llamada pepito en el script de Maria;
-Mascota es la siguiente clase:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class Mascota {
public string nombre;
public string juguetePreferido;
[Range(0,1)]
public float aburrimiento;
}
X Nuestro problema es que las modificaciones en pepito no persisten al reinicio del juego
…
Pero la clase Mascota esta decorada para ser serializable, y
todo obj. serializable puede convertirse en un
Archivo JSON (Javascript Object Notation)
<h5>Para implementarlo podríamos agregar en el script de María:</h5>Los JSON se suelen utilizar para enviar distintos tipos de datos “traducidos” a puro texto
entre una página/app y un server.
.
A su vez el server puede enviar un JSON y la página/aplicación traducir su texto de vuelta a objetos de su lenguaje (p.e JavaScript).
- una variable pública string de nombre jsonPepito
- Y a esta, dentro de un OnDisable le vamos a asignar el método para transformar a Json, con la variable pepito como parámetro:
- void OnDisable () {
jsonPepito = JsonUtility.ToJson(pepito);
} - De esta forma, las modificaciones en pepito quedan guardadas como texto JSON… Ahora tenemos que
Para esto
-
Dentro del OnEnable re-asignamos a la variable pepito = con el método genérico que reciba el tipo de dato que este fue antes de convertirse a JSON (instancia de la clase Mascota) y el dicho JSON como objeto parámetro a convertir (jsonPepito)
-
Toda esta conversión la vamos a condicionar, para que suceda solo si jsonPepito no está vacio
void OnEnable () {
esposo.almuerzo = antojo;
if (jsonPepito != " ") {
pepito = JsonUtility.FromJson<Mascota>(jsonPepito); -
pero…
X El problema con esto es que las modificaciones sobreviven a la desactivación del objeto, más no se guardan. Por suerte contamos con:
PlayerPrefs
Esta utilidad de Unity permite persistir el estado de los objetos, guardándolos en la consola o PC que ejecuta el juego.
Es como una base de datos almacenados en formato clave : valor.
La clave sirve para identificar el valor a guardar.
El valor puede ser string, integer, float
Para implementarlo vamos a
- Sobrescribir el OnDisable, esta vez invocando PlayerPrefs para guardar el Json de pepito como string.
(1er parametro:“nombreDeClave”, 2do parametro: el valor a guardar):
void OnDisable () {
PlayerPrefs.SetString("mascotaDeMaria", JsonUtility.ToJson(pepito))
}
-
Finalmente modificamos la llamada al JSON en el OnEnable y su respectivo if
Para adaptarla al uso de PlayerPrefs:void OnEnable () {
esposo.almuerzo = antojo;
if (PlayerPrefs.HasKey(“mascotaDeMaria”)) {
pepito = JsonUtility.FromJson<Mascota>(PlayerPrefs.GetString(“mascotaDeMaría”));
Si quisiéramos reiniciar estos valores podemos hacerlo desde la pestaña Edit y Clear all PlayerPrefs.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?