PlayerPrefs izmantošana datu lasīšanai un rakstīšanai

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2021.3.3f1
Ievades sistēmas pakete
  • 1.3.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Sākumā

Ja esat spēlējis spēles, lielākā daļa no jums to ir piedzīvojuši. Jūs, iespējams, esat apturējis spēli un saglabājis vai ielādējis savus spēles datus, lai tos pārtrauktu.

Veidojot spēli, parasti ir jāizveido šī saglabāšanas un ielādes funkcija, jāiestata opcijas utt. Šeit mēs centīsimies to panākt, izmantojot vienkāršāko PlayerPrefs datu glabāšanas un ielādes veidu.

UI izvietojums

Šeit mēs centīsimies saglabāt vai lasīt ievades saturu, ievietojot ievades vienumus un pogas un noklikšķinot uz pogas. Pagaidām jums ir nepieciešamas tikai vismaz divas pogas un viens ievades lauks, tāpēc jūtieties brīvi tos ievietot.

Sagatavošanās lietotāja saskarnes apstrādei

Vispirms ieviesīsim saglabāšanas pogu. Kā izveidot pogas notikumu, tiek ieviests šādos padomos, tāpēc es uzskaitīšu tikai attiecīgās daļas.

Atstājiet skripta nosaukumu ButtonEvent kā .

Skripts izskatās šādi:

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

Tā kā ir nepieciešams iegūt vai iestatīt ievadīto vērtību, sagatavojiet to kā lauku. Iekļaujiet arī metodi, kas tiks izsaukta, noklikšķinot uz katras pogas.

Pievienojiet EventSystem skriptu un iestatiet katru ievades lauku. Tas var būt jebkurš objekts, kuru vēlaties pievienot.

Iestatiet, lai katra metode tiktu izsaukta, kad tiek noklikšķināts uz pogas.

Saglabāt vērtību

Tagad, kad metode tiek izsaukta, noklikšķinot OnClickSave uz saglabāšanas pogas, saglabāšanas pogas process ir šāds.

/// <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 Metode ir iestatīta uz atslēgu un vērtību, kas jāsaglabā. Atslēga tiek norādīta, ielādējot saglabātos datus. SetString Šeit mēs saucam par metodi, jo saglabājamā vērtība ir virkne. int float Ja vēlaties SetInt saglabāt cita tipa vērtību, piemēram, un , ir tādas metodes kā un SetFloat , tāpēc izsauciet tās atbilstoši tipam.

PlayerPrefs.Save Visbeidzot, izsauciet metodi, lai apstiprinātu saglabāšanu. Patiesībā to var saglabāt pat tad, ja jūs neizsaucat šo metodi, bet drošāk to izsaukt.

Tomēr, pat ja jūs šajā brīdī palaižat spēli, tas tikai saglabās vērtību, tāpēc jūs nezināt, vai tas tika pareizi saglabāts. Ja pārbaudāt saglabāto atrašanās vietu, varat redzēt datus, bet ...

Iegūstiet saglabātu vērtību

Pēc tam īstenojiet saglabāto datu ielādes procesu. Pogas apstrāde ir tāda pati kā saglabāšanas process, tāpēc šeit ir aprakstīts tikai ielādes procesa kods.

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

Izmantojiet šo metodi, lai PlayerPrefs.GetString ielādētu saglabātos datus. Ar šo atslēgu saglabāto vērtību var iegūt, norādot atslēgu, kas norādīta sadaļā Saglabāt kā argumentu. Vērtība tiek izgūta metodes atgrieztajā vērtībā.

Tas tiek saglabāts arī kā virkne tāpat kā saglabājot, tāpēc GetString mēs to saucam par metodi. int float Ja jūs ietaupāt GetIntGetFloat ar vai , zvaniet uz metodi.

Izgūtā vērtība tiek atspoguļota ievades laukā.

Tagad varat saglabāt un ielādēt datus. Es nedomāju, ka ir kādi sarežģīti elementi.

Mēģiniet to pārvietot

Palaidiet, lai ievadītu, saglabātu un ielādētu. Saglabātie dati tiek saglabāti, un tos vajadzētu būt iespējai ielādēt pat tad, ja izejat no spēles un atkārtoti to palaižat. Ja jūs varat apstiprināt šādu modeli, es domāju, ka nav problēmu.

  1. Vērtības ievadīšana
  2. Noklikšķiniet uz pogas Saglabāt
  3. Ievadītās vērtības mainīšana
  4. Noklikšķiniet uz importēšanas pogas, lai apstiprinātu, ka tā atgriežas pie saglabātās vērtības.
  5. Iziet no spēles
  6. Atkārtoti palaidiet spēli un noklikšķiniet uz ielādes pogas, lai redzētu, vai varat atcerēties saglabāto vērtību
  7. Ievadiet citu vērtību, saglabājiet to un pārbaudiet, vai varat lasīt to pašu ar atjaunināto vērtību

Datu fragmenta saglabāšana un ielāde

