Naudokite "PlayerPrefs" duomenims skaityti ir rašyti

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2021.3.3F1
Įvesties sistemos paketas
  • 1.3.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Iš pradžių

Jei žaidėte žaidimus, dauguma iš jūsų tai patyrėte. Tikriausiai pristabdėte žaidimą ir išsaugojote arba įkėlėte žaidimo duomenis, kad išeitumėte.

Kurdami žaidimą, paprastai turite sukurti šią išsaugojimo ir įkėlimo funkciją, nustatyti parinktis ir pan. Čia mes stengsimės tai pasiekti naudodami paprasčiausią PlayerPrefs duomenų saugojimo ir įkėlimo būdą.

Vartotojo sąsajos išdėstymas

Čia bandysime išsaugoti arba perskaityti įvesties turinį įdėdami įvesties elementus ir mygtukus ir spustelėdami mygtuką. Šiuo metu jums reikia tik bent dviejų mygtukų ir vieno įvesties lauko, todėl nedvejodami įdėkite juos.

Pasiruošimas vartotojo sąsajos apdorojimui

Pirmiausia įgyvendinkime išsaugojimo mygtuką. Kaip sukurti mygtuko įvykį, pristatoma šiuose patarimuose, todėl išvardinsiu tik atitinkamas dalis.

Palikite scenarijaus pavadinimą ButtonEvent kaip .

Scenarijus atrodo taip:

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

Kadangi būtina gauti arba nustatyti įvestą vertę, paruošite ją kaip lauką. Taip pat įtraukite metodą, kuris bus iškviestas spustelėjus kiekvieną mygtuką.

Pridėkite EventSystem scenarijų prie kiekvieno įvesties lauko ir jį nustatykite. Tai gali būti bet koks objektas, kurį norite pritvirtinti.

Nustatykite, kad kiekvienas metodas būtų iškviestas spustelėjus mygtuką.

Išsaugokite vertę

Dabar, kai metodas vadinamas OnClickSave spustelėjus išsaugojimo mygtuką, išsaugojimo mygtuko procesas yra toks.

/// <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 Metodas nustatomas kaip raktas ir vertė, kurią reikia išsaugoti. Raktas nurodomas įkeliant išsaugotus duomenis. SetString Čia mes vadiname metodą, nes saugotina vertė yra eilutė. int float Jei norite SetInt išsaugoti kito tipo reikšmę, pvz., ir , yra tokių metodų kaip ir SetFloat , todėl skambinkite jiems pagal tipą.

PlayerPrefs.Save Galiausiai paskambinkite metodu, kad patvirtintumėte išsaugojimą. Tiesą sakant, jis gali būti išsaugotas, net jei neskambinate šiuo metodu, tačiau saugiau jį vadinti.

Tačiau net jei paleisite žaidimą šiuo metu, jis išsaugos tik vertę, todėl nežinosite, ar jis buvo tinkamai išsaugotas. Jei patikrinsite išsaugotą vietą, galėsite matyti duomenis, bet ...

Gaukite sutaupytą vertę

Tada įgyvendinkite išsaugotų duomenų įkėlimo procesą. Mygtuko apdorojimas yra toks pat kaip išsaugojimo procesas, todėl čia aprašomas tik įkėlimo proceso kodas.

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

Norėdami įkelti išsaugotus duomenis, naudokite šį metodą PlayerPrefs.GetString . Su tuo raktu išsaugotą reikšmę galite gauti nurodydami raktą, nurodytą dalyje Įrašyti kaip argumentą. Reikšmė gaunama iš metodo grąžinamos vertės.

Tai taip pat išsaugoma kaip eilutė taip pat, kaip ir taupant, todėl GetString mes vadiname metodą. int float Jei taupote GetIntGetFloat su arba – skambinkite šiuo metodu.

Gauta reikšmė atsispindi įvesties lauke.

Dabar galite išsaugoti ir įkelti duomenis. Nemanau, kad yra kokių nors sudėtingų elementų.

Pabandykite jį perkelti

Paleiskite, kad įvestumėte, išsaugotumėte ir įkeltumėte. Išsaugoti duomenys išlieka ir juos turėtų būti galima įkelti, net jei išeisite ir iš naujo paleisite žaidimą. Jei galite patvirtinti šį modelį, manau, kad nėra jokių problemų.

  1. Įveskite reikšmę
  2. Spustelėkite mygtuką Išsaugoti
  3. Įvestos reikšmės keitimas
  4. Spustelėkite importavimo mygtuką, kad patvirtintumėte, jog jis grąžina išsaugotą reikšmę.
  5. Išeikite iš žaidimo
  6. Iš naujo paleiskite žaidimą ir spustelėkite įkėlimo mygtuką, kad pamatytumėte, ar galite prisiminti išsaugotą vertę
  7. Įveskite kitą reikšmę, išsaugokite ją ir patikrinkite, ar galite perskaityti tą pačią su atnaujinta reikšme

Išsaugokite ir įkelkite dalį duomenų

Iki šiol imtyje buvo išsaugoti tik keli parametrai. Kai iš tikrųjų sukursite žaidimą, išsaugomų parametrų skaičius nuolat didės, o jei juos skaitysite ir rašysite po vieną, kodas bus milžiniškas. Todėl, kuriant duomenis, kuriuos reikia iš tikrųjų išsaugoti, teorija yra sujungti duomenis, kuriuos reikia išsaugoti, į vieną ir tada parašyti juos visus iš karto.

