Utilitzar PlayerPrefs per llegir i escriure dades
Entorn de verificació
- Windows
-
- Finestres 11
- Editor d'unitat
-
- 2021.3.3f1
- Paquet del sistema d'entrada
-
- 1.3.0
Requisits previs per a aquest consell
La configuració següent s'ha fet amb antelació com a premissa per a la descripció d'aquest consell.
Al principi
Si heu jugat, la majoria ho heu experimentat. És probable que hagis posat en pausa un joc i hagis desat o carregat les dades de reproducció per deixar-les anar-hi.
Quan creeu un joc, normalment heu de crear aquesta funció de desar i carregar, establir opcions, etc.
Aquí, intentarem aconseguir-ho utilitzant la manera més PlayerPrefs
senzilla d'emmagatzemar i carregar dades.
Col·locació de la interfície d'usuari
Aquí, intentarem guardar o llegir el contingut d'entrada col·locant els elements i botons d'entrada i fent clic al botó. De moment, només necessiteu almenys dos botons i un camp d'entrada, així que no dubteu a col·locar-los.
Preparació per al processament de la interfície d'usuari
En primer lloc, implementem el botó Desa. Com crear un esdeveniment de botó s'introdueix en els consells següents, de manera que només enumeraré les parts rellevants.
Deixeu el nom ButtonEvent
de l'script com a .
El guió té aquest aspecte:
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()
{
}
}
Com que cal obtenir o establir el valor introduït, prepareu-lo com a camp. A més, incloeu el mètode que es cridarà quan feu clic a cada botó.
Adjunteu l'script i definiu cada camp d'entrada EventSystem
.
Pot ser qualsevol objecte que vulgueu adjuntar.
Definiu cada mètode perquè es cridi quan es faci clic al botó.
Desa el valor
Ara que el mètode s'anomena quan OnClickSave
es fa clic al botó de desar, el procés del botó de desar és el següent.
<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
El mètode s'estableix en una clau i un valor que s'ha de desar. La clau s'especifica en carregar les dades desades.
SetString
Aquí estem cridant al mètode perquè el valor a emmagatzemar és una cadena.
int
float
Si voleu desar SetInt
un valor d'un altre tipus, com ara i , hi ha mètodes com i SetFloat
, així que anomeneu-los segons el tipus.
PlayerPrefs.Save
Finalment, truqueu al mètode per confirmar l'estalvi. En realitat, es pot desar fins i tot si no truqueu a aquest mètode, però és més segur anomenar-lo.
Tanmateix, fins i tot si executeu el joc en aquest moment, només desarà el valor, de manera que no sabreu si s'ha desat correctament. Si comproveu la ubicació desada, podeu veure les dades, però ...
Obtenir un valor desat
A continuació, implementeu el procés de càrrega de les dades desades. El processament del botó és el mateix que el procés de desar, de manera que aquí només es descriu el codi del procés de càrrega.
<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");
}
Utilitzeu el mètode per PlayerPrefs.GetString
carregar les dades desades.
Podeu obtenir el valor desat amb aquesta clau especificant la clau especificada a Desa com a argument. El valor es recupera en el valor de retorn del mètode.
Això també es guarda com una cadena de la mateixa manera que en desar, per la qual cosa GetString
anomenem el mètode.
int
float
Si esteu GetInt
GetFloat
estalviant amb o , truqueu al mètode.
El valor recuperat es reflecteix al camp d'entrada.
Ara podeu desar i carregar les dades. No crec que hi hagi elements difícils.
Proveu de moure'l
Corre per entrar, desar i carregar. Les dades guardades es mantenen i s'haurien de poder carregar fins i tot si sortiu i torneu a executar el joc. Si pots confirmar el següent patró, crec que no hi ha cap problema.
- Introduïu un valor
- Fes clic al botó Desar
- Canviar el valor que has introduït
- Feu clic al botó Importa per confirmar que torna al valor desat.
- Sortir del joc
- Torneu a executar el joc i feu clic al botó de càrrega per veure si podeu recuperar el valor desat
- Introduïu un valor diferent, deseu-lo i comproveu si podeu llegir-lo igual amb el valor actualitzat
Desar i carregar un fragment de dades
En la mostra fins ara, només s'han guardat alguns paràmetres. A mesura que realitzeu un joc, el nombre de paràmetres a desar augmentarà constantment i, si els llegiu i escriviu un per un, el codi serà enorme. Per tant, quan es creen dades per guardar-les realment, la teoria és combinar les dades que s'han de guardar en una de sola i després escriure-les totes alhora.
En primer lloc, creeu una estructura de dades desada com a classe. L'objectiu és poder llegir i escriure dades alhora, però també classificar les dades per facilitar que el codi accedeixi a cada dada.
Els següents són exemples de classes de joc de guardar: Es pot escriure en qualsevol lloc, es pot referenciar des d'un altre codi. Aquesta estructura de classes és una mostra, de manera que en un joc real cal crear-la per al vostre joc.
<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;
}
En la List
funció estàndard Unity utilitzada aquesta vegada, si definiu matrius o per tenir múltiples classes úniques,
System.Serializable
Si no afegiu un atribut, no es convertirà correctament, així que Character
estableixo l'atribut a la Serializable
classe.
Després de crear la classe, crea les dades per desar-les. Per descomptat, podeu tenir instàncies d'aquesta classe durant tot el joc. Això depèn de com es faci el joc.
// 保存するデータ作成
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, },
},
};
Després d'establir JsonUtility.ToJson
les dades a la instància de la classe, convertiu-les (serialitzeu-les) a una cadena JSON amb el mètode.
Com que el valor de l'objecte és una sola "cadena" anomenada JSON amb una estructura de dades, totesPlayerPrefs.SetString
les dades es poden escriure amb una sola crida al mètode.
// オブジェクトを JSON 文字列に変換します
var saveJson = JsonUtility.ToJson(saveData);
// データを保存します
PlayerPrefs.SetString("SaveData", saveJson);
PlayerPrefs.Save();
Tanmateix, com que totes les dades es recullen en una, no és possible guardar-ne només una part ni llegir-ne només una part. Per tant, és preferible convertir-la en una unitat que sigui fàcil de resumir, com combinar-la com un sol objecte per guardar dades.
En llegir les dades guardades, podeu fer el processament invers en desar.
Les dades a llegir són una sola cadena, però el contingut són estructures de dades amb format JSON, de manera que JsonUtility.FromJson
es poden convertir (deserialitzar) en instàncies de classe mitjançant mètodes.
No obstant això, com que no FromJson
tenim informació a la cadena a quina classe convertir, hem d'especificar el tipus quan cridem al mètode.
// データを読み込みます
var loadJson = PlayerPrefs.GetString("SaveData");
// JSON 文字列からオブジェクトにデシリアライズします
var newData = JsonUtility.FromJson<SaveData>(loadJson);
Si intentes moure'l, podràs veure que es guarda correctament i es pot carregar.
Per cert, aquesta vegada estem utilitzant les classes estàndard JsonUtility
Unity, però és possible que no puguin convertir classes amb estructures de dades complexes perquè no són molt funcionals.
En aquest cas, es recomana utilitzar altres biblioteques.
On s'emmagatzemen les dades?
PlayerPrefs
Quan utilitzeu una classe per emmagatzemar dades, la ubicació on es desen depèn de la plataforma en què esteu executant.
Consulteu la pàgina oficial següent per saber on s'emmagatzema realment.
- ReproductorPrefs
- 【Unitat】 Ubicació de les dades emmagatzemades a PlayerPrefs a WebGL a Windows (IndexedDB)
En alguns entorns, com ara Windows, no s'emmagatzemen en un fitxer, sinó en paràmetres del sistema, com ara el registre.
Com que no és un fitxer, no és adequat per guardar les dades guardades a , per exemple, si les dades guardades són molt grans o PlayerPrefs
voleu sincronitzar les dades guardades amb un altre entorn.
Per contra, si les dades a guardar són de la mida del nivell d'opció, o si es tracta d'un joc independent que es completa només en l'entorn en què s'està executant, crec que és PlayerPrefs
possible guardar les dades en .
A més, el camí de la ubicació desada es pot veure afectat per la configuració "Nom de l'empresa" i "NomProducte". Si voleu publicar el vostre joc, heu de decidir aquests valors amb molta antelació i no canviar-los un cop publiqueu el joc.
Sobre l'encriptació de dades
Les dades emmagatzemades no s'encripten automàticament. Si les habilitats del jugador es guarden tal com són, l'usuari reescriurà lliurement els valors, cosa que afectarà el joc.
Necessiteu xifrar i, si és així, quin nivell de força es requereix i com gestioneu la clau de xifratge? Les coses a tenir en compte varien d'un joc a un altre.
No explicaré aquí el mètode de xifratge, però si el busqueu a Internet, és un llenguatge i una eina importants, així que crec que hi ha diversos mètodes. De moment, si no enteneu el significat dels continguts emmagatzemats encara que obriu l'arxiu, i si manipuleu malament les dades, no podreu utilitzar les dades guardades, crec que hi haurà algun efecte antifrau.