Speichern des Spielfortschritts in einem Unity-Spiel

22

Ich mache ein Spiel mit der Unity-Game-Engine. Ich möchte den Fortschritt des Spielers mit Level, Erfahrungspunkten, ausgewähltem Charakter usw. speichern . Derzeit verwende ich Playerprefs , möchte aber wissen, ob dies auch für Gamer funktioniert, die dieses Spiel auf ihren Mobilgeräten (Android / iOS) ausführen als Desktops (OSX / PCs)? Wenn nicht, wie soll ich diese Informationen speichern? Ich möchte den Fortschritt des Spielers nach dem Beenden jeder Stufe automatisch speichern.

Shantanu Singh
quelle

Antworten:

30

PlayerPrefs funktioniert plattformübergreifend, es wird jedoch nicht empfohlen, Dateien beim Speichern des Spielfortschritts zu speichern, da dies unsicher ist. Als Klartext-Datei kann ein Spieler sie einfach öffnen und den Inhalt so ändern, dass er schummelt oder dass sich Ihr Spiel unvorhersehbar verhält. Es ist auch nicht garantiert, um zu bleiben.

PlayerPrefs ist für nicht unbedingt erforderliche Präferenzinformationen wie Steuerelementzuordnungen oder Musik- / Sfx-Einstellungen vorgesehen - Dinge, die der Player ohnehin frei ändern kann und die er nicht verpassen würde, wenn er (zum Beispiel unter Windows) einen Systemwiederherstellungspunkt verwenden und verlieren würde einige ihrer Registrierungsinformationen. Wenn dies ihre Highscores oder Kampagnenfortschritte verlieren würde, wären die Spieler zu Recht verärgert!

Stattdessen wird empfohlen, den Spielfortschritt in einer eigenen Datei zu speichern (normalerweise binär, möglicherweise verschlüsselt oder signiert, wenn Sie das Ändern erschweren möchten, aber siehe Philipps Kommentar unten).

Mit Application.persistentDataPath können Sie auf jeder Plattform einen zuverlässigen Speicherort ermitteln. Dies befindet sich normalerweise in einem Benutzerdatenordner, der in Fällen wie dem obigen Beispiel nicht gelöscht wird.

Sobald Sie einen Pfad zum Speichern festgelegt haben, können Sie Ihre Datei mit den normalen C # IO-Methoden erstellen, schreiben und lesen. Die Details variieren stark je nach Format und Struktur Ihrer Sicherungsdatei. Wenn Sie also auf Probleme stoßen, sollten Sie eine neue Frage stellen, die genau beschreibt, was Sie versuchen und wo Sie stecken bleiben.

DMGregory
quelle
30
Meiner Meinung nach ist das Verschlüsseln und Signieren Ihrer Spielstand-Dateien nur Schlangenöl. Es ist nicht sicher, da Sie Schlüssel und Algorithmen in der ausführbaren Datei Ihres Spiels speichern müssen, auf die ein erfahrener Hacker zugreifen kann. Es ist auch sinnlos. Wenn es ein Einzelspielerspiel ist: Warum sich die Mühe machen? Lassen Sie den Spieler das Spiel so genießen, wie er es möchte. Wenn es sich um ein Multiplayer-Spiel handelt, sollten Sie lieber alles auf dem Server speichern, auf dem es manipulationssicher ist.
Philipp
5
@ SamedTarıkÇETİN Es gibt einen wichtigen Unterschied zwischen dem Datenpfad (dem Ort, an dem Ihr Spiel installiert ist) und dem dauerhaften Datenpfad (einem zuverlässigen Ort zum Speichern neuer Daten). Auf einigen Plattformen kann ein erstelltes Spiel nicht in den installierten Datenpfad schreiben. Das Speichern im permanenten Datenpfad wird daher in der Regel empfohlen.
DMGregory
2
Ich bin mit @Philipp einverstanden, dass clientseitiger Speicher niemals wirklich sicher ist und dass wir in vielen Fällen bei der Sicherung von Einzelspielerspielen nicht hartnäckig sein müssen. Letztendlich ist es jedoch eine Entscheidung, wie viel Sicherheit oder Verschleierung angewendet werden soll Jeder Schöpfer muss für sich selbst machen. Mit dieser Antwort möchte ich dem Fragesteller nur die Informationen geben, um eine fundierte Auswahl darüber zu treffen, was für sein Spiel geeignet ist.
DMGregory
1
Einerseits stimme ich @Philipp zu, aber ich habe auch eine serialisierte Sicherungsdatei gesehen / bearbeitet, mit der in einem Texteditor nicht mehr gearbeitet werden konnte. Ja, ich hätte wahrscheinlich herausfinden können, wie man Änderungen vornimmt, aber da die Datei wie 2 Megabyte Hexadezimal aussah, wäre es ziemlich mühsam gewesen, dies herauszufinden. In solchen Fällen würden nur die eingefleischten Leute versuchen, es zu zerlegen, und die Ergebnisse wären spezifisch für diesen Punkt im Spiel (das Hinzufügen einer weiteren Einheit zum Speichern drückt alle nachfolgenden Daten nach unten). Dann wieder, es war nicht beabsichtigt , sicher zu sein.
Draco18s
2
@ ShantanuSingh, indem Sie sie nicht in PlayerPrefs speichern. Diese Informationen sollten in einer entfernten Datenbank gespeichert und beim Start der App angefordert werden. Um die Kompatibilität zu gewährleisten, wenn keine Internetverbindung verfügbar ist, greifen Sie auf eine lokal gespeicherte sichere Datei zurück (dh verschlüsselt). Die verfügbaren Datenbankwerte sollten die lokalen Werte überschreiben. Es kann In-App-Kauf-Plugins geben, die die Dinge auch auf andere Weise handhaben, aber es ist wahrscheinlich entweder "Internet erforderlich", hackbar (selbst eine verschlüsselte Datei ist nicht 100% sicher) oder wie in diesem Kommentar beschrieben.
Draco18s
-1

PlayerPrefs ist ein K / V-Store, der darauf ausgelegt ist, "einfach zu funktionieren", unabhängig davon, für welche Plattform Sie ihn erstellen. Ich sage, benutze es einfach weiter, es sei denn, du hast einen zwingenden Grund, es nicht zu tun.

Grönland
quelle
Ich denke, die Frage war ziemlich, ob es zwingende Gründe gibt, PlayerPrefs nicht zu verwenden (ja, es gibt). Als solches habe ich diese Antwort abgelehnt, weil sie die Frage nicht beantwortet.
Peter - Unban Robert Harvey
-1

So ist der beste Weg, Server-Seite zu sparen? Konvertieren Sie alle gespeicherten Daten in eine JSON-Zeichenfolge und speichern Sie sie auf einem eigenen MySQL-Server als Zeichenfolgendaten.

Schöpfer
quelle
4
Dies ist keine Antwort auf die Frage. Wenn Sie eine Frage haben, stellen Sie diese als neue Frage .
Sourav Paul