Utilizați PlayerPrefs pentru a citi și scrie date

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2021.3.3F1
Pachet sistem de intrare
  • 1.3.0

Cerințe preliminare pentru acest sfat

Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.

La început

Dacă ați jucat jocuri, majoritatea dintre voi le-ați experimentat. Probabil că ați întrerupt un joc și ați salvat sau încărcat datele de joc pentru a le omite.

Când creați un joc, de obicei trebuie să creați această funcție de salvare și încărcare, să setați opțiunile etc. Aici, vom încerca să realizăm acest lucru folosind cel mai simplu PlayerPrefs mod de a stoca și încărca date.

Plasarea UI

Aici, vom încerca să salvăm sau să citim conținutul de intrare plasând elementele și butoanele de intrare și făcând clic pe buton. Pentru moment, aveți nevoie doar de cel puțin două butoane și un câmp de introducere, așa că nu ezitați să le plasați.

Pregătirea pentru procesarea interfeței de utilizare

Mai întâi, să implementăm butonul de salvare. Modul de creare a unui eveniment de buton este introdus în următoarele sfaturi, așa că voi enumera doar părțile relevante.

Lăsați numele ButtonEvent scriptului ca .

Scenariul arată astfel:

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

Deoarece este necesar să obțineți sau să setați valoarea introdusă, pregătiți-o ca un câmp. De asemenea, includeți metoda care va fi apelată atunci când faceți clic pe fiecare buton.

Atașați EventSystem scriptul și setați fiecare câmp de introducere. Poate fi orice obiect pe care doriți să îl atașați.

Setați fiecare metodă să fie apelată atunci când se face clic pe buton.

Salvați valoarea

Acum că metoda este apelată când OnClickSave se face clic pe butonul de salvare, procesul butonului de salvare este următorul.

/// <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 Metoda este setată la o cheie și o valoare de salvat. Cheia este specificată la încărcarea datelor salvate. SetString Aici numim metoda deoarece valoarea care trebuie stocată este un șir. int float Dacă doriți să SetInt salvați o valoare de alt tip, cum ar fi și , există metode precum și SetFloat , deci apelați-le în funcție de tip.

PlayerPrefs.Save În cele din urmă, apelați metoda pentru a confirma salvarea. De fapt, poate fi salvat chiar dacă nu apelați această metodă, dar este mai sigur să o apelați.

Cu toate acestea, chiar dacă rulați jocul în acest moment, acesta va salva doar valoarea, deci nu veți ști dacă a fost salvat corect. Dacă verificați locația salvată, puteți vedea datele, dar ...

Obțineți o valoare salvată

Apoi, implementați procesul de încărcare a datelor salvate. Procesarea butonului este aceeași cu procesul de salvare, deci numai codul procesului de încărcare este descris aici.

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

Utilizați metoda pentru a PlayerPrefs.GetString încărca datele salvate. Puteți obține valoarea salvată cu acea cheie specificând cheia specificată în Salvare ca argument. Valoarea este preluată în valoarea returnată a metodei.

Acest lucru este, de asemenea, salvat ca un șir în același mod ca și la salvare, așa că GetString numim metoda. int float Dacă economisiți cu sau , apelați GetIntGetFloat metoda.

Valoarea recuperată este reflectată în câmpul de introducere.

Acum puteți salva și încărca datele. Nu cred că există elemente dificile.

Încercați să o mutați

Rulați pentru a intra, salva și încărca. Datele salvate sunt persistente și ar trebui să poată fi încărcate chiar dacă ieșiți și rulați din nou jocul. Dacă puteți confirma următorul model, cred că nu este nicio problemă.

  1. Introduceți o valoare
  2. Faceți clic pe butonul Salvează
  3. Modificarea valorii introduse
  4. Faceți clic pe butonul de import pentru a confirma că revine la valoarea salvată.
  5. Ieșiți din joc
  6. Rulați din nou jocul și faceți clic pe butonul de încărcare pentru a vedea dacă vă puteți aminti valoarea salvată
  7. Introduceți o altă valoare, salvați-o și verificați dacă puteți citi același lucru cu valoarea actualizată

Salvați și încărcați o bucată de date

