Al usar datos persistentes, puedes realizar un seguimiento de los datos por jugador y guardarlos entre sesiones de juego. Esto abre la posibilidad de crear una variedad de modos de juego de progresión donde los jugadores pueden irse y regresar después para reanudar sus objetivos o ver el mismo estado del juego que cuando se fueron.
Los datos persistentes funcionan mediante el almacenamiento de datos, como perfiles o estadísticas para cada jugador individual, en Verse. Estos datos después se pueden actualizar tantas veces como cambie su valor. Dado que estos datos son persistentes, permanecerán en todas las sesiones de juego y estarán disponibles en todo momento mientras el jugador esté en línea en el juego.
Entre algunos modos de juego que usan datos persistentes se encuentran los de supervivencia, los de gestión, los RPG y los roguelites. Estos modos de juego buscan que los jugadores acumulen objetos para cumplir metas a largo plazo y así avanzar la jugabilidad.
Utiliza datos persistentes en las secuencias de comandos de Verse para almacenar la información que se guarda por jugador y por módulo. Implementa datos persistentes en los modos de juego donde quieres retener jugadores al incentivar un progreso continuo.
Para practicar la persistencia por tu propia cuenta, consulta el tutorial de estadísticas de jugador persistentes.
Aunque los datos persistentes se pueden crear y utilizar en Verse, también hay dispositivos del modo Creativo que tienen funcionalidades básicas que admiten datos persistentes. Para obtener más detalles, consulta Dispositivos de persistencia.
Qué significa la persistencia en Verse
En Verse, una variable definida en un módulo es global para cualquier instancia de juego que se ejecute en el ámbito de la variable. A excepción de las variables con ámbito de módulo asociadas con la sesión, una variable con ámbito de módulo requiere persistencia, es decir, el almacenamiento de datos más allá del juego actual. Debido a esto, hay restricciones sobre qué tipos se pueden usar en el ámbito de módulo.
En este momento, puedes usar los siguientes tipos en el ámbito de módulo:
| Tipos de ámbitos de módulo permitidos | Definición | Restricciones |
|---|---|---|
| Los datos de cualquier tipo representados por | Los datos solo se almacenan durante la sesión actual y no persisten en las rondas posteriores. |
| Los datos de cualquier tipo representados por | Solo se puede acceder a los datos persistentes del jugador cuando el jugador está en el juego actual. |
Si un jugador sale de un juego o no se encuentra en la sesión actual, ya no podrás almacenar sus datos ni acceder a ellos en esa sesión de juego. Si el jugador regresa o juega el mismo juego otra vez, podrás acceder a sus datos y actualizarlos.
Cómo crear datos persistentes en Verse
Puedes crear tus propios datos persistentes para cada jugador y actualizarlos, almacenarlos y e invocarlos de nuevo de manera continua cada vez que los jugadores se unan al juego otra vez. Durante el emparejamiento, el juego buscará datos persistentes para el jugador nuevo. Si el jugador tiene datos persistentes disponibles, los datos se cargan y quedan disponibles para las secuencias de comandos de Verse.
Si el jugador tiene datos persistentes para una isla y se produce un error al cargar estos datos, el jugador no podrá unirse a la isla. Se trata de una medida de protección para impedir que los datos persistentes se sobrescriban en caso de que se produzcan errores en la carga de datos.
Para crear datos persistentes en el código de Verse, define una variable weak_map global que utilice el tipo de jugador como clave y un tipo persistente como valor. Consulta Tipos persistentes para ver la lista completa de los tipos que pueden ser persistentes.
En el siguiente ejemplo, la variable global 'weak_map' MySavedPlayerData usa el tipo de jugador como la clave y un entero como valor. Almacenar un valor entero para un jugador en esta variable significa que los datos persistirán en las sesiones de juego y será posible acceder a ellos y actualizarlos en cualquier momento cuando el jugador esté en el juego.
var MySavedPlayerData:weak_map(player, int) = map{}
Una vez definidos los datos persistentes, tendrás que inicializar los datos para cada jugador. Para hacer esto, comprueba que ya no existan datos almacenados para ese jugador y, a continuación, agrega el jugador y un valor inicial a weak_map.
# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void =
InitialSavedPlayerData:int = 0
Players := GetPlayspace().GetPlayers()
for (Player : Players):
if:
not MySavedPlayerData[Player]
set MySavedPlayerData[Player] = InitialSavedPlayerDataEn el ejemplo anterior, solo se almacenó un valor entero, pero puedes usar otros tipos, como clases y matrices, para almacenar más datos para cada jugador en weak_map. Consulta Tipos persistentes para ver la lista completa de los tipos que puedes usar.
En el siguiente ejemplo de Verse, se muestra cómo puedes definir un perfil de jugador personalizado en una clase que puedes almacenar y actualizar, y a la que también puedes acceder, para un jugador. La clase player_profile_data almacena información de un jugador, como los PE obtenidos, su clasificación y las misiones que completó.
player_profile_data := class<final><persistable>:
Version:int = 0
Class:player_class = player_class.Villager
XP:int = 0
Rank:int = 0
CompletedQuestCount:int = 0
QuestHistory:[]string = array{}
var PlayerProfileDataMap:weak_map(player, player_profile_data) = map{}Hay un límite para la cantidad de datos que puedes almacenar por jugador y por isla. Cada vez que guardes datos, te recomendamos que revises cómo influyen las actualizaciones en el tamaño total. Para ello, utiliza la función 'FitsInPlayerMap'. Para obtener más detalles, consulta Cómo probar si los datos persistentes están dentro de los límites.
Ahora que sabes cómo crear tus propios datos persistentes e inicializarlos para cada jugador, asegúrate de consultar Prácticas recomendadas para conocer las formas recomendadas de trabajar con datos persistentes en Verse.
Cómo modificar datos entre versiones publicadas de tu isla
Después de haber publicado la versión actual de tu isla, si haces actualizaciones en los datos persistentes, todos los datos guardados de una versión anterior de la isla deben ser compatibles con las versiones posteriores de la isla.
Para garantizar esto, se ejecuta una comprobación de retrocompatibilidad en UEFN y, si el código de Verse ya no admite la versión recientemente publicada, se produce un error de compilación. Esta comprobación de retrocompatibilidad se ejecuta cada vez que realizas las siguientes acciones:
Haz clic en Comenzar sesión en la barra de herramientas de UEFN.
Haz clic en Aplicar cambios o Aplicar cambios de Verse en la barra de herramientas de UEFN.
Cómo publicar tu isla por primera vez.
Cómo activar una nueva versión pública de tu isla.
Esta comprobación de compatibilidad con versiones anteriores es esencialmente una comprobación de tipo en el tipo de valor de la variable weak_map en el ámbito del módulo. Para los tipos simples, como los enteros, es posible que el tipo no se cambie después de que se publica la isla. Esto incluye structs, donde no puedes alterar la definición de struct después de que se publica la isla.
Actualmente, el único tipo persistente al que puedes añadir más datos después de publicar tu isla es el tipo de clase, siempre y cuando los campos nuevos tengan valores predeterminados. Esto significa que al cargar los datos guardados de una versión anterior se incluirán los campos nuevos y sus valores predeterminados. Consulta las prácticas recomendadas para usar clases como datos persistentes para obtener más detalles.
Cómo restablecer los datos persistentes de tu isla
Si alguna vez necesitas forzar el restablecimiento de los datos persistentes para tu isla, en Verse puedes hacerlo. Para ello, asigna un valor predeterminado de datos persistentes en el weak_map para el jugador cuando se una a la isla.
Para saber si ya se restablecieron los datos del jugador, puedes incluir un valor de versión para tu clase y actualizarlo con los cambios nuevos como parte de los datos persistentes. Esta es una de las prácticas recomendadas que se enumeran a continuación, ¡así que asegúrate de consultar las demás!
Tipos persistentes en Verse
Los siguientes son los tipos persistentes que puedes usar en la variable weak_map dentro del ámbito de módulo:
| Type | Descripción |
|---|---|
matriz | Una matriz es persistente si el tipo de los elementos de la matriz es persistente. |
char32 | Los valores de caracteres son persistentes. |
char8 | Los valores de caracteres son persistentes. |
class | Una clase es persistente cuando:
|
Los valores de color son persistentes. | |
enum | Una enumeración es persistente cuando se define con el especificador persistente. |
float | Los valores de punto flotante son persistentes. |
int | Los valores enteros son persistentes. |
logic | Los valores lógicos son persistentes. |
mapa | Un mapa es persistente si los tipos de clave y valor son persistentes. |
opción | Una opción es persistente si su valor es persistente. |
struct | Una estructura es persistente cuando:
No puedes alterar una estructura persistente una vez que publicaste la isla. Por este motivo, recomendamos usar estructuras persistentes solo cuando se sabe que el esquema será constante. tupla |
tupla | Una tupla es persistente si cada tipo de elemento es persistente. |
Los valores de Vector2 son persistentes. | |
Los valores de Vector2i son persistentes. | |
Los valores de Vector3 son persistentes. |
Cómo realizar pruebas con datos persistentes
Si quieres probar el comportamiento de los datos persistentes antes de publicar la última versión de tu isla, puedes establecer el siguiente comportamiento en el dispositivo Ajustes de la isla, tanto para el comportamiento persistente: sesión de prueba de juego como para el comportamiento persistente: editar sesión:
| Comportamiento de los datos persistentes | Descripción |
|---|---|
Importar desde sesión en vivo | Importa los datos de la sesión desde datos en vivo si están disponibles. Para esto, es necesario que la isla se haya publicado en vivo y que el jugador haya jugado en la versión en vivo de la isla. Si los datos en vivo están disponibles, los datos de la sesión de prueba de juego se inicializarán con una copia de los datos en vivo. Esto puede ser muy útil durante las pruebas en busca de errores en los datos persistentes asociados con los cambios en la lógica de la isla. |
Simular usuario nuevo | Inicia al jugador con nuevos datos persistentes como si estuviera jugando la isla por primera vez. |
Tanto los comportamientos Importar desde sesión en vivo como Simular nuevos usuarios funcionan tanto para la persistencia de Verse como para los dispositivos de persistencia, como los dispositivos Punto de guardado y Rastreador. Simular nuevo usuario ejecutará la sesión con datos vacíos para la persistencia de Verse y los dispositivos de persistencia sin cambiar los datos en vivo, mientras que Importar desde datos sesión en vivo cargará los datos persistentes de ambos si están disponibles los datos en vivo.
La configuración del comportamiento de los datos persistentes se aplica cuando realizas una prueba de juego. Hay dos tipos de casos diferentes donde puedes realizar pruebas con datos persistentes:
Editar sesión: la configuración del comportamiento de los datos persistentes se aplica cuando inicias una sesión desde UEFN. Esto significa que los datos persistentes pueden persistir en varias partidas dentro de una misma sesión. Si sales de la sesión y comienzas una nueva, los datos persistentes se restablecerán y la configuración de su comportamiento se aplicará de nuevo.
Sesión de prueba de juego: la configuración del comportamiento de los datos persistentes se aplica cuando configuras una prueba de juego en el portal de creadores al incorporar un jugador de prueba mediante un código de prueba de juego o un código de enlace privado. La configuración del comportamiento de los datos persistentes solo se aplica la primera vez que se incorpora el jugador. Cuando el jugador se va y se une a la prueba de juego de nuevo, sus datos persisten en todas las sesiones y la configuración del comportamiento de los datos persistentes no se aplica otra vez. Para restablecer los datos persistentes, necesitarás crear un nuevo código de enlace para prueba de juego.
En cuanto a las actualizaciones de la isla que influyen sobre el modo en que se administran y actualizan los datos persistentes, recomendamos que realices una prueba en los dos escenarios, iniciando una sesión desde UEFN y una prueba de juego que use un código de enlace. Asegúrate de probar los cambios que realizas en los datos persistentes tanto con los datos en vivo como con los datos del nuevo usuario simulado. Esto te ayudará a garantizar que tus actualizaciones funcionen para los jugadores actuales de tu isla y los jugadores nuevos.
Efectos de publicar versiones nuevas de una isla
Una vez que se publica la isla, se crea un registro persistente para los jugadores cuando sus datos se almacenan en el método weak_map. Estos datos después se almacenarán y cargarán durante cualquier visita subsiguiente que se produzca en tu isla.
Si se publican versiones nuevas de tu isla, los datos persistentes se fusionarán de forma automática con la nueva versión. Consulta Cómo modificar datos entre versiones publicadas de tu isla para obtener más información.
Efectos de revertir tu isla publicada
Si reviertes tu isla a una versión anterior a través del Portal de creadores, se restablecerán los datos persistentes de todos los usuarios.
En este momento, no se admite ninguna función para notificar a los jugadores que sus datos se vieron afectados por una reversión.
Esto provocará que se pierdan las actualizaciones de datos recientes del jugador e incluso que sus datos se restablezcan por completo. Esto es verdadero si la reversión no incluye cambios en la lógica de forma interna que podrían afectar a los datos persistentes.
Debido a su impacto sobre los datos persistentes, recomendamos usar la función de reversión solo como último recurso.
Limitaciones
A continuación, se presentan las limitaciones para trabajar con datos persistentes en Verse.
Tamaño máximo de objeto persistente
Existe un límite en la cantidad de datos que se pueden almacenar en un weak_map por jugador.
Un registro de weak_map es la cantidad total de datos asociados con un único elemento weak_map. Un solo registro de weak_map tiene un tamaño de datos máximo de 256 kilobytes (KB) por jugador.
Cuando se guarda un valor de 'weak_map', se calcula la cantidad total de memoria requerida para guardar los datos.
Los siguientes son algunos ejemplos de datos que excederían el límite de 256 KB:
Aproximadamente 24 000 valores
floatoint.Aproximadamente 200 000 caracteres de texto. Esto equivale a cerca de 60 páginas de texto de una novela promedio.
Si intentas guardar datos para un registro de jugador cuyo tamaño supera los 256 KB, la operación no se realizará y recibirás un error en tiempo de ejecución de Verse.
Puedes evitar errores de guardado si utilizas la función auxiliar de Verse FitsInPlayerMap. La función FitsInPlayerMap toma una copia del registro que deseas guardar y verifica su tamaño. Si el registro se puede guardar, la llamada a la función se realizará correctamente; de lo contrario, si el registro es demasiado grande, se generará un error.
La función FitsInPlayerMap es particularmente útil cuando trabajas con una matriz dinámica o un mapa de datos y les agregas nuevos elementos. Actualizar un int, float, o lógica que estaba previamente en el registro persistente no cambiará el tamaño del registro persistente.
Máximo de mapas persistentes débiles de jugador por isla
Una sola isla puede tener hasta cuatro variables persistentes, es decir, cuatro variables weak_map con player como el tipo de clave. Este requisito se aplica mediante el compilador de Verse.
Mapa débil requerido con tipo de clase
Al menos un valor de weak_map de la variable persistente debe ser una clase si se alcanzó el límite de variables persistentes máximas. Esto es para garantizar que se puedan agregar más datos a las variables más adelante y, al mismo tiempo, satisfacer la retrocompatibilidad en las publicaciones posteriores de la isla.