Verwenden von PlayerPrefs zum Lesen und Schreiben von Daten

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifizierungsumgebung

Fenster
  • Windows 11
Unity-Editor
  • 2021.3.3f1
Eingabesystem-Paket
  • 1.3.0

Voraussetzungen für diesen Tipp

Die folgenden Einstellungen wurden im Vorfeld als Prämisse für die Beschreibung dieses Tipps vorgenommen.

Zuerst

Wenn Sie Spiele gespielt haben, haben die meisten von Ihnen es erlebt. Wahrscheinlich haben Sie ein Spiel pausiert und Ihre Spieldaten gespeichert oder geladen, um es zu beenden.

Wenn Sie ein Spiel erstellen, müssen Sie normalerweise diese Speicher- und Ladefunktion erstellen, Optionen festlegen usw. Hier werden wir versuchen, dies auf einfachste PlayerPrefs Weise zu erreichen, um Daten zu speichern und zu laden.

Platzierung der Benutzeroberfläche

Hier werden wir versuchen, den Eingabeinhalt zu speichern oder zu lesen, indem wir die Eingabeelemente und Schaltflächen platzieren und auf die Schaltfläche klicken. Vorerst brauchst du nur mindestens zwei Buttons und ein Eingabefeld, also kannst du diese gerne platzieren.

Vorbereiten der UI-Verarbeitung

Lassen Sie uns zunächst die Schaltfläche "Speichern" implementieren. Wie man ein Button-Event erstellt, wird in den folgenden Tipps vorgestellt, daher werde ich nur die relevanten Teile auflisten.

Behalten Sie den Skriptnamen ButtonEvent als .

Das Skript sieht wie folgt aus:

using UnityEngine;
using UnityEngine.UI;

public class ButtonEvent : MonoBehaviour
{
  /// <summary>名前入力フィールド。</summary>
  [SerializeField] InputField InputFieldName;

  /// <summary>HP 入力フィールド。</summary>
  [SerializeField] InputField InputFieldHP;

  /// <summary>攻撃力入力フィールド。</summary>
  [SerializeField] InputField InputFieldAttack;

  /// <summary>お金入力フィールド。</summary>
  [SerializeField] InputField InputFieldMoney;

  /// <summary>
  /// 保存ボタンをクリックしたときの処理。
  /// </summary>
  public void OnClickSave()
  {
  }

  /// <summary>
  /// 読み込みボタンをクリックしたときの処理。
  /// </summary>
  public void OnClickLoad()
  {
  }
}

Da es notwendig ist, den eingegebenen Wert abzurufen oder festzulegen, bereiten Sie ihn als Feld vor. Fügen Sie auch die Methode ein, die aufgerufen wird, wenn Sie auf die einzelnen Schaltflächen klicken.

Hängen Sie Ihr EventSystem Skript an jedes Eingabefeld an und legen Sie es fest. Es kann ein beliebiges Objekt sein, das Sie anhängen möchten.

Legen Sie jede Methode fest, die aufgerufen werden soll, wenn auf die Schaltfläche geklickt wird.

Speichern Sie den Wert

Da die Methode nun aufgerufen wird, wenn OnClickSave auf die Schaltfläche "Speichern" geklickt wird, ist der Vorgang der Schaltfläche "Speichern" wie folgt.

/// <summary>
/// 保存ボタンをクリックしたときの処理。
/// </summary>
public void OnClickSave()
{
  // 各値を指定したキーに保存します
  PlayerPrefs.SetString("Name", InputFieldName.text);
  PlayerPrefs.SetString("HP", InputFieldHP.text);
  PlayerPrefs.SetString("Attack", InputFieldAttack.text);
  PlayerPrefs.SetString("Money", InputFieldMoney.text);

  // 設定したデータを確定して保存します
  PlayerPrefs.Save();
}

PlayerPrefs.SetString Die Methode wird auf einen Schlüssel und einen zu speichernden Wert festgelegt. Der Schlüssel wird beim Laden der gespeicherten Daten angegeben. SetString Hier rufen wir die Methode auf, weil der zu speichernde Wert ein String ist. int float Wenn Sie einen Wert eines anderen Typs speichern möchten SetInt , z. B. und , gibt es Methoden wie und SetFloat , also rufen Sie sie entsprechend dem Typ auf.

PlayerPrefs.Save Rufen Sie abschließend die Methode auf, um das Speichern zu bestätigen. Tatsächlich kann es auch dann gespeichert werden, wenn Sie diese Methode nicht aufrufen, aber es ist sicherer, sie aufzurufen.

Aber selbst wenn du das Spiel zu diesem Zeitpunkt startest, wird nur der Wert gespeichert, sodass du nicht weißt, ob er richtig gespeichert wurde. Wenn Sie den gespeicherten Speicherort überprüfen, können Sie die Daten sehen, aber ...