Pirmiausia sukurkite duomenų išsaugojimo struktūrą kaip klasę. Tikslas yra ne tik skaityti ir rašyti duomenis vienu metu, bet ir klasifikuoti duomenis, kad kodui būtų lengviau pasiekti kiekvieną duomenų dalį.

Toliau pateikiami žaidimų klasių išsaugojimo pavyzdžiai: Jis gali būti parašytas bet kur, kur jį galima nurodyti iš kito kodo. Ši klasės struktūra yra pavyzdys, todėl tikrame žaidime turite jį sukurti savo žaidimui.

/// <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 Šį kartą naudojamoje "Unity" standartinėje funkcijoje, jei apibrėžiate masyvus arba norite turėti kelias unikalias klases, System.Serializable Jei nepridėsite atributo, jis nebus tinkamai konvertuotas, todėl Character atributą Serializable nustatau klasei.

Sukūrę klasę, sukurkite duomenis, kuriuos norite įrašyti. Žinoma, viso žaidimo metu galite turėti šios klasės egzempliorių. Tai priklauso nuo to, kaip žaidimas sukurtas.

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

Nustatę JsonUtility.ToJson duomenis klasės egzemplioriuje, konvertuokite (serializuokite) juos į JSON eilutę naudodami metodą. Kadangi objekto vertė yra viena "eilutė", vadinama JSON su duomenų struktūra, visiPlayerPrefs.SetString duomenys gali būti parašyti vienu skambučiu į metodą.

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

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

Tačiau, kadangi visi duomenys renkami viename, neįmanoma išsaugoti tik dalies jų arba perskaityti tik dalį jų. Todėl pageidautina, kad jis būtų vienetas, kurį būtų lengva apibendrinti, pavyzdžiui, sujungti jį kaip vieną objektą vienam išsaugoti duomenis.

Skaitydami išsaugotus duomenis, išsaugodami galite atlikti atvirkštinį apdorojimą. Duomenys, kuriuos reikia perskaityti, yra viena eilutė, tačiau turinys yra JSON formato duomenų struktūros, todėl JsonUtility.FromJson juos galima konvertuoti (deserializuoti) į klasės egzempliorius metodais. Tačiau, kadangi eilutėje neturime FromJson informacijos, į kokią klasę konvertuoti, skambindami metodu turime nurodyti tipą.

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

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

Jei bandysite jį perkelti, pamatysite, kad jis išsaugotas teisingai ir gali būti įkeltas.

Beje, šį kartą naudojame "Unity" standartines JsonUtility klases, tačiau jos gali nesugebėti konvertuoti klasių su sudėtingomis duomenų struktūromis, nes jos nėra labai funkcionalios. Tokiu atveju rekomenduojama naudoti kitas bibliotekas.

Kur saugomi duomenys?

PlayerPrefs Kai duomenims saugoti naudojate klasę, vieta, kurioje ji išsaugoma, priklauso nuo platformos, kurioje naudojatės. Žiūrėkite žemiau esantį oficialų puslapį, kur jis iš tikrųjų saugomas.

Kai kuriose aplinkose, pvz., "Windows", jie saugomi ne faile, o sistemos parametruose, pvz., registre. Kadangi tai nėra failas, jis netinka išsaugoti išsaugotus duomenis , pavyzdžiui, jei išsaugoti duomenys yra labai dideli arba PlayerPrefs norite sinchronizuoti išsaugotus duomenis su kita aplinka. Ir atvirkščiai, jei duomenys, kuriuos reikia išsaugoti, yra pasirinkimo lygio dydis arba jei tai yra atskiras žaidimas, kuris užbaigiamas tik toje aplinkoje, kurioje jis veikia, manau, kad PlayerPrefs duomenis galima išsaugoti .

Be to, išsaugotos vietos kelią gali paveikti nustatymai "Įmonės pavadinimas" ir "Produkto pavadinimas". Jei norite paskelbti savo žaidimą, turite iš anksto nuspręsti dėl šių verčių ir nekeisti jų, kai paskelbsite savo žaidimą.

Apie duomenų šifravimą

Saugomi duomenys nėra automatiškai šifruojami. Jei žaidėjo sugebėjimai bus išsaugoti tokie, kokie yra, vartotojas laisvai perrašys vertybes, kurios turės įtakos žaidimui.

Ar jums reikia užšifruoti ir, jei taip, kokio stiprumo lygio reikia ir kaip elgtis su šifravimo raktu? Dalykai, į kuriuos reikia atsižvelgti, skiriasi priklausomai nuo žaidimo.

Čia nepaaiškinsiu šifravimo metodo, bet jei ieškosite jo internete, tai yra pagrindinė kalba ir įrankis, todėl manau, kad yra įvairių metodų. Šiuo metu, jei nesuprantate saugomo turinio reikšmės, net jei atidarote failą, ir jei blogai sugadinate duomenis, negalėsite naudoti išsaugotų duomenų, manau, kad bus tam tikras kovos su sukčiavimu poveikis.