A PlayerPrefs használata adatok olvasására és írására

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 11 esetén
Unity-szerkesztő
  • 2021.3.3f1
Bemeneti rendszercsomag
  • 1.3.0

A tipp előfeltételei

A következő beállításokat előre elvégeztük a tipp leírásának előfeltételeként.

Először

Ha játszottál már játékokkal, a legtöbben megtapasztaltátok. Valószínűleg szüneteltettél egy játékot, és elmentetted vagy betöltötted a játékadataidat, hogy befejezd.

Játék létrehozásakor általában létre kell hoznia ezt a mentési és betöltési funkciót, meg kell adnia az opciókat stb. Itt megpróbáljuk ezt elérni az adatok tárolásának és betöltésének legegyszerűbb PlayerPrefs módjával.

Felhasználói felület elhelyezése

Itt megpróbáljuk menteni vagy olvasni a bemeneti tartalmat a bemeneti elemek és gombok elhelyezésével és a gombra kattintással. Egyelőre csak legalább két gombra és egy beviteli mezőre van szüksége, ezért nyugodtan helyezze el őket.

Felkészülés a felhasználói felület feldolgozására

Először valósítsuk meg a mentés gombot. A gombesemény létrehozásának módját a következő tippek mutatják be, ezért csak a releváns részeket sorolom fel.

Hagyja meg a szkript nevét ButtonEvent .

A szkript így néz ki:

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

Mivel szükséges a beírt érték megszerzése vagy beállítása, készítse elő mezőként. Adja meg azt a metódust is, amelyet az egyes gombokra kattintva hív meg a rendszer.

Csatolja a szkriptet az EventSystem egyes beviteli mezőkhöz, és állítsa be őket. Bármilyen objektum lehet, amelyet csatolni szeretne.

Állítsa be, hogy az egyes metódusok meghívásra kerüljenek, amikor a gombra kattintanak.

Az érték mentése

Most, hogy a módszer meghívásra kerül, amikor OnClickSave a mentés gombra kattint, a mentés gomb folyamata a következő.

/// <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 A metódus egy kulcsra és egy mentendő értékre van beállítva. A kulcs a mentett adatok betöltésekor kerül megadásra. SetString Itt azért hívjuk meg a metódust, mert a tárolandó érték egy sztring. int float Ha más típusú értéket szeretne SetInt menteni, például és , vannak olyan metódusok, mint a és SetFloat , ezért hívja őket a típusnak megfelelően.

PlayerPrefs.Save Végül hívja meg a módszert a mentés megerősítéséhez. Valójában akkor is megmenthető, ha nem hívja ezt a módszert, de biztonságosabb hívni.

Azonban még akkor is, ha ezen a ponton futtatja a játékot, csak az értéket menti el, így nem fogja tudni, hogy megfelelően mentették-e. Ha ellenőrzi a mentett helyet, láthatja az adatokat, de ...

Mentett érték lekérése

Ezután hajtsa végre a mentett adatok betöltésének folyamatát. A gomb feldolgozása megegyezik a mentési folyamattal, így itt csak a betöltési folyamat kódját ismertetjük.

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

Használja a módszert a mentett adatok betöltéséhez PlayerPrefs.GetString . Az ezzel a kulccsal mentett értéket a Mentés argumentumként mezőben megadott kulcs megadásával kaphatja meg. Az értéket a metódus visszatérési értékében olvassa be a rendszer.

Ezt karakterláncként is elmenti ugyanúgy, mint a mentéskor, ezért GetString hívjuk a metódust. int float Ha vagy paranccsal ment, GetIntGetFloat hívja meg a metódust.

A beolvasott érték megjelenik a beviteli mezőben.

Most már mentheti és betöltheti az adatokat. Nem hiszem, hogy vannak nehéz elemek.

Próbálja meg áthelyezni

Futtatás a belépéshez, mentéshez és betöltéshez. A mentett adatok megmaradnak, és akkor is betölthetők, ha kilép és újrafuttatja a játékot. Ha meg tudja erősíteni a következő mintát, azt hiszem, nincs probléma.

  1. Adjon meg egy értéket
  2. Kattintson a Mentés gombra
  3. A megadott érték módosítása
  4. Kattintson az importálás gombra annak megerősítéséhez, hogy visszatér a mentett értékhez.
  5. Kilépés a játékból
  6. Futtassa újra a játékot, és kattintson a betöltés gombra, hogy megnézze, vissza tudja-e hívni a mentett értéket
  7. Adjon meg egy másik értéket, mentse el, és ellenőrizze, hogy ugyanazt tudja-e olvasni a frissített értékkel

Adattömb mentése és betöltése

