No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Introducción a Unity: Scripting

Curso de Introducción a Unity: Scripting

Ruth Margarita García López

Ruth Margarita García López

Clases serializables

6/24
Recursos

Aportes 3

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

<h5>Veremos:</h5>
- 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>
  1. 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.
    ||
  2. 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)

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).

<h5>Para implementarlo podríamos agregar en el script de María:</h5>
  • 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
<h5>Recuperar el JSON para aplicarlo a pepito, cuando reactivemos su objeto</h5>

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.
<h5>sintáxis del método:</h5>

(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.

# Clase #6 - **Clases serializables** ## **Comunicación entre Componentes en Unity** ### **1. Uso de Variables Públicas** * **Comunicación**: Podemos comunicar dos componentes creando una variable pública en un script y asignándole el objeto con el que queremos interactuar. * **Ejemplo**: **Objeto 1 (Maria)**: using UnityEngine; public class Maria : MonoBehaviour { public Bob esposo; // Referencia al objeto con el que se comunica public string antojo; void OnEnable() { esposo.almuerzo = antojo; // Modifica la variable en el otro objeto } } **Objeto 2 (Bob)**: using UnityEngine; public class Bob : MonoBehaviour { public string almuerzo; // Variable que se va a modificar ### **Guardando Datos con JSON** * **Serialización**: Los objetos serializables pueden transformarse en JSON, lo que permite convertir un objeto en una cadena de texto que describe su estado. * **Ejemplo de Serialización**: csharpCopiar código using UnityEngine; public class Maria : MonoBehaviour { public Mascota pepito; public string jsonPepito; void OnEnable() { if (jsonPepito != "") { pepito = JsonUtility.FromJson\<Mascota>(jsonPepito); // Deserializa el JSON a un objeto } } void OnDisable() { jsonPepito = JsonUtility.ToJson(pepito); // Serializa el objeto a JSON } } **Explicación**: Este código permite que las variables de un objeto se mantengan consistentes cuando el objeto se desactiva y se vuelve a activar. ### **Persistencia de Datos con PlayerPrefs** * **Persistencia**: Para que la información persista entre sesiones de juego, podemos usar `PlayerPrefs` para guardar y recuperar datos. * **Ejemplo**: csharpCopiar código using UnityEngine; public class Maria : MonoBehaviour { public Mascota pepito; void OnEnable() { if (PlayerPrefs.HasKey("mascotaDeMaria")) { pepito = JsonUtility.FromJson\<Mascota>(PlayerPrefs.GetString("mascotaDeMaria")); } } void OnDisable() { PlayerPrefs.SetString("mascotaDeMaria", JsonUtility.ToJson(pepito)); } } **Explicación**: Aquí, se utiliza `PlayerPrefs` para almacenar el estado del objeto `pepito` en formato JSON, permitiendo que la información persista incluso después de cerrar y abrir el juego.
csharpCopiar código using UnityEngine; public class Maria : MonoBehaviour { public Mascota pepito; void OnEnable() { if (PlayerPrefs.HasKey("mascotaDeMaria")) { pepito = JsonUtility.FromJson\<Mascota>(PlayerPrefs.GetString("mascotaDeMaria")); } } void OnDisable() { PlayerPrefs.SetString("mascotaDeMaria", JsonUtility.ToJson(pepito)); } }