Utiliser PlayerPrefs pour lire et écrire des données
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 GetInt
GetFloat
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.
- Entrez une valeur
- Cliquez sur le bouton Enregistrer
- Modifier la valeur que vous avez entrée
- Cliquez sur le bouton d’importation pour confirmer qu’il revient à la valeur enregistrée.
- Quittez le jeu
- Relancez le jeu et cliquez sur le bouton de chargement pour voir si vous pouvez rappeler la valeur enregistrée
- 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é.
- PlayerPrefs
- 【Unité】 Emplacement des données stockées dans PlayerPrefs dans WebGL sous Windows (IndexedDB)
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.