PlayerPrefide kasutamine andmete lugemiseks ja kirjutamiseks

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2021.3.3f1
Sisendsüsteemi pakett
  • 1.3.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Alguses

Kui olete mänge mänginud, on enamik teist seda kogenud. Tõenäoliselt olete mängu peatanud ja salvestanud või laadinud oma esitusandmed, et need pooleli jätta.

Mängu loomisel peate tavaliselt looma selle salvestus- ja laadimisfunktsiooni, seadistama valikud jne. Siin püüame seda saavutada, kasutades kõige PlayerPrefs lihtsamat viisi andmete salvestamiseks ja laadimiseks.

Kasutajaliidese paigutamine

Siin püüame sisendsisu salvestada või lugeda, asetades sisendelemendid ja nupud ning klõpsates nuppu. Praegu vajate ainult vähemalt kahte nuppu ja ühte sisendvälja, nii et võite need vabalt paigutada.

Kasutajaliidese töötlemise ettevalmistamine

Esiteks rakendame salvestamisnuppu. Nupusündmuse loomist tutvustatakse järgmistes näpunäidetes, seega loetlen ainult asjakohased osad.

Jätke skripti nimeks ButtonEvent .

Skript näeb välja selline:

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

Kuna sisestatud väärtust on vaja saada või seada, valmistage see ette väljana. Lisage ka meetod, mida kutsutakse, kui klõpsate igal nupul.

Manustage skript EventSystem ja määrake iga sisestusväli. See võib olla mis tahes objekt, mida soovite lisada.

Määrake iga meetod, mida nupu klõpsamisel kutsutakse.

Salvestage väärtus

Nüüd, kui salvestusnupule klõpsates nimetatakse OnClickSave meetodit, on salvestamisnupu protsess järgmine.

/// <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 Meetodi väärtuseks on seatud võti ja salvestatav väärtus. Võti määratakse salvestatud andmete laadimisel. SetString Siin nimetame meetodit, sest salvestatav väärtus on string. int float Kui soovite salvestada SetInt teist tüüpi väärtust, näiteks ja , on selliseid meetodeid nagu ja SetFloat , nii et helistage neile vastavalt tüübile.

PlayerPrefs.Save Lõpuks helistage salvestamise kinnitamiseks meetodile. Tegelikult võib selle salvestada isegi siis, kui te seda meetodit ei nimeta, kuid seda on ohutum nimetada.

Isegi kui käivitate mängu sel hetkel, salvestab see ainult väärtuse, nii et te ei tea, kas see on õigesti salvestatud. Kui kontrollite salvestatud asukohta, näete andmeid, kuid ...

Hankige salvestatud väärtus

Seejärel rakendage salvestatud andmete laadimise protsess. Nupu töötlemine on sama, mis salvestusprotsess, seega kirjeldatakse siin ainult laadimisprotsessi koodi.

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

Kasutage salvestatud andmete laadimiseks PlayerPrefs.GetString meetodit. Selle võtmega salvestatud väärtuse saamiseks määrake jaotises Salvesta argumendina määratud võti. Väärtus tuuakse meetodi tagastusväärtusest.

See salvestatakse ka stringina samamoodi nagu salvestamisel, nii et GetString me nimetame seda meetodit. int float Kui säästate GetIntGetFloat või , helistage meetodile.

Toodud väärtus kajastub sisestusväljal.

Nüüd saate andmeid salvestada ja laadida. Ma ei usu, et seal on raskeid elemente.

Proovige seda teisaldada

Käivitage sisenemiseks, salvestamiseks ja laadimiseks. Salvestatud andmed püsivad ja neid peaks saama laadida ka siis, kui mängust väljute ja seda uuesti käivitate. Kui saate kinnitada järgmist mustrit, arvan, et pole probleemi.

  1. Sisestage väärtus
  2. Klõpsake nuppu Salvesta
  3. Sisestatud väärtuse muutmine
  4. Klõpsake nuppu Impordi, et kinnitada, et see naaseb salvestatud väärtusele.
  5. Mängust väljumine
  6. Käivitage mäng uuesti ja klõpsake laadimisnuppu, et näha, kas saate salvestatud väärtuse meelde tuletada
  7. Sisestage teine väärtus, salvestage see ja kontrollige, kas saate värskendatud väärtusega sama lugeda

Andmehulga salvestamine ja laadimine

Senises valimis on salvestatud vaid mõned parameetrid. Kui te tegelikult mängu teete, suureneb salvestatavate parameetrite arv pidevalt ja kui loete ja kirjutate neid ükshaaval, on kood tohutu. Seetõttu on tegelikult salvestatavate andmete loomisel teooria ühendada salvestatavad andmed üheks ja seejärel kirjutada need kõik korraga.