Līdz šim izlasē ir saglabāti tikai daži parametri. Faktiski veidojot spēli, saglabājamo parametru skaits nepārtraukti palielināsies, un, ja jūs tos lasīsit un rakstīsit pa vienam, kods būs milzīgs. Tāpēc, veidojot faktiski saglabājamos datus, teorija ir apvienot saglabājamos datus vienā un pēc tam tos visus uzrakstīt uzreiz.

Vispirms izveidojiet saglabāšanas datu struktūru kā klasi. Mērķis ir spēt lasīt un rakstīt datus uzreiz, kā arī klasificēt datus, lai kodam būtu vieglāk piekļūt katram datu gabalam.

Šie ir spēļu nodarbību saglabāšanas piemēri: To var rakstīt jebkur, kur uz to var atsaukties no cita koda. Šī klases struktūra ir paraugs, tāpēc reālā spēlē jums tas ir jāizveido savai spēlei.

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

Šoreiz izmantotajā List Unity standarta funkcijā, ja definējat masīvus vai jums ir vairākas unikālas klases, System.Serializable Ja nepievienosit atribūtu, tas netiks pareizi konvertēts, tāpēc Character es iestatīju atribūtu klasei Serializable .

Kad esat izveidojis mācību priekšmetu, izveidojiet saglabājamos datus. Protams, jums var būt šīs klases gadījumi visā spēlē. Tas ir atkarīgs no tā, kā spēle tiek veidota.

// 保存するデータ作成
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ēc datu iestatīšanas JsonUtility.ToJson klases gadījumā konvertējiet (serializējiet) tos JSON virknē ar šo metodi. Tā kā objekta vērtība ir viena "virkne", ko sauc par JSON ar datu struktūru, visusPlayerPrefs.SetString datus var rakstīt ar vienu zvanu uz metodi.

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

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

Tomēr, tā kā visi dati tiek apkopoti vienā, nav iespējams saglabāt tikai daļu no tiem vai lasīt tikai daļu no tiem. Tāpēc ir vēlams to padarīt par vienību, kuru ir viegli apkopot, piemēram, apvienojot to kā vienu objektu vienam saglabāšanas datiem.

Lasot saglabātos datus, saglabājot varat veikt reverso apstrādi. Lasāmie dati ir viena virkne, bet saturs ir JSON formāta datu struktūras, tāpēc JsonUtility.FromJson tos var pārveidot (deserializēt) klases instancēs, izmantojot metodes. Tomēr, tā kā virknē mums nav FromJson informācijas, uz kuru klasi konvertēt, mums ir jānorāda veids, izsaucot metodi.

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

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

Ja mēģināt to pārvietot, jūs varat redzēt, ka tas ir saglabāts pareizi un to var ielādēt.

Starp citu, mēs šoreiz izmantojam Unity standarta JsonUtility klases, taču tās, iespējams, nevarēs pārveidot klases ar sarežģītām datu struktūrām, jo tās nav ļoti funkcionālas. Tādā gadījumā ieteicams izmantot citas bibliotēkas.

Kur tiek glabāti dati?

PlayerPrefs Kad izmantojat mācību priekšmetu datu glabāšanai, atrašanās vieta, kur tie tiek saglabāti, ir atkarīga no platformas, kurā darbojaties. Lūdzu, skatiet oficiālo lapu zemāk, kur tas faktiski tiek glabāts.

Dažās vidēs, piemēram, Windows, tās netiek saglabātas failā, bet gan sistēmas iestatījumos, piemēram, reģistrā. Tā kā tas nav fails, tas nav piemērots saglabāto datu saglabāšanai , piemēram, ja saglabātie dati ir ļoti lieli vai PlayerPrefs vēlaties sinhronizēt saglabātos datus ar citu vidi. Un otrādi, ja saglabājamie dati ir opcijas līmeņa lielums vai ja tā ir atsevišķa spēle, kas tiek pabeigta tikai tajā vidē, kurā tā darbojas, es domāju, ka ir PlayerPrefs iespējams saglabāt datus .

Turklāt saglabātās atrašanās vietas ceļu var ietekmēt iestatījumi "CompanyName" un "ProductName". Ja vēlaties publicēt savu spēli, jums ir jāizlemj par šīm vērtībām jau labu laiku iepriekš, nevis jāmaina tās pēc spēles publicēšanas.

Par datu šifrēšanu

Saglabātie dati netiek automātiski šifrēti. Ja spēlētāja spējas tiek saglabātas tādas, kādas tās ir, lietotājs brīvi pārrakstīs vērtības, kas ietekmēs spēli.

Vai jums ir nepieciešams šifrēt, un, ja jā, kāds izturības līmenis ir nepieciešams, un kā rīkoties ar šifrēšanas atslēgu? Lietas, kas jāņem vērā, dažādās spēlēs atšķiras.

Es šeit nepaskaidrošu šifrēšanas metodi, bet, ja jūs to pameklējat internetā, tā ir galvenā valoda un rīks, tāpēc es domāju, ka ir dažādas metodes. Pagaidām, ja jūs nesaprotat saglabātā satura nozīmi, pat ja atverat failu, un, ja jūs slikti manipulējat ar datiem, jūs nevarēsiet izmantot saglabātos datus, es domāju, ka būs zināms krāpšanas apkarošanas efekts.