În eșantionul de până acum, au fost salvați doar câțiva parametri. Pe măsură ce faceți un joc, numărul de parametri care trebuie salvați va crește constant, iar dacă îi citiți și îi scrieți unul câte unul, codul va fi enorm. Prin urmare, atunci când creați date pentru a fi salvate efectiv, teoria este de a combina datele care urmează să fie salvate într-una și apoi să le scrieți dintr-o dată.

Mai întâi, creați o structură de date de salvare ca clasă. Scopul este de a putea citi și scrie date simultan, dar și de a clasifica datele pentru a facilita accesul codului la fiecare bucată de date.

Următoarele sunt exemple de clase de joc de salvare: Poate fi scris oriunde poate fi referit din alt cod. Această structură de clasă este un eșantion, deci într-un joc real trebuie să-l creați pentru jocul dvs.

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

List În funcția standard Unity utilizată de această dată, dacă definiți matrice sau aveți mai multe clase unice, System.Serializable Dacă nu adăugați un atribut, acesta nu va fi convertit corect, așa că Character am setat atributul claseiSerializable.

După ce creați clasa, creați datele de salvat. Desigur, puteți avea instanțe din această clasă pe tot parcursul jocului. Acest lucru depinde de modul în care se face jocul.

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

După setarea JsonUtility.ToJson datelor în instanța clasei, convertiți-le (serializați-le) într-un șir JSON cu metoda. Deoarece valoarea obiectului este un singur "șir" numit JSON cu o structură de date, toatePlayerPrefs.SetString datele pot fi scrise cu un singur apel la metodă.

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

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

Cu toate acestea, deoarece toate datele sunt colectate într-una, nu este posibil să salvați doar o parte din acestea sau să citiți doar o parte din acestea. Prin urmare, este preferabil să o faceți o unitate ușor de rezumat, cum ar fi combinarea acesteia ca un obiect pentru o salvare a datelor.

Când citiți datele salvate, puteți face procesarea inversă la salvare. Datele de citit sunt un singur șir, dar conținutul este structurat de date formatat JSON, astfel încât JsonUtility.FromJson acestea pot fi convertite (deserializate) în instanțe de clasă prin metode. Cu toate acestea, deoarece nu FromJson avem informații în șir la ce clasă să convertim, trebuie să specificăm tipul atunci când apelăm metoda.

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

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

Dacă încercați să o mutați, puteți vedea că este salvată corect și poate fi încărcată.

Apropo, folosim clasele standard JsonUtility Unity de data aceasta, dar este posibil ca acestea să nu poată converti clase cu structuri de date complexe, deoarece nu sunt foarte funcționale. În acest caz, se recomandă utilizarea altor biblioteci.

Unde sunt stocate datele?

PlayerPrefs Când utilizați o clasă pentru a stoca date, locația în care sunt salvate depinde de platforma pe care rulați. Vă rugăm să consultați pagina oficială de mai jos pentru locul în care este stocat efectiv.

În unele medii, cum ar fi Windows, acestea nu sunt stocate într-un fișier, ci în setări de sistem, cum ar fi registry. Deoarece nu este un fișier, nu este potrivit pentru salvarea datelor salvate în , de exemplu, dacă datele salvate sunt foarte mari sau PlayerPrefs doriți să sincronizați datele salvate cu un alt mediu. În schimb, dacă datele care trebuie salvate au dimensiunea nivelului opțiunii sau dacă este un joc independent care este finalizat numai în mediul în care rulează, cred că este PlayerPrefs posibil să salvați datele în .

În plus, calea locației salvate poate fi afectată de setările "CompanyName" și "ProductName". Dacă doriți să vă publicați jocul, trebuie să decideți asupra acestor valori cu mult timp înainte și să nu le schimbați odată ce vă publicați jocul.

Despre criptarea datelor

Datele stocate nu sunt criptate automat. Dacă abilitățile jucătorului sunt salvate așa cum sunt, utilizatorul va rescrie liber valorile, ceea ce va afecta jocul.

Trebuie să criptați și, dacă da, ce nivel de putere este necesar și cum gestionați cheia de criptare? Lucrurile de luat în considerare variază de la joc la joc.

Nu voi explica metoda de criptare aici, dar dacă o căutați pe Internet, este un limbaj și un instrument major, deci cred că există diferite metode. Pentru moment, dacă nu înțelegeți semnificația conținutului stocat, chiar dacă deschideți fișierul și dacă manipulați datele slab, nu veți putea utiliza datele salvate, cred că va exista un efect antifraudă.