A mintában eddig csak néhány paraméter lett mentve. Ahogy ténylegesen játékot készít, a mentendő paraméterek száma folyamatosan növekszik, és ha egyenként olvassa el és írja őket, a kód hatalmas lesz. Ezért a ténylegesen mentendő adatok létrehozásakor az elmélet az, hogy a mentendő adatokat egyesítik, majd egyszerre írják.

Először hozzon létre egy mentési adatstruktúrát osztályként. A cél az, hogy egyszerre lehessen olvasni és írni az adatokat, de osztályozni is kell az adatokat, hogy a kód könnyebben hozzáférhessen az egyes adatokhoz.

Az alábbiakban példákat mutatunk be a játékmentési osztályokra: Bárhol írható, más kódból lehet hivatkozni rá. Ez az osztálystruktúra egy minta, így egy igazi játékban létre kell hoznia a játékához.

/// <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 Az ezúttal használt Unity standard függvényben, ha tömböket definiál, vagy több egyedi osztállyal rendelkezik, System.Serializable Ha nem ad hozzá attribútumot, akkor az nem lesz megfelelően konvertálva, ezért Character az attribútumot az Serializable osztályra állítottam.

Az osztály létrehozása után hozza létre a menteni kívánt adatokat. Természetesen a játék során előfordulhat ennek az osztálynak a példányai. Ez attól függ, hogyan készül a játék.

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

Miután beállította JsonUtility.ToJson az adatokat az osztály példányában, konvertálja (szerializálja) JSON-sztringgé a metódussal. Mivel az objektum értéke egyetlen, JSON nevű "sztring", amely adatstruktúrával rendelkezik, az összesPlayerPrefs.SetString adat a metódus egyetlen hívásával írható.

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

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

Mivel azonban az összes adatot egyben gyűjtik, nem lehet csak egy részét menteni vagy csak egy részét olvasni. Ezért célszerű könnyen összegző egységgé tenni, például egy objektumként egyesíteni egy mentési adathoz.

A mentett adatok olvasásakor mentéskor fordított feldolgozást végezhet. Az olvasandó adatok egyetlen sztring, de a tartalom JSON-formátumú adatstruktúra, így JsonUtility.FromJson metódusokkal osztálypéldányokká alakíthatók (deszerializálhatók). Mivel azonban a karakterláncban nincs FromJson információ arról, hogy melyik osztályba konvertáljunk, meg kell adnunk a típust a metódus hívásakor.

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

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

Ha megpróbálja mozgatni, láthatja, hogy helyesen van mentve és betölthető.

Egyébként ezúttal a Unity szabványos JsonUtility osztályokat használjuk, de előfordulhat, hogy nem tudják konvertálni az összetett adatstruktúrával rendelkező osztályokat, mert nem túl funkcionálisak. Ebben az esetben ajánlott más könyvtárak használata.

Hol tárolják az adatokat?

PlayerPrefs Ha egy osztályt használ az adatok tárolására, a mentés helye attól függ, hogy milyen platformon fut. Kérjük, olvassa el az alábbi hivatalos oldalt, ahol ténylegesen tárolják.

Bizonyos környezetekben, például a Windows rendszerben, nem fájlban, hanem rendszerbeállításokban, például a rendszerleíró adatbázisban tárolódnak. Mivel nem fájl, nem alkalmas mentett adatok mentésére , például ha a mentési adatok nagyon nagyok, vagy PlayerPrefs szinkronizálni szeretné a mentési adatokat egy másik környezettel. Ezzel szemben, ha a mentendő adatok mérete megegyezik az opciós szint méretével, vagy ha ez egy önálló játék, amely csak abban a környezetben fejeződik be, amelyben fut, úgy gondolom PlayerPrefs , hogy az adatok menthetők .

Ezenkívül a mentett hely elérési útját befolyásolhatják a "CompanyName" és a "ProductName" beállítások. Ha közzé szeretné tenni a játékot, akkor jó előre el kell döntenie ezeket az értékeket, és nem szabad megváltoztatnia őket a játék közzététele után.

Az adattitkosításról

A tárolt adatok nem titkosítódnak automatikusan. Ha a játékos képességeit úgy menti, ahogy vannak, a felhasználó szabadon átírja az értékeket, ami befolyásolja a játékot.

Titkosítania kell-e, és ha igen, milyen erősségre van szüksége, és hogyan kell kezelni a titkosítási kulcsot? A megfontolandó dolgok játékonként változnak.

Itt nem fogom elmagyarázni a titkosítási módszert, de ha utánanézel az interneten, ez egy fő nyelv és eszköz, ezért azt hiszem, különböző módszerek léteznek. Egyelőre, ha nem érti a tárolt tartalom jelentését, még akkor sem, ha megnyitja a fájlt, és ha rosszul manipulálja az adatokat, akkor nem fogja tudni használni a mentési adatokat, úgy gondolom, hogy lesz némi csalás elleni hatás.