Používanie prehrávača PlayerPrefs na čítanie a zápis údajov

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2021.3.3f1
Vstupný systémový balík
  • 1.3.0

Predpoklady pre tento tip

Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.

Najskôr

Ak ste hrali hry, väčšina z vás to zažila. Pravdepodobne ste pozastavili hru a uložili alebo načítali ste údaje prehrávania, aby ste ju ukončili.

Pri vytváraní hry je zvyčajne potrebné vytvoriť túto funkciu ukladania a načítania, nastaviť možnosti atď. Tu sa to pokúsime dosiahnuť najjednoduchším PlayerPrefs spôsobom ukladania a načítavania údajov.

Umiestnenie používateľského rozhrania

Tu sa pokúsime uložiť alebo prečítať vstupný obsah umiestnením vstupných položiek a tlačidiel a kliknutím na tlačidlo. Zatiaľ vám stačia aspoň dve tlačidlá a jedno vstupné pole, takže ich pokojne umiestnite.

Príprava na spracovanie používateľského rozhrania

Najprv implementujme tlačidlo uloženia. Ako vytvoriť udalosť tlačidla je uvedené v nasledujúcich tipoch, takže uvediem iba príslušné časti.

Názov ButtonEvent skriptu ponechajte ako .

Skript vyzerá takto:

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

Keďže je potrebné získať alebo nastaviť zadanú hodnotu, pripravte ju ako pole. Zahrňte tiež metódu, ktorá sa vyvolá po kliknutí na jednotlivé tlačidlá.

Pripojte skript EventSystem a nastavte každé vstupné pole. Môže to byť akýkoľvek predmet, ktorý chcete pripojiť.

Nastavte každú metódu, ktorá sa má volať po kliknutí na tlačidlo.

Uložte hodnotu

Teraz, keď sa metóda volá po OnClickSave kliknutí na tlačidlo uloženia, proces tlačidla uloženia je nasledujúci.

/// <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 Metóda je nastavená na kľúč a hodnotu, ktorá sa má uložiť. Kľúč je zadaný pri načítaní uložených údajov. SetString Tu nazývame metódu, pretože hodnota, ktorá sa má uložiť, je reťazec. int float Ak chcete SetInt uložiť hodnotu iného typu, napríklad a , existujú metódy ako a SetFloat , tak ich zavolajte podľa typu.

PlayerPrefs.Save Nakoniec zavolajte metódu na potvrdenie uloženia. V skutočnosti sa môže uložiť, aj keď túto metódu nevoláte, ale je bezpečnejšie ju nazvať.

Avšak aj keď hru v tomto okamihu spustíte, uloží iba hodnotu, takže nebudete vedieť, či bola uložená správne. Ak skontrolujete uložené umiestnenie, môžete vidieť údaje, ale ...

Získanie uloženej hodnoty

Ďalej implementujte proces načítania uložených údajov. Spracovanie tlačidla je rovnaké ako proces ukladania, takže tu je popísaný iba kód procesu načítania.

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

Použite metódu na načítanie PlayerPrefs.GetString uložených údajov. Hodnotu uloženú pomocou tohto kľúča môžete získať zadaním kľúča zadaného v časti Uložiť ako argument. Hodnota sa získa vo vrátenej hodnote metódy.

Toto sa tiež ukladá ako reťazec rovnakým spôsobom ako pri ukladaní, preto GetString nazývame metódu. int float GetIntGetFloat Ak ukladáte s alebo , zavolajte metódu.

Načítaná hodnota sa prejaví vo vstupnom poli.

Teraz môžete údaje uložiť a načítať. Nemyslím si, že sú tam nejaké zložité prvky.

Skúste ho presunúť

Spustite na zadanie, uloženie a načítanie. Uložené údaje sa zachovajú a malo by sa dať načítať aj po ukončení a opätovnom spustení hry. Ak môžete potvrdiť nasledujúci vzorec, myslím si, že nie je problém.

  1. Zadanie hodnoty
  2. Kliknite na tlačidlo Uložiť
  3. Zmena zadanej hodnoty
  4. Kliknutím na tlačidlo importu potvrďte, že sa vráti na uloženú hodnotu.
  5. Ukončite hru
  6. Znova spustite hru a kliknutím na tlačidlo načítania skontrolujte, či môžete vyvolať uloženú hodnotu
  7. Zadajte inú hodnotu, uložte ju a skontrolujte, či ju môžete prečítať s aktualizovanou hodnotou

Uloženie a načítanie časti údajov

Vo vzorke sa doteraz uložilo len niekoľko parametrov. Keď skutočne vytvoríte hru, počet parametrov, ktoré sa majú uložiť, sa bude neustále zvyšovať a ak ich budete čítať a písať jeden po druhom, kód bude obrovský. Preto pri vytváraní údajov, ktoré sa majú skutočne uložiť, je teóriou kombinovať údaje, ktoré sa majú uložiť, do jedného a potom ich zapísať všetky naraz.

Najprv vytvorte štruktúru uložených údajov ako triedu. Cieľom je vedieť čítať a zapisovať dáta naraz, ale aj klasifikovať dáta, aby sa uľahčil prístup kódu ku každému dátu.

Nasledujú príklady tried uložených hier: Môže byť napísaný kdekoľvek, môže byť odkazovaný z iného kódu. Táto štruktúra tried je ukážkou, takže v skutočnej hre ju musíte vytvoriť pre svoju hru.

/// <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 štandardnej List funkcii Unity použitej tentoraz, ak definujete polia alebo máte viac jedinečných tried, System.Serializable Ak atribút nepridáte, neprevedie sa správne, preto Character som atribút nastavil na triedu Serializable .

Po vytvorení triedy vytvorte údaje, ktoré chcete uložiť. Samozrejme, inštancie tejto triedy môžete mať počas celej hry. Závisí to od toho, ako je hra vyrobená.

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

Po nastavení JsonUtility.ToJson údajov v inštancii triedy ich pomocou metódy skonvertujte (serializujte) na reťazec JSON. Keďže hodnota objektu je jeden "reťazec" nazývaný JSON s dátovou štruktúrou, všetkyPlayerPrefs.SetString údaje môžu byť zapísané jediným volaním metódy.

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

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

Keďže sa však všetky údaje zhromažďujú v jednom, nie je možné uložiť iba ich časť alebo prečítať iba ich časť. Preto je vhodnejšie urobiť z neho jednotku, ktorá sa dá ľahko zhrnúť, napríklad ju skombinovať ako jeden objekt pre jeden uložený údaj.

Pri čítaní uložených údajov môžete pri ukladaní vykonať spätné spracovanie. Údaje, ktoré sa majú čítať, sú jeden reťazec, ale ich obsahom sú dátové štruktúry vo formáte JSON, takže JsonUtility.FromJson ich možno pomocou metód konvertovať (deserializovať) na inštancie triedy. Keďže však v reťazci nemáme FromJson informácie, na akú triedu previesť, musíme pri volaní metódy určiť typ.

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

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

Ak sa ho pokúsite presunúť, môžete vidieť, že je správne uložený a dá sa načítať.

Mimochodom, tentokrát používame štandardné JsonUtility triedy Unity, ale nemusia byť schopné konvertovať triedy so zložitými dátovými štruktúrami, pretože nie sú veľmi funkčné. V takom prípade sa odporúča použiť iné knižnice.

Kde sú údaje uložené?

PlayerPrefs Keď používate triedu na ukladanie údajov, umiestnenie, kde sú uložené, závisí od platformy, na ktorej bežíte. Pozrite si oficiálnu stránku nižšie, kde sú skutočne uložené.

V niektorých prostrediach, ako je napríklad Windows, nie sú uložené v súbore, ale v systémových nastaveniach, ako je napríklad databáza Registry. Keďže nejde o súbor, nie je vhodný na ukladanie uložených údajov do , napríklad ak sú uložené dáta veľmi veľké alebo PlayerPrefs chcete uložiť dáta synchronizovať s iným prostredím. Naopak, ak údaje, ktoré sa majú uložiť, majú veľkosť úrovne možností, alebo ak ide o samostatnú hru, ktorá je dokončená iba v prostredí, v ktorom beží, myslím si, že je PlayerPrefs možné údaje uložiť do .

Okrem toho môže byť cesta k uloženému miestu ovplyvnená nastaveniami "CompanyName" a "ProductName". Ak chcete vydať svoju hru, musíte sa o týchto hodnotách rozhodnúť v dostatočnom predstihu a po vydaní hry ich nemeniť.

Šifrovanie údajov

Uložené údaje nie sú automaticky šifrované. Ak sú schopnosti hráča uložené tak, ako sú, používateľ voľne prepíše hodnoty, čo ovplyvní hru.

Potrebujete šifrovať, a ak áno, aká úroveň sily je potrebná a ako zaobchádzate so šifrovacím kľúčom? Čo je potrebné zvážiť, sa líši od hry k hre.

Nebudem tu vysvetľovať metódu šifrovania, ale ak ju vyhľadáte na internete, je to hlavný jazyk a nástroj, takže si myslím, že existujú rôzne metódy. Zatiaľ, ak nerozumiete významu uloženého obsahu, aj keď otvoríte súbor, a ak s údajmi zle manipulujete, nebudete môcť uložiť údaje použiť, myslím si, že to bude mať určitý účinok proti podvodom.