Guardar el progreso del jugador en un juego de Unity

22

Estoy haciendo un juego usando el motor de juego Unity. Quiero guardar el progreso del jugador, incluido el nivel, los puntos de experiencia, el personaje elegido, etc. Actualmente estoy usando las preferencias del jugador, pero quiero saber si esto funcionará también para los jugadores que ejecutarán este juego en sus dispositivos móviles (Android / iOS) como escritorios (OSX / PC)? Si no es así, ¿cómo debo guardar esta información? Quiero guardar automáticamente el progreso del jugador después de borrar cada etapa.

Shantanu Singh
fuente

Respuestas:

30

PlayerPrefs funcionará multiplataforma, pero no se recomienda para el progreso del juego guardar archivos porque es inseguro. Como archivo de texto sin formato, un jugador puede abrirlo fácilmente y cambiar el contenido para hacer trampa, o hacer que su juego se comporte de forma impredecible. Tampoco está garantizado quedarse.

PlayerPrefs está destinado a la información de preferencias no esenciales, como el mapeo de control o la configuración de música / sfx: cosas que el jugador puede cambiar libremente de todos modos, y que no fallarían terriblemente si usaran (en Windows, por ejemplo) un punto de restauración del sistema y pierdan parte de su información de registro. Si esto perdiera sus puntajes altos o el progreso de la campaña, ¡los jugadores estarían justificadamente molestos!

En cambio, se recomienda guardar el progreso del juego en su propio archivo (generalmente binario, posiblemente encriptado o firmado si desea que sea más difícil de modificar, pero vea el comentario de Philipp a continuación sobre esto).

Puede usar Application.persistentDataPath para obtener una ubicación de guardado confiable en cada plataforma. Esto normalmente se encuentra en una carpeta de datos de usuario que no se eliminará en casos como el ejemplo anterior.

Una vez que tenga una ruta para guardar, puede usar los métodos normales de C # IO para crear, escribir y leer su archivo. Los detalles variarán mucho según el formato y la estructura del archivo guardado, por lo que si tiene problemas, es mejor hacer una nueva pregunta que detalle qué está tratando de hacer y dónde está atascado.

DMGregory
fuente
30
En mi opinión, encriptar y firmar sus archivos de juegos guardados es solo serpiente. No es seguro porque tienes que almacenar claves y algoritmos en el ejecutable de tu juego donde un hacker experto pueda acceder a ellos. Tampoco tiene sentido. Cuando es un juego para un jugador: ¿por qué molestarse? Deje que el jugador disfrute el juego de la manera que quiera. Cuando se trata de un juego multijugador, debes guardar todo en el servidor donde esté a salvo de manipulaciones.
Philipp
55
@ SamedTarıkÇETİN Hay una distinción importante entre la ruta de datos (la ubicación donde está instalado el juego) y la ruta de datos persistentes (una ubicación confiable para guardar nuevos datos). En algunas plataformas, un juego integrado no puede escribir en la ruta de datos instalada, por lo que se recomienda guardar en la ubicación de ruta de datos persistente como regla general.
DMGregory
2
Si bien estoy de acuerdo con @Philipp en que el almacenamiento del lado del cliente nunca es realmente seguro, y que en muchos casos no necesitamos ser pesados ​​para asegurar los juegos de un solo jugador, la cantidad de seguridad u ofuscación para aplicar es, en última instancia, una opción cada creador tiene que hacer por sí mismos. Con esta respuesta, solo quiero darle al solicitante la información para que tome una decisión informada sobre lo que es adecuado para su juego.
DMGregory
1
Por un lado, estoy de acuerdo con @Philipp pero también he visto / trabajado con un archivo de salvar serializado que era completamente ilegible para trabajar en un editor de texto. Sí, probablemente podría haber descubierto cómo entrar y hacer algún cambio u otro, pero como el archivo parecía 2 megas de hexadecimal en bruto, habría sido una tarea difícil de resolver. En tales casos, solo las personas más acérrimas tratarían de desarmarlo y los resultados serían específicos para ese punto del juego (agregar una unidad más a la carga empuja todos los datos posteriores hacia abajo). Por otra parte, no estaba destinado a ser seguro.
Draco18s
2
@ShantanuSingh al no almacenarlos en PlayerPrefs. Ese tipo de información debe almacenarse en una base de datos remota y solicitarse al inicio de la aplicación. Para compatibilidad cuando una conexión a Internet no está disponible, recurra a un archivo guardado seguro local (es decir: encriptado). Los valores de la base de datos, cuando estén disponibles, deberían sobrescribir los locales. Puede haber complementos de compra en la aplicación que también manejan cosas de otras maneras, pero es probable que sea "requerido por Internet", pirateable (incluso un archivo cifrado no es 100% seguro), o como detalla este comentario.
Draco18s
-1

PlayerPrefs es una tienda K / V diseñada para "simplemente trabajar" sin importar para qué plataforma construyas. Digo que siga usándolo a menos que tenga una razón convincente para no hacerlo.

Tierra Verde
fuente
Creo que la pregunta era más o menos si hay razones convincentes para no usar PlayerPrefs (sí, las hay). Como tal, rechacé esta respuesta porque no responde la pregunta.
Peter - Unban Robert Harvey
-1

Entonces, ¿la mejor manera es ahorrar en el lado del servidor? Convierta toda la información necesaria para guardar en cadena json y almacénela en un servidor mysql como datos de cadena y, cuando sea necesario cargar, conectarse al servidor y restaurarlo.

creador
fuente
44
Esta no es una respuesta a la pregunta. Si tiene una pregunta, haga una nueva pregunta .
Sourav Paul