Abrufen eines gespeicherten Werts

Implementieren Sie als Nächstes den Prozess des Ladens der gespeicherten Daten. Die Verarbeitung des Buttons ist die gleiche wie beim Speichervorgang, daher wird hier nur der Code des Ladevorgangs beschrieben.

/// <summary>
/// 読み込みボタンをクリックしたときの処理。
/// </summary>
public void OnClickLoad()
{
  // 指定したキーから値を読み込みます
  InputFieldName.text = PlayerPrefs.GetString("Name");
  InputFieldHP.text = PlayerPrefs.GetString("HP");
  InputFieldAttack.text = PlayerPrefs.GetString("Attack");
  InputFieldMoney.text = PlayerPrefs.GetString("Money");
}

Verwenden Sie die Methode, um die gespeicherten Daten zu PlayerPrefs.GetString laden. Sie können den mit diesem Schlüssel gespeicherten Wert abrufen, indem Sie den Schlüssel angeben, der unter Speichern als Argument angegeben ist. Der Wert wird im Rückgabewert der Methode abgerufen.

Dies wird auf die gleiche Weise wie beim Speichern auch als String gespeichert, daher GetString rufen wir die Methode auf. int float Wenn Sie mit oder speichern, rufen Sie GetIntGetFloat die Methode auf.

Der abgerufene Wert wird im Eingabefeld wiedergegeben.

Sie können nun die Daten speichern und laden. Ich glaube nicht, dass es schwierige Elemente gibt.

Versuchen Sie, es zu verschieben

Ausführen, um einzugeben, zu speichern und zu laden. Die gespeicherten Daten bleiben erhalten und sollten auch dann geladen werden können, wenn Sie das Spiel beenden und erneut ausführen. Wenn Sie das folgende Muster bestätigen können, gibt es meiner Meinung nach kein Problem.

  1. Geben Sie einen Wert ein
  2. Klicken Sie auf die Schaltfläche Speichern
  3. Ändern Sie den eingegebenen Wert
  4. Klicken Sie auf die Schaltfläche Importieren, um zu bestätigen, dass der gespeicherte Wert wiederhergestellt wird.
  5. Beenden Sie das Spiel
  6. Starten Sie das Spiel erneut und klicken Sie auf die Schaltfläche Laden, um zu sehen, ob Sie den gespeicherten Wert abrufen können
  7. Geben Sie einen anderen Wert ein, speichern Sie ihn, und prüfen Sie, ob Sie ihn mit dem aktualisierten Wert lesen können

Speichern und Laden eines Datenblocks

In der Stichprobe wurden bisher nur wenige Parameter gespeichert. Wenn du ein Spiel erstellst, steigt die Anzahl der zu speichernden Parameter stetig an, und wenn du sie einzeln liest und schreibst, wird der Code enorm sein. Daher besteht die Theorie bei der Erstellung von Daten, die tatsächlich gespeichert werden sollen, darin, die zu speichernden Daten in einem zu kombinieren und dann alle auf einmal zu schreiben.

Erstellen Sie zunächst eine gespeicherte Datenstruktur als Klasse. Ziel ist es, Daten gleichzeitig lesen und schreiben zu können, aber auch die Daten zu klassifizieren, um dem Code den Zugriff auf jedes Datenelement zu erleichtern.

Im Folgenden findest du Beispiele für Speicherspielklassen: Es kann überall dort geschrieben werden, wo von anderem Code darauf verwiesen werden kann. Diese Klassenstruktur ist ein Beispiel, daher müssen Sie sie in einem echten Spiel für Ihr Spiel erstellen.

/// <summary>セーブデータクラス。</summary>
public class SaveData
{
  public List<Character> Characters;
  public long Money;
}

/// <summary>1キャラクターの情報。</summary>
[Serializable]
public class Character
{
  public string Name;
  public int HP;
  public int Attack;
}

Wenn Sie in der List diesmal verwendeten Unity-Standardfunktion Arrays definieren oder mehrere eindeutige Klassen haben, System.Serializable Wenn Sie kein Attribut hinzufügen, wird es nicht korrekt konvertiert, daher Character habe ich das Attribut auf die Serializable Klasse gesetzt.

Nachdem Sie die Klasse erstellt haben, erstellen Sie die zu speichernden Daten. Natürlich kannst du im Laufe des Spiels Instanzen dieser Klasse haben. Das hängt davon ab, wie das Spiel gemacht wird.

// 保存するデータ作成
var saveData = new SaveData
{
  Money = 10000,
  Characters = new List<Character>
  {
    new Character { Name= "レイシア", HP = 50, Attack = 40, },
    new Character { Name= "アイリ", HP = 56, Attack = 27, },
    new Character { Name= "ニール", HP = 72, Attack = 36, },
    new Character { Name= "トリー", HP = 61, Attack = 30, },
  },
};

Nachdem Sie die Daten in der Instanz der Klasse festgelegt JsonUtility.ToJson haben, konvertieren (serialisieren) Sie sie mit der Methode in eine JSON-Zeichenfolge. Da der Wert des Objekts eine einzelne "Zeichenfolge" namens JSON mit einer Datenstruktur ist, können allePlayerPrefs.SetString Daten mit einem einzigen Aufruf der Methode geschrieben werden.

// オブジェクトを JSON 文字列に変換します
var saveJson = JsonUtility.ToJson(saveData);

// データを保存します
PlayerPrefs.SetString("SaveData", saveJson);
PlayerPrefs.Save();

Da jedoch alle Daten in einem gesammelt werden, ist es nicht möglich, nur einen Teil davon zu speichern oder nur einen Teil davon zu lesen. Daher ist es vorzuziehen, sie zu einer Einheit zu machen, die leicht zusammenzufassen ist, z. B. indem sie als ein Objekt für einen Speicherdatensatz kombiniert wird.

Beim Lesen der gespeicherten Daten können Sie beim Speichern die umgekehrte Verarbeitung durchführen. Die zu lesenden Daten sind eine einzelne Zeichenfolge, aber der Inhalt ist JSON-formatierte Datenstrukturen, sodass JsonUtility.FromJson sie von Methoden in Klasseninstanzen konvertiert (deserialisiert) werden können. Da wir jedoch keine FromJson Informationen in der Zeichenfolge haben, in welche Klasse konvertiert werden soll, müssen wir den Typ beim Aufruf der Methode angeben.

// データを読み込みます
var loadJson = PlayerPrefs.GetString("SaveData");

// JSON 文字列からオブジェクトにデシリアライズします
var newData = JsonUtility.FromJson<SaveData>(loadJson);

Wenn Sie versuchen, es zu verschieben, können Sie sehen, dass es korrekt gespeichert ist und geladen werden kann.

Übrigens verwenden wir diesmal die Unity-Standardklassen JsonUtility , die jedoch möglicherweise keine Klassen mit komplexen Datenstrukturen konvertieren können, da sie nicht sehr funktional sind. In diesem Fall empfiehlt es sich, andere Bibliotheken zu verwenden.

Wo werden die Daten gespeichert?

PlayerPrefs Wenn Sie eine Klasse zum Speichern von Daten verwenden, hängt der Speicherort, an dem sie gespeichert werden, von der Plattform ab, auf der Sie ausgeführt werden. Bitte informieren Sie sich auf der offiziellen Seite unten, wo sie tatsächlich gespeichert sind.

In einigen Umgebungen, wie z. B. Windows, werden sie nicht in einer Datei, sondern in Systemeinstellungen wie der Registrierung gespeichert. Da es sich nicht um eine Datei handelt, eignet sie sich nicht zum Speichern gespeicherter Daten in , z. B. wenn die Speicherdaten sehr groß sind oder PlayerPrefs Sie die Speicherdaten mit einer anderen Umgebung synchronisieren möchten. Umgekehrt, wenn die zu speichernden Daten die Größe der Optionsebene haben oder wenn es sich um ein eigenständiges Spiel handelt, das nur in der Umgebung abgeschlossen wird, in der es ausgeführt wird, denke ich, dass es möglich ist PlayerPrefs , die Daten in zu speichern.

Darüber hinaus kann der Pfad des gespeicherten Speicherorts durch die Einstellungen "Firmenname" und "Produktname" beeinflusst werden. Wenn Sie Ihr Spiel veröffentlichen möchten, müssen Sie diese Werte lange im Voraus festlegen und dürfen sie nach der Veröffentlichung Ihres Spiels nicht ändern.

Informationen zur Datenverschlüsselung

Gespeicherte Daten werden nicht automatisch verschlüsselt. Wenn die Fähigkeiten des Spielers so gespeichert werden, wie sie sind, kann der Benutzer die Werte frei umschreiben, was sich auf das Spiel auswirkt.

Müssen Sie verschlüsseln, und wenn ja, welche Stärke ist erforderlich, und wie gehen Sie mit dem Verschlüsselungsschlüssel um? Die zu beachtenden Dinge variieren von Spiel zu Spiel.

Ich werde die Verschlüsselungsmethode hier nicht erklären, aber wenn Sie es im Internet nachschlagen, ist es eine wichtige Sprache und ein wichtiges Werkzeug, daher denke ich, dass es verschiedene Methoden gibt. Wenn Sie die Bedeutung des gespeicherten Inhalts nicht verstehen, selbst wenn Sie die Datei öffnen, und wenn Sie die Daten schlecht manipulieren, können Sie die gespeicherten Daten vorerst nicht verwenden, denke ich, dass es einen gewissen Betrugsbekämpfungseffekt geben wird.