Al utilizar datos persistentes, puedes realizar un seguimiento y guardar datos por jugador entre sesiones de juego. Esto abre una variedad de modos de juego progresivos en los que los jugadores pueden irse y volver posteriormente para reanudar sus objetivos o ver el mismo estado del juego que cuando se fueron.
Los datos persistentes almacenan los datos de cada jugador, como su perfil o sus estadísticas, en Verse. Estos datos pueden actualizarse tantas veces como cambie su valor. Dado que estos datos son persistentes, se mantendrán a lo largo de las sesiones de juego y estarán disponibles siempre que el jugador esté conectado al juego.
Los juegos de supervivencia, de gestión, de rol y de mazmorras son algunos ejemplos de modos de juego que utilizan datos persistentes. Estos tipos de modos de juego requieren que los jugadores acumulen objetos que satisfagan objetivos a largo plazo que impulsen la jugabilidad.
Utiliza datos de persistencia en tus secuencias de comandos de Verse para almacenar información que se guarda por jugador y módulo. Implementa datos persistentes en los modos de juego en los que quieras retener a los jugadores al incentivar la progresión continua.
Para practicar la implementación de la persistencia, echa un vistazo al tutorial de estadísticas de persistencia de los jugadores.
Aunque los datos de persistencia se pueden crear y utilizar en Verse, también hay dispositivos del modo Creativo que tienen una funcionalidad básica que admite datos de persistencia. Para obtener más información, consulta Dispositivos de persistencia.
Qué significa persistencia en Verse
En Verse, una variable definida en un módulo es global para cualquier instancia de juego que se ejecute donde la variable esté dentro del ámbito. A excepción de las variables de ámbito modular asociadas a session, una variable de ámbito modular requiere persistencia, es decir, el almacenamiento de datos más allá de la partida actual. Por este motivo, existen restricciones sobre los tipos que se pueden utilizar en el ámbito del módulo.
Actualmente, puedes utilizar los siguientes tipos en el ámbito del módulo:
| Tipos de ámbito 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 se mantienen en rondas posteriores. |
| Los datos de cualquier tipo representado por | El acceso a los datos de persistencia del jugador solo está permitido cuando el jugador se encuentra en la partida actual. |
Si un jugador abandona una partida o no está en la sesión actual, ya no se puede almacenar ni acceder a sus datos en esa sesión de juego. Si el jugador regresa o vuelve a jugar la misma partida, podrá acceder a sus datos y actualizarlos.
Cómo crear datos de persistencia en Verse
Puedes crear tus propios datos persistentes para cada jugador, que pueden actualizarse, almacenarse y recuperarse continuamente cada vez que los jugadores se reincorporen al juego. Durante el emparejamiento, el juego comprobará si hay datos persistentes para el nuevo jugador. Si el jugador dispone de datos persistentes, los datos se cargan y se ponen a disposición de las secuencias de comandos de Verse.
Si el jugador tiene datos persistentes de una isla y la carga de datos falla, el jugador no podrá unirse a la isla. Se trata de una medida de protección que evitará que los datos persistentes se sobrescriban en caso de que la carga de datos falle.
Para crear datos de persistencia en tu código Verse, define una variable global weak_map que utilice el tipo player como clave y un tipo persistente como valor. Consulta Tipos persistentes para ver la lista completa de tipos que pueden ser persistentes.
En el siguiente ejemplo, la variable global `weak_map` MySavedPlayerData utiliza el tipo de jugador como clave y un entero como valor. El almacenamiento de un valor entero para un jugador en esta variable significa que los datos se mantendrán a través de las sesiones de juego y se puede acceder a ellos y actualizar 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 de cada jugador. Para ello, comprueba si no existen ya datos almacenados para ese jugador y añade el jugador y un valor inicial al 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] = InitialSavedPlayerDataEl ejemplo anterior solo almacenaba un valor entero, pero puedes utilizar otros tipos, como clases y matrices, para almacenar más datos de cada jugador en el weak_map. Consulta Tipos persistentes para ver la lista completa de tipos que puedes utilizar.
El siguiente ejemplo de Verse muestra cómo se puede definir un perfil de jugador personalizado en una clase que se puede almacenar, actualizar y a la que se puede acceder posteriormente para un jugador. La clase player_profile_data almacena información de un jugador, como los PE que ha ganado, su rango y las misiones que ha completado.
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 en la cantidad de datos que puedes almacenar por jugador y por isla. Siempre que guardes datos, te recomendamos que compruebes cómo afectan las actualizaciones al tamaño total mediante la función `FitsInPlayerMap`. Para obtener más información, consulta Cómo verificar que los datos de persistencia están dentro de los límites.
Ahora que ya sabes cómo crear tus propios datos de persistencia e inicializarlos para cada jugador, no olvides consultar las prácticas recomendadas para conocer las formas recomendadas de trabajar con datos de persistencia en Verse.
Cómo modificar los datos existentes entre versiones publicadas de tu isla
Una vez publicada la versión actual de tu isla, si realizas actualizaciones de los datos persistentes, cualquier dato almacenado de una versión anterior de la isla deberá ser compatible con versiones posteriores de la misma.
Para garantizarlo, se realiza una comprobación de compatibilidad con versiones anteriores en UEFN y se produce un fallo de compilación si el código Verse ya no es compatible con la versión publicada actualmente. Esta comprobación de compatibilidad con versiones anteriores se ejecuta siempre que:
Haz clic en Abrir sesión en la barra de herramientas de UEFN.
Haz clic en Enviar cambios o Enviar cambios de Verse en la barra de herramientas de UEFN.
Cómo publicar tu isla por primera vez.
Activación de una nueva versión pública de tu isla.
Esta comprobación de compatibilidad con versiones anteriores es básicamente una verificación del tipo de valor de la variable weak_map del módulo, En el caso de los tipos simples, como los enteros, el tipo no puede modificarse una vez publicada la isla. que incluye structs, donde no se puede modificar la definición de estructura una vez publicada la isla.
Actualmente, el único tipo persistente al que puedes añadir más datos después de publicar tu isla es el tipo class siempre y cuando los nuevos campos tengan valores predeterminados. Esto significa que la carga de datos guardados de una versión anterior incluirá los nuevos campos y sus valores predeterminados. Para obtener más información, consulta las prácticas recomendadas para utilizar clases como datos de persistencia.
Cómo restablecer los datos de persistencia de tu isla
Si alguna vez necesitas forzar un reinicio de los datos de persistencia de tu isla, puedes hacerlo en Verse asignando un valor predeterminado a estos datos en el weak_map del jugador cuando se una a la isla.
Para saber si los datos del jugador ya se han restablecido, puedes incluir un valor de versión para tu clase y actualizarlo con los nuevos cambios como parte de los datos persistentes. Esta es una de las prácticas recomendadas que se enumeran a continuación, así que no dejes de consultar las demás.
Tipos persistentes en Verse
Los siguientes son los tipos persistentes que puedes utilizar en la variable weak_map de ámbito de módulo:
| Tipo | Descripción |
|---|---|
array | Una matriz es persistente si el tipo de los elementos de la misma también lo son. |
char32 | Los valores de los caracteres son persistentes. |
char8 | Los valores de los caracteres son persistentes. |
class | Una clase es persistente cuando:
|
Los valores de color son persistentes. | |
enum | Una enum es persistente cuando se define con el especificador persistable. |
float | Los valores de coma flotante son persistentes. |
int | Los valores enteros son persistentes. |
logic | Los valores lógicos son persistentes. |
map | Un mapa es persistente si tanto el tipo de clave como el de valor también lo son. |
option | Una opción es persistente si su valor es persistente. |
struct | Una estructura es persistente cuando:
No se puede modificar una estructura persistente una vez publicada la isla. Por esta razón, recomendamos usar estructuras persistentes solo cuando se sabe que el esquema es constante. tupla |
tuple | 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 de persistencia
Si quieres probar el comportamiento de los datos de persistencia antes de publicar la última versión de tu isla, puedes establecer el siguiente comportamiento en tu dispositivo de ajustes de la isla tanto para la configuración Comportamiento de persistencia: prueba de juego como en la configuración Comportamiento de persistencia: editar sesión:
| Comportamiento de los datos de persistencia | Descripción |
|---|---|
Importar datos actuales | Importa datos de sesión de datos actuales si están disponibles. Para ello es necesario que la isla se haya publicado en tiempo real y que el jugador haya jugado en la versión en tiempo real de la isla. Si se dispone de datos en tiempo real, los datos de la sesión de prueba se introducirán con una copia de los datos en tiempo real. Esto puede ser muy útil para probar problemas con datos persistentes relacionados con cambios en la lógica de tu isla. |
Simular usuario nuevo | Inicia al jugador con nuevos datos de persistencia como si estuviera jugando en la isla por primera vez. |
Tanto los comportamientos Importar datos actuales como Simular nuevo usuario funcionan tanto para la persistencia de Verse como para los dispositivos de persistencia, como los dispositivos de punto de guardado y rastreador. Simular nuevo usuario ejecutará la sesión con datos vacíos tanto para la persistencia de Verse como para los dispositivos de persistencia sin cambiar los datos actuales, mientras que Importar datos actuales cargará los datos de persistencia de ambos si los datos actuales están disponibles.
Los ajustes de comportamiento de los datos de persistencia se aplican al realizar pruebas de juego. Existen dos situaciones diferentes en las que puedes realizar pruebas con datos persistentes:
Editar sesión: la configuración del comportamiento de los datos de persistencia se aplica al iniciar una sesión desde UEFN. Esto significa que los datos persistentes pueden mantenerse en varias partidas dentro de una misma sesión. Si sales de la sesión y vuelves a iniciar una nueva, se restablecerán los datos persistentes y se volverán a aplicar los ajustes de comportamiento de los datos persistentes.
Prueba de juego: los ajustes de comportamiento de los datos de persistencia se aplican al configurar una prueba de juego en el portal para creadores cuando se une un usuario para probar el juego, ya sea a través de un código de prueba de juego o un código de enlace privado. Los ajustes de comportamiento de los datos de persistencia solo se aplican la primera vez que el jugador se une. Cuando el jugador abandone y vuelva a unirse a la prueba de juego, sus datos se mantendrán en todas las sesiones y no se volverán a aplicar los ajustes de comportamiento de persistencia de datos. Para restablecer los datos persistentes, tendrás que crear un nuevo código de enlace de prueba de juego.
En el caso de las actualizaciones de islas que afectan a la forma en que se gestionan y actualizan los datos persistentes, recomendamos que realices pruebas en ambas situaciones, tanto al iniciar una sesión desde UEFN como una prueba de juego que utilice un código de enlace. Asegúrate de probar los cambios que realices en los datos persistentes tanto con datos en tiempo real como con nuevos datos de usuario simulados. Esto te ayudará a asegurarte de que las actualizaciones funcionan tanto para los jugadores actuales de la isla como para los nuevos.
Efectos de la publicación de nuevas versiones de tu isla
Una vez publicada tu isla, se crea un registro persistente para los jugadores cuando sus datos se almacenan en el weak_map. Estos datos se almacenarán y cargarán en cualquier visita posterior a tu isla.
Si se publican nuevas versiones de tu isla, los datos persistentes se fusionarán automáticamente con la nueva versión. Consulta Cómo modificar los datos existentes entre versiones publicadas de tu isla para más información.
Efectos de revertir una isla publicada
Si reviertes tu isla a una versión anterior a través del portal para creadores, se restablecerán los datos de persistencia de todos los usuarios.
Actualmente no existe ningún sistema para notificar a los jugadores que sus datos se han visto afectados por dicha acción.
Esto hará que se pierdan las actualizaciones recientes de los datos de los jugadores e incluso puede provocar que los datos de los jugadores se restablezcan por completo. Esto se activa aunque la reversión no incluya internamente cambios en la lógica que afectaran a los datos persistentes.
Debido a su impacto en los datos persistentes, recomendamos solo utilizar la función de reversión como último recurso.
Limitaciones
A continuación se indican limitaciones para trabajar con datos persistentes en Verse.
Tamaño máximo de objeto persistente
Hay un límite en la cantidad de datos que se pueden almacenar en un weak_map por jugador.
Un registro weak_map es la cantidad total de datos asociados a un único elemento weak_map. Un solo registro weak_map tiene un tamaño máximo de datos de 256 kilobytes (kB) por jugador.
Cuando se guarda un valor de `weak_map`, se calcula la cantidad total de memoria necesaria para guardar los datos.
A continuación se muestran algunos ejemplos de datos que superarían el límite de 256 kB:
Aproximadamente 24 000 valores
floatoint.Aproximadamente 200 000 caracteres de texto. Esto equivale a unas 60 páginas de texto en una novela normal.
Si intentas guardar datos de más de 256 kB para un registro de jugador, el proceso de guardado fallará y obtendrás un error en tiempo de ejecución de Verse.
Puedes evitar errores al guardar si utilizas la función auxiliar de Verse FitsInPlayerMap. La función FitsInPlayerMap toma una copia del registro que quieres guardar y comprueba su tamaño. Si el registro se puede guardar, la llamada a función se realizará correctamente; de lo contrario, si el registro es demasiado grande, fallará.
La función FitsInPlayerMap es especialmente útil cuando se trabaja con un array dinámico o map de datos y se le añaden nuevos elementos. Actualizar un int, float o logic que estaba previamente en el registro persistente no cambiará el tamaño del mismo.
Cantidad máxima de weak_maps de persistencia de los jugadores por isla
Una sola isla puede tener hasta cuatro variables persistentes, es decir, cuatro variables weak_map con player como tipo de clave. Este requisito lo aplica el compilador de Verse.
`weak_map` obligatorio con el tipo de clase
El valor de weak_map de al menos una variable persistente debe ser una clase si se ha alcanzado el límite máximo de variables persistentes. Esto sirve para garantizar que a las variables se les puedan añadir más datos más adelante y al mismo tiempo resolver la compatibilidad con versiones anteriores en publicaciones posteriores en la isla.