Uporaba programa PlayerPrefs za branje in pisanje podatkov

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik enotnosti
  • 2021.3.3f1
Paket vhodnega sistema
  • 1.3.0

Predpogoji za to konico

Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.

Sprva

Če ste igrali igre, jih je večina doživela. Verjetno ste zapustili igro in shranili ali naložili podatke o igrah, da bi izpustili.

Pri ustvarjanju igre morate običajno ustvariti to funkcijo shranjevanja in nalaganja, nastaviti možnosti itd. Tukaj bomo to poskušali PlayerPrefs doseči z najenostavnejšim načinom shranjevanje in nalaganje podatkov.

Postavitev UI

Tukaj bomo poskušali shraniti ali prebrati vhodno vsebino tako, da postavimo vhodne elemente in gumbe ter kliknemo gumb. Za zdaj potrebujete vsaj dva gumba in eno vnosno polje, zato jih lahko prosto postavite.

Priprava na obdelavo UI

Najprej uvajajmo gumb za shranjevanje. Kako ustvariti dogodek gumba se uvede v naslednjih nasvetih, zato bom navedel le ustrezne dele.

Ime skripta pustite ButtonEvent kot .

Scenarij izgleda takole:

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

Ker je treba vneto vrednost dobiti ali nastaviti, jo pripravite kot polje. Vključite tudi metodo, ki bo poklicana, ko kliknete vsak gumb.

Priložite skript EventSystem in nastavite vsako vnosno polje. Lahko je katerikoli predmet, ki ga želite priložiti.

Nastavite vsako metodo, ki jo želite poklicati, ko kliknete gumb.

Shranjevanje vrednosti

Ko je metoda OnClickSave poklicana, ko kliknete gumb za shranjevanje, je postopek gumba za shranjevanje naslednji.

/// <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 je nastavljena na ključ in vrednost, ki jo je treba shraniti. Ključ je določen pri nalaganju shranjenih podatkov. SetString Tukaj kličemo metodo, ker je vrednost, ki jo je treba shraniti, niz. int float Če želite shraniti SetInt vrednost druge vrste, na primer in , SetFloat obstajajo metode, kot so in , zato jih pokličite glede na vrsto.

PlayerPrefs.Save Na koncu pokličite metodo, da potrdite shranjevanje. Pravzaprav se lahko shrani tudi, če ne pokličete te metode, vendar je varneje, da ga imenujete.

Vendar, tudi če ste zagnali igro na tej točki, bo le shranil vrednost, tako da ne boste vedeli, če je bila shranjena pravilno. Če preverite shranjeno mesto, lahko vidite podatke, vendar ...

Shranjevanje vrednosti

Nato izvajate postopek nalaganja shranjenih podatkov. Obdelava gumba je enaka postopku shranjevanja, zato je tukaj opisana le koda postopka nalaganja.

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

Uporabite metodo za PlayerPrefs.GetString nalaganje shranjenih podatkov. Vrednost, shranjeno s tem ključem, lahko dobite tako, da določite ključ, določen v argumentu Shrani kot argument. Vrednost se pridobi v povratni vrednosti metode.

To je shranjeno tudi kot niz na enak način kot pri shranjevanje, zato GetString imenujemo metodo. int float Če shranjujete GetIntGetFloat z ali , pokličite metodo.

Pridobljena vrednost se odraža v vnosnem polju.

Zdaj lahko shranite in naložite podatke. Mislim, da ni težavnih elementov.

Poskusi ga premakni.

Zaženite, da vnesete, shranite in naložite. Shranjeni podatki se nadaljujejo in morajo biti naloženi, tudi če zapustite in ponovite igro. Če lahko potrdite naslednji vzorec, mislim, da ni težav.

  1. Vnesite vrednost
  2. Kliknite gumb Shrani
  3. Spreminjanje vrednosti, ki ste jo vnesli
  4. Kliknite gumb za uvoz, da potrdite, da se vrne na shranjeno vrednost.
  5. Izstopite iz igre
  6. Ponovno zaženite igro in kliknite gumb za nalaganje, da preverite, ali lahko odpokličete shranjeno vrednost
  7. Vnesite drugo vrednost, jo shranite in preverite, ali lahko enako preberete s posodobljeno vrednostjo

Shranjevanje in nalaganje košček podatkov

V doslej vzorcu je bilo shranjenih le nekaj parametrov. Ko boste dejansko naredili igro, se bo število parametrov, ki jih je treba shraniti, vedno bolj povečalo, in če jih berete in pišete enega za drugim, bo koda ogromna. Zato je pri ustvarjanju podatkov, ki bodo dejansko shranjeni, teorija združiti podatke, ki jih je treba shraniti v enega in jih nato vse hkrati napisati.

Najprej ustvarite strukturo podatkov za shranjevanje kot razred. Cilj je biti sposoben brati in pisati podatke hkrati, pa tudi razvrstiti podatke, da bo koda lažje dostopala do vsakega kosa podatkov.

To so primeri shranjevanja razredov iger: Lahko ga zapisate kjerkoli, kjer se lahko sklicuje iz druge kode. Ta struktura razreda je vzorec, tako da v pravi igri jo morate ustvariti za svojo igro.

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

V standardni List funkciji Unity, ki se uporablja tokrat, če določite matrike ali imate več edinstvenih razredov, System.Serializable Če atributa ne dodate, ga ne boste pravilno pretvorili, Character zato sem atribut nastavil na Serializable razred.

Ko ustvarite razred, ustvarite podatke, ki jih želite shraniti. Seveda lahko imate primerke tega razreda skozi celotno igro. To je odvisno od tega, kako se igra.

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

Ko nastavite podatke JsonUtility.ToJson v primerku razreda, jih z metodo pretvorite (serializirajte) v niz JSON. Ker je vrednost predmeta en sam "niz" imenovan JSON s podatkovno strukturo,PlayerPrefs.SetString se lahko vsi podatki zapisajo z enim klicem na metodo.

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

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

Ker pa so vsi podatki zbrani v enem, ni mogoče shraniti le enega dela ali brati le del. Zato je najbolje, da je enota, ki jo je enostavno povzeti, kot je združevanje kot enega predmeta za en shranjevanje podatkov.

Pri branju shranjenih podatkov lahko ob shranjevanje naredite povratno obdelavo. Podatki, ki jih je treba prebrati, so en niz, vsebina pa so strukture podatkov, oblikovane z JSON, JsonUtility.FromJson zato jih je mogoče pretvoriti (deserializirati) v primerke razreda po metodah. Ker pa v FromJson nizu nimamo informacij, v kateri razred pretvoriti, moramo pri klicu metode določiti vrsto.

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

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

Če jo poskusite premakniti, lahko vidite, da je shranjena pravilno in jo je mogoče naložiti.

Mimogrede, tokrat uporabljamo standardne razrede Unity JsonUtility , morda pa ne bodo mogli pretvoriti razredov s kompleksnimi podatkovnimi strukturami, ker niso zelo funkcionalni. V tem primeru je priporočljivo uporabljati druge knjižnice.

Kje so shranjeni podatki?

PlayerPrefs Ko uporabljate razred za shranjevanje podatkov, je mesto, kjer se shrani, odvisno od platforme, na kateri se izvajate. Prosimo, glejte spodnjo uradno stran, kje je dejansko shranjena.

V nekaterih okoljih, kot je Windows, niso shranjene v datoteki, temveč v sistemskih nastavitvah, kot je register. Ker to ni datoteka, ni primerna za shranjevanje shranjenih podatkov v , na primer, PlayerPrefs če so shranjeni podatki zelo veliki ali želite sinhronizirati podatke za shranjevanje z drugim okoljem. Nasprotno, če so podatki, ki jih je treba shraniti velikost ravni možnosti, ali če gre za samostojno igro, ki je dokončana samo v okolju, v katerem se izvaja, mislim, PlayerPrefs da je mogoče shraniti podatke v .

Poleg tega lahko nastavitve »CompanyName« in »ProductName« vplivajo na pot shranjenega mesta. Če želite objaviti svojo igro, se morate vnaprej odločiti za te vrednosti in jih ne spremeniti, ko boste objavili svojo igro.

O šifriranju podatkov

Shranjeni podatki niso samodejno šifrirani. Če so sposobnosti igralca shranjene tako, kot so, bo uporabnik prosto prepisoval vrednosti, kar bo vplivalo na igro.

Ali morate šifrirati in če je tako, kakšna raven moči je potrebna in kako ravnati s ključem za šifriranje? Stvari, ki jih je treba upoštevati, se razlikujejo od igre do igre.

Tukaj ne bom razložil metode šifriranja, če pa jo poiščite na internetu, je to velik jezik in orodje, zato mislim, da obstajajo različne metode. Če za zdaj ne razumete pomen shranjene vsebine, tudi če odprete datoteko, in če slabo spreminjate podatke, ne boste mogli uporabiti shranjenih podatkov, mislim, da bo obstajal učinek proti goljufijam.