Utiliser PlayerPrefs pour lire et écrire des données

Page mise à jour :
Date de création de la page :

Environnement de vérification

Windows
  • Fenêtres 11
Éditeur Unity
  • 2021.3.3f1
Package système d’entrée
  • 1.3.0

Conditions préalables à cette astuce

Les paramètres suivants ont été définis à l’avance comme prémisse pour la description de cette astuce.

Au début

Si vous avez joué à des jeux, la plupart d’entre vous en ont fait l’expérience. Vous avez probablement mis une partie en pause et enregistré ou chargé vos données de jeu pour les quitter.

Lors de la création d’un jeu, vous devez généralement créer cette fonction de sauvegarde et de chargement, définir des options, etc. Ici, nous allons essayer d’y parvenir en utilisant le moyen le plus PlayerPrefs simple de stocker et de charger des données.

Placement de l’interface utilisateur

Ici, nous allons essayer d’enregistrer ou de lire le contenu de l’entrée en plaçant les éléments d’entrée et les boutons et en cliquant sur le bouton. Pour le moment, vous n’avez besoin que d’au moins deux boutons et un champ de saisie, alors n’hésitez pas à les placer.

Préparation au traitement de l’interface utilisateur

Tout d’abord, implémentons le bouton d’enregistrement. Comment créer un événement de bouton est présenté dans les conseils suivants, je ne vais donc énumérer que les parties pertinentes.

Conservez le nom ButtonEvent du script sous la forme .

Le script ressemble à ceci :

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()
  {
  }
}

Comme il est nécessaire d’obtenir ou de définir la valeur saisie, préparez-la en tant que champ. Incluez également la méthode qui sera appelée lorsque vous cliquerez sur chaque bouton.

Joignez votre EventSystem script à chaque champ de saisie et définissez-le. Il peut s’agir de n’importe quel objet que vous souhaitez attacher.

Définissez chaque méthode à appeler lorsque vous cliquez sur le bouton.

Enregistrer la valeur

Maintenant que la méthode est appelée lorsque OnClickSave vous cliquez sur le bouton d’enregistrement, le processus du bouton d’enregistrement est le suivant.

/// <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 La méthode est définie sur une clé et une valeur à enregistrer. La clé est spécifiée lors du chargement des données enregistrées. SetString Ici, nous appelons la méthode car la valeur à stocker est une chaîne. int float Si vous souhaitez SetInt enregistrer une valeur d’un autre type, telle que et , il existe des méthodes telles que et SetFloat , appelez-les en fonction du type.

PlayerPrefs.Save Enfin, appelez la méthode pour confirmer l’enregistrement. En fait, il peut être enregistré même si vous n’appelez pas cette méthode, mais il est plus sûr de l’appeler.

Cependant, même si vous exécutez le jeu à ce stade, il n’enregistrera que la valeur, vous ne saurez donc pas s’il a été enregistré correctement. Si vous vérifiez l’emplacement enregistré, vous pouvez voir les données, mais ...

Obtenir une valeur sauvegardée

Ensuite, implémentez le processus de chargement des données enregistrées. Le traitement du bouton est le même que le processus de sauvegarde, donc seul le code du processus de chargement est décrit ici.

/// <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");
}

Utilisez la méthode pour PlayerPrefs.GetString charger les données enregistrées. Vous pouvez obtenir la valeur enregistrée avec cette clé en spécifiant la clé spécifiée dans Enregistrer en tant qu’argument. La valeur est récupérée dans la valeur de retour de la méthode.

Ceci est également enregistré sous forme de chaîne de la même manière que lors de l’enregistrement, nous appelons donc GetString la méthode. int float Si vous GetIntGetFloat enregistrez avec ou , appelez la méthode.

La valeur récupérée est reflétée dans le champ de saisie.

Vous pouvez maintenant enregistrer et charger les données. Je ne pense pas qu’il y ait d’éléments difficiles.

Essayez de le déplacer

Exécuter pour entrer, enregistrer et charger. Les données sauvegardées sont conservées et devraient pouvoir être chargées même si vous quittez et relancez le jeu. Si vous pouvez confirmer le schéma suivant, je pense qu’il n’y a pas de problème.

  1. Entrez une valeur
  2. Cliquez sur le bouton Enregistrer
  3. Modifier la valeur que vous avez entrée
  4. Cliquez sur le bouton d’importation pour confirmer qu’il revient à la valeur enregistrée.
  5. Quittez le jeu
  6. Relancez le jeu et cliquez sur le bouton de chargement pour voir si vous pouvez rappeler la valeur enregistrée
  7. Entrez une valeur différente, enregistrez-la et vérifiez si vous pouvez lire la même chose avec la valeur mise à jour

Enregistrer et charger un morceau de données