Esmalt looge klassina salvestatud andmestruktuur. Eesmärk on osata andmeid korraga lugeda ja kirjutada, aga ka andmeid klassifitseerida, et koodil oleks lihtsam igale andmeühikule juurde pääseda.

Järgmised on näited mänguklasside salvestamisest: Seda saab kirjutada kõikjal, kus sellele saab viidata muust koodist. See klassi struktuur on näidis, nii et reaalses mängus peate selle oma mängu jaoks looma.

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

Seekord kasutatavas Unity standardfunktsioonis List , kui määratlete massiivid või kui teil on mitu kordumatut klassi, System.Serializable Kui te atribuuti ei lisa, ei teisendata seda õigesti, seega Character määrasin atribuudi klassile Serializable .

Pärast tunni loomist looge salvestatavad andmed. Loomulikult võib teil kogu mängu vältel olla selle klassi eksemplare. See sõltub sellest, kuidas mäng on tehtud.

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

Pärast andmete seadistamist JsonUtility.ToJson klassi eksemplaris teisendage (järjestage) need meetodiga JSON-stringiks. Kuna objekti väärtus on andmestruktuuriga üks "string", mida nimetatakse JSON-iks, saab kõikPlayerPrefs.SetString andmed kirjutada ühe kõnega meetodile.

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

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

Kuna aga kõik andmed kogutakse ühte, ei ole võimalik salvestada ainult osa sellest ega lugeda ainult osa sellest. Seetõttu on eelistatav muuta see ühikuks, mida on lihtne kokku võtta, näiteks kombineerides selle ühe objektina ühe salvestusandmete jaoks.

Salvestatud andmete lugemisel saate salvestamisel teha vastupidise töötlemise. Loetavad andmed on üks string, kuid sisu on JSON-vormingus andmestruktuurid, nii et JsonUtility.FromJson neid saab meetodite abil teisendada (deserialiseerida) klassi eksemplarideks. Kuna meil pole FromJson stringis teavet selle kohta, millisesse klassi teisendada, peame meetodi kutsumisel täpsustama tüübi.

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

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

Kui proovite seda teisaldada, näete, et see on õigesti salvestatud ja seda saab laadida.

Muide, me kasutame seekord Unity standardklasse JsonUtility , kuid nad ei pruugi olla võimelised keerukate andmestruktuuridega klasse teisendama, kuna need pole eriti funktsionaalsed. Sellisel juhul on soovitatav kasutada teisi teeke.

Kus andmeid säilitatakse?

PlayerPrefs Kui kasutate klassi andmete talletamiseks, sõltub nende salvestamise asukoht platvormist, millel töötate. Palun vaadake allolevat ametlikku lehte, kus seda tegelikult hoitakse.

Mõnes keskkonnas, näiteks Windowsis, ei salvestata neid faili, vaid süsteemisätetesse, näiteks registrisse. Kuna see ei ole fail, ei sobi see salvestatud andmete salvestamiseks , näiteks kui salvestatud andmed on väga suured või PlayerPrefs soovite salvestada salvestatud andmed teise keskkonnaga. Ja vastupidi, kui salvestatavad andmed on valikutaseme suurus või kui see on eraldiseisev mäng, mis on lõpule viidud ainult keskkonnas, kus see töötab, arvan, et andmeid on PlayerPrefs võimalik salvestada .

Lisaks võivad salvestatud asukoha teed mõjutada seaded "Ettevõtte nimi" ja "Tootenimi". Kui soovite oma mängu avaldada, peate nende väärtuste üle aegsasti otsustama ja mitte neid pärast mängu avaldamist muutma.

Teave andmete krüptimise kohta

Salvestatud andmeid ei krüpteerita automaatselt. Kui mängija võimed salvestatakse nii, nagu need on, kirjutab kasutaja vabalt ümber väärtused, mis mõjutavad mängu.

Kas peate krüptima ja kui jah, siis millist tugevust on vaja ja kuidas krüptovõtit käsitseda? Asjad, millega arvestada, on mänguti erinevad.

Ma ei selgita siin krüpteerimismeetodit, kuid kui te seda Internetist otsite, on see peamine keel ja tööriist, nii et ma arvan, et on olemas erinevaid meetodeid. Praegu, kui te ei mõista salvestatud sisu tähendust isegi siis, kui avate faili, ja kui te andmeid halvasti rikute, ei saa te salvestatud andmeid kasutada, arvan, et seal on pettusevastane mõju.