En el mundo de la programación de videojuegos, lograr una comunicación fluida entre distintos componentes es fundamental. Aquí exploraremos la comunicación entre los componentes a través de variables públicas, de manera que dos clases puedan 'hablar' entre sí y compartir información vital.
Comunicación entre dos componentes
Para que un componente pueda transmitir información a otro, se emplean las variables públicas. Tomemos un ejemplo práctico: María y Bob son dos componentes. María desea enviarle un mensaje a Bob, quien está en su cabina planeando el almuerzo.
Declaración de variables públicas: María puede tener una variable pública del tipo Bob, a la que llamamos esposo. Esto le permite identificar a Bob como su esposo dentro de la escena.
publicBob esposo;
Asignación en Unity: En el editor de Unity, puedes asignar físicamente el objeto correspondiente al campo esposo arrastrando el objeto Bob a ese campo en el Inspector.
Activación de scripts y comunicación de datos
Imaginemos que María tiene un antojo específico para el almuerzo, que desea comunicarle a Bob.
Definición de antojo de María: Utilizando una variable pública de tipo string llamada antojo, se puede determinar el deseo de María cada vez que el componente se activa.
Simulación en Unity: Al activar y desactivar el script de María, se transmite el deseo de almuerzo a Bob, alterando su plan inicial de preparación respecto a las lentejas.
Clases serializables y JSON en Unity
La serialización permite guardar y recuperar el estado de un objeto, esencial para que los datos persistan incluso cuando se cierra el juego. Profundicemos en cómo transformar los objetos en JSON y almacenarlos adecuadamente.
¿Qué es una clase serializable?
Las clases serializables son aquellos objetos que pueden transformarse en un formato que Unity y otras interfaces, como los servidores web, pueden entender. En nuestro caso, utilizamos JSON para este propósito.
Definición de clase Mascota: Una clase que incluye atributos como nombre, juguete preferido y nivel de aburrimiento.
Buenas prácticas para la memoria y la gestión de datos
A lo largo del desarrollo, es crucial asegurar que los datos se mantengan coherentes y que las claves de acceso y recuperación en PlayerPrefs se manejen de manera adecuada.
Nombres de claves únicos: Evita conflictos utilizando nombres descriptivos y únicos para cada valor a guardar.
Revisión regular: Borra los PlayerPrefs regularmente durante la fase de desarrollo para evitar datos inconsistentes.
Pruebas desde cero: Siempre realiza pruebas desde un estado inicial para verificar que todo el sistema de guardado funcione adecuadamente.
Estos consejos aseguran que, ya sea que María tenga un antojo o Pepito prefiera un juguete diferente, Unity recordará sus preferencias y las gestionará de una sesión a otra.
Involúcrate más en el emocionante mundo del desarrollo de juegos persistentes y sigue explorando el potencial que ofrecen las clases serializables y los mecanismos de almacenamiento en Unity. ¡Tu juego puede convertirse en una obra maestra interactiva y perdurable!
-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.-CrearGameObject para cada uno y añadirle su script respectivo.
"Para seleccionar el objeto que cubra la variable esposo de Maria, podríamos elegir:
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;publicclassMaria:Monobehaviour{publicBob esposo;public string antojo;voidOnEnable(){ esposo.almuerzo= antojo;}
El script de Bob:
using UnityEngine;using System.Collections;using System.Collections.Generic;publicclassBob: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]publicclassMascota{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).
Para implementarlo podríamos agregar en el script de María:
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:
De esta forma, las modificaciones en pepito quedan guardadas como texto JSON.. Ahora tenemos que
Recuperar el JSON para aplicarlo a pepito, cuando reactivemos su objeto
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
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.
sintáxis del método:
(1er parametro:"nombreDeClave", 2do parametro: el valor a guardar):
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;
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;