PlayerPrefide kasutamine andmete lugemiseks ja kirjutamiseks
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 GetInt
GetFloat
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.
- Sisestage väärtus
- Klõpsake nuppu Salvesta
- Sisestatud väärtuse muutmine
- Klõpsake nuppu Impordi, et kinnitada, et see naaseb salvestatud väärtusele.
- Mängust väljumine
- Käivitage mäng uuesti ja klõpsake laadimisnuppu, et näha, kas saate salvestatud väärtuse meelde tuletada
- 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.