A PlayerPrefs használata adatok olvasására és írására
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, GetInt
GetFloat
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.
- Adjon meg egy értéket
- Kattintson a Mentés gombra
- A megadott érték módosítása
- Kattintson az importálás gombra annak megerősítéséhez, hogy visszatér a mentett értékhez.
- Kilépés a játékból
- 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
- 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.
- PlayerPrefs
- 【Egység】 A PlayerPrefsben tárolt adatok helye a WebGL-ben Windows rendszeren (IndexedDB)
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.