Dans l’exemple jusqu’à présent, seuls quelques paramètres ont été enregistrés. Au fur et à mesure que vous créez un jeu, le nombre de paramètres à sauvegarder augmentera régulièrement, et si vous les lisez et les écrivez un par un, le code sera énorme. Par conséquent, lors de la création de données à sauvegarder, la théorie consiste à combiner les données à enregistrer en une seule, puis à les écrire toutes en même temps.

Tout d’abord, créez une structure de données de sauvegarde en tant que classe. L’objectif est de pouvoir lire et écrire des données à la fois, mais aussi de classer les données pour faciliter l’accès du code à chaque donnée.

Voici des exemples de classes de sauvegarde : Il peut être écrit partout où il peut être référencé à partir d’un autre code. Cette structure de classe est un exemple, donc dans un jeu réel, vous devez la créer pour votre jeu.

/// <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;
}

Dans la List fonction standard Unity utilisée cette fois, si vous définissez des tableaux ou si vous avez plusieurs classes uniques, System.Serializable Si vous n’ajoutez pas d’attribut, il ne sera pas converti correctement, j’ai donc Character défini l’attribut sur la Serializable classe.

Après avoir créé la classe, créez les données à enregistrer. Bien sûr, vous pouvez avoir des instances de cette classe tout au long du jeu. Cela dépend de la façon dont le jeu est créé.

// 保存するデータ作成
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, },
  },
};

Après avoir défini JsonUtility.ToJson les données dans l’instance de la classe, convertissez-les (sérialisez) en chaîne JSON avec la méthode. Étant donné que la valeur de l’objet est une seule « chaîne » appelée JSON avec une structure de données, toutes lesPlayerPrefs.SetString données peuvent être écrites avec un seul appel à la méthode.

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

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

Cependant, comme toutes les données sont collectées en une seule, il n’est pas possible d’en sauvegarder seulement une partie ou de n’en lire qu’une partie. Par conséquent, il est préférable d’en faire une unité facile à résumer, par exemple en la combinant comme un objet pour une donnée de sauvegarde.

Lors de la lecture des données enregistrées, vous pouvez effectuer le traitement inverse lors de l’enregistrement. Les données à lire sont une chaîne unique, mais le contenu est des structures de données au format JSON, de sorte JsonUtility.FromJson qu’elles peuvent être converties (désérialisées) en instances de classe par des méthodes. Toutefois, comme nous n’avons pas FromJson d’informations dans la chaîne vers quelle classe effectuer la conversion, nous devons spécifier le type lors de l’appel de la méthode.

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

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

Si vous essayez de le déplacer, vous pouvez voir qu’il est enregistré correctement et peut être chargé.

Soit dit en passant, nous utilisons les classes standard JsonUtility Unity cette fois-ci, mais elles peuvent ne pas être en mesure de convertir des classes avec des structures de données complexes car elles ne sont pas très fonctionnelles. Dans ce cas, il est recommandé d’utiliser d’autres bibliothèques.

Où sont stockées les données ?

PlayerPrefs Lorsque vous utilisez une classe pour stocker des données, l’emplacement où elles sont enregistrées dépend de la plate-forme sur laquelle vous exécutez. Veuillez vous référer à la page officielle ci-dessous pour savoir où il est stocké.

Dans certains environnements, tels que Windows, ils ne sont pas stockés dans un fichier, mais dans des paramètres système tels que le Registre. Comme il ne s’agit pas d’un fichier, il ne convient pas à l’enregistrement des données enregistrées dans , par exemple, si les données de sauvegarde sont très volumineuses ou PlayerPrefs si vous souhaitez synchroniser les données de sauvegarde avec un autre environnement. Inversement, si les données à sauvegarder sont de la taille du niveau d’option, ou s’il s’agit d’un jeu autonome qui n’est terminé que dans l’environnement dans lequel il est exécuté, je pense qu’il est PlayerPrefs possible d’enregistrer les données dans .

En outre, le chemin d’accès de l’emplacement enregistré peut être affecté par les paramètres « CompanyName » et « ProductName ». Si vous souhaitez publier votre jeu, vous devez décider de ces valeurs bien à l’avance et ne pas les modifier une fois que vous avez publié votre jeu.

À propos du chiffrement des données

Les données stockées ne sont pas automatiquement cryptées. Si les capacités du joueur sont sauvegardées telles quelles, l’utilisateur réécrira librement les valeurs, ce qui affectera le jeu.

Avez-vous besoin de chiffrer et, dans l’affirmative, quel niveau de force est requis et comment gérez-vous la clé de chiffrement ? Les choses à considérer varient d’un jeu à l’autre.

Je ne vais pas expliquer la méthode de cryptage ici, mais si vous la cherchez sur Internet, c’est un langage et un outil majeurs, donc je pense qu’il existe différentes méthodes. Pour le moment, si vous ne comprenez pas la signification du contenu stocké même si vous ouvrez le fichier, et si vous falsifiez mal les données, vous ne pourrez pas utiliser les données sauvegardées, je pense qu’il y aura un effet anti-fraude.