Použití PlayerPrefs ke čtení a zápisu dat

Stránky aktualizovány :
Datum vytvoření stránky :

Ověřovací prostředí

Windows
  • Systém Windows 11
Editor jednoty
  • 2021.3.3f1
Vstupní systémový balíček
  • 1.3.0

Předpoklady pro tento tip

Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.

Nejprve

Pokud jste hráli hry, většina z vás to zažila. Pravděpodobně jste hru pozastavili a uložili nebo načetli svá herní data, abyste je opustili.

Při vytváření hry je obvykle nutné vytvořit tuto funkci uložení a načtení, nastavit možnosti atd. Zde se toho pokusíme dosáhnout pomocí nejjednoduššího PlayerPrefs způsobu ukládání a načítání dat.

Umístění uživatelského rozhraní

Zde se pokusíme uložit nebo přečíst vstupní obsah umístěním vstupních položek a tlačítek a kliknutím na tlačítko. Prozatím potřebujete pouze alespoň dvě tlačítka a jedno vstupní pole, takže je neváhejte umístit.

Příprava na zpracování uživatelského rozhraní

Nejprve implementujeme tlačítko Uložit. Jak vytvořit událost tlačítka je představeno v následujících tipech, takže uvedu pouze příslušné části.

Název skriptu ButtonEvent ponechte jako .

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

Protože je nutné získat nebo nastavit zadanou hodnotu, připravte ji jako pole. Zahrňte také metodu, která bude volána po klepnutí na každé tlačítko.

Připojte skript EventSystem a nastavte každé vstupní pole. Může to být libovolný objekt, který chcete připojit.

Nastavte každou metodu, která má být volána při kliknutí na tlačítko.

Uložte hodnotu

Nyní, když je metoda volána při OnClickSave kliknutí na tlačítko Uložit, je proces tlačítka uložení následující.

/// <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 nastavena na klíč a hodnotu, která má být uložena. Klíč je zadán při načítání uložených dat. SetString Zde voláme metodu, protože hodnota, která má být uložena, je řetězec. int float Pokud chcete SetInt uložit hodnotu jiného typu, například a , existují metody jako a SetFloat , tak je volejte podle typu.

PlayerPrefs.Save Nakonec zavolejte metodu pro potvrzení uložení. Ve skutečnosti to může být uloženo, i když tuto metodu nevoláte, ale je bezpečnější ji volat.

Nicméně, i když spustíte hru v tomto okamžiku, uloží pouze hodnotu, takže nebudete vědět, zda byla uložena správně. Pokud zkontrolujete uloženou polohu, můžete vidět data, ale ...

Získání uložené hodnoty

Dále implementujte proces načítání uložených dat. Zpracování tlačítka je stejné jako proces uložení, takže je zde popsán pouze kód procesu načítání.

/// <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žijte metodu pro PlayerPrefs.GetString načtení uložených dat. Hodnotu uloženou s tímto klíčem můžete získat zadáním klíče zadaného v poli Uložit jako argument. Hodnota je načtena ve vrácené hodnotě metody.

To je také uloženo jako řetězec stejným způsobem jako při ukládání, takže GetString metodu zavoláme. int float Pokud ukládáte GetIntGetFloat s nebo , zavolejte metodu.

Načtená hodnota se projeví ve vstupním poli.

Nyní můžete data uložit a načíst. Nemyslím si, že existují nějaké obtížné prvky.

Zkuste ho přesunout

Spusťte pro zadání, uložení a načtení. Uložená data jsou trvalá a mělo by být možné je načíst i v případě, že hru ukončíte a znovu spustíte. Pokud můžete potvrdit následující vzorec, myslím, že není problém.

  1. Zadejte hodnotu
  2. Klikněte na tlačítko Uložit
  3. Změna zadané hodnoty
  4. Kliknutím na tlačítko Import potvrďte, že se vrátí na uloženou hodnotu.
  5. Ukončete hru
  6. Znovu spusťte hru a kliknutím na tlačítko načíst zjistěte, zda můžete vyvolat uloženou hodnotu
  7. Zadejte jinou hodnotu, uložte ji a zkontrolujte, zda ji můžete číst s aktualizovanou hodnotou

Uložení a načtení bloku dat

Ve vzorku bylo zatím uloženo pouze několik parametrů. Jak skutečně děláte hru, počet parametrů, které mají být uloženy, se bude neustále zvyšovat, a pokud je budete číst a psát jeden po druhém, kód bude obrovský. Proto při vytváření dat, která mají být skutečně uložena, je teorie kombinovat data, která mají být uložena, do jednoho a pak je zapsat najednou.

Nejprve vytvořte strukturu uložených dat jako třídu. Cílem je být schopen číst a zapisovat data najednou, ale také klasifikovat data, aby bylo pro kód snazší přístup ke každé části dat.

Následují příklady tříd uložených her: Může být napsán kdekoli, kde se na něj dá odkazovat z jiného kódu. Tato struktura tříd je ukázkou, takže ve skutečné hře ji musíte vytvořit pro svou 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;
}

List Ve standardní funkci Unity použité tentokrát, pokud definujete pole nebo máte více jedinečných tříd, System.Serializable Pokud atribut nepřidáte, nebude správně převeden, proto Character jsem atribut nastavil na tříduSerializable.

Po vytvoření třídy vytvořte data, která chcete uložit. Samozřejmě můžete mít instance této třídy v průběhu hry. To záleží na tom, jak je hra vyrobena.

// 保存するデータ作成
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 dat v instanci třídy je pomocí metody převeďte (serializujte) na řetězec JSON. Vzhledem k tomu, že hodnota objektu je jeden "řetězec" nazvaný JSON s datovou strukturou,PlayerPrefs.SetString všechna data lze zapsat jediným voláním metody.

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

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

Vzhledem k tomu, že všechna data jsou shromažďována v jednom, není možné uložit pouze jejich část nebo přečíst pouze část. Proto je vhodnější vytvořit z něj jednotku, která se snadno sumarní, například její kombinací jako jednoho objektu pro jedno uložení dat.

Při čtení uložených dat můžete při ukládání provést zpětné zpracování. Data, která mají být přečtena, jsou jeden řetězec, ale obsah jsou datové struktury ve formátu JSON, takže JsonUtility.FromJson je lze převést (deserializovat) na instance tříd metodami. Protože však v řetězci nemáme FromJson informaci, na jakou třídu převést, musíme při volání metody určit typ.

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

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

Pokud se jej pokusíte přesunout, uvidíte, že je uložen správně a lze jej načíst.

Mimochodem, tentokrát používáme standardní JsonUtility třídy Unity, ale nemusí být schopny převést třídy se složitými datovými strukturami, protože nejsou příliš funkční. V takovém případě se doporučuje použít jiné knihovny.

Kde jsou data uložena?

PlayerPrefs Když používáte třídu k ukládání dat, umístění, kde je uložena, závisí na platformě, na které běžíte. Podívejte se prosím na oficiální stránku níže, kde je skutečně uložen.

V některých prostředích, například v systému Windows, nejsou uloženy v souboru, ale v nastavení systému, jako je například registr. Vzhledem k tomu, že se nejedná o soubor, není vhodný pro ukládání uložených dat v , například pokud jsou uložená data velmi velká nebo PlayerPrefs chcete synchronizovat uložená data s jiným prostředím. Naopak, pokud data, která mají být uložena, mají velikost úrovně možností, nebo pokud se jedná o samostatnou hru, která je dokončena pouze v prostředí, ve kterém běží, myslím, že je PlayerPrefs možné data uložit do .

Kromě toho může být cesta k uložené poloze ovlivněna nastavením "CompanyName" a "ProductName". Pokud chcete hru vydat, musíte se o těchto hodnotách rozhodnout s dostatečným předstihem a po vydání hry je neměnit.

O šifrování dat

Uložená data nejsou automaticky šifrována. Pokud jsou schopnosti hráče uloženy tak, jak jsou, uživatel volně přepíše hodnoty, což ovlivní hru.

Potřebujete šifrovat, a pokud ano, jaká úroveň síly je vyžadována a jak zacházíte s šifrovacím klíčem? Věci, které je třeba zvážit, se liší od hry ke hře.

Nebudu zde vysvětlovat metodu šifrování, ale pokud si ji vyhledáte na internetu, je to hlavní jazyk a nástroj, takže si myslím, že existují různé metody. Prozatím, pokud nerozumíte významu uloženého obsahu, i když soubor otevřete, a pokud špatně manipulujete s daty, nebudete moci použít uložená data, myslím, že bude existovat určitý účinek proti podvodům.