Käytä PlayerPrefsiä tietojen lukemiseen ja kirjoittamiseen

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 11
Unity-editori
  • 2021.3.3F1
Syöttöjärjestelmän paketti
  • 1.3.0

Tämän vinkin edellytykset

Seuraavat asetukset on tehty etukäteen tämän vinkin kuvauksen lähtökohtana.

Alun perin

Jos olette pelanneet pelejä, useimmat teistä ovat kokeneet sen. Olet todennäköisesti keskeyttänyt pelin ja tallentanut tai ladannut pelitietosi poistuaksesi käytöstä.

Kun luot peliä, sinun on yleensä luotava tämä tallennus- ja lataustoiminto, asetettava asetukset jne. Tässä yritämme saavuttaa tämän käyttämällä yksinkertaisinta PlayerPrefs tapaa tallentaa ja ladata tietoja.

Käyttöliittymän sijoittelu

Tässä yritämme tallentaa tai lukea syötetyn sisällön asettamalla syöttökohteet ja painikkeet ja napsauttamalla painiketta. Toistaiseksi tarvitset vain vähintään kaksi painiketta ja yhden syöttökentän, joten voit sijoittaa ne.

Käyttöliittymän käsittelyyn valmistautuminen

Otetaan ensin käyttöön tallennuspainike. Painiketapahtuman luominen esitellään seuraavissa vinkeissä, joten luettelen vain asiaankuuluvat osat.

Jätä komentosarjan nimeksi ButtonEvent .

Skripti näyttää tältä:

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

Koska syötetty arvo on tarpeen saada tai asettaa, valmistele se kenttänä. Sisällytä myös menetelmä, jota kutsutaan, kun napsautat kutakin painiketta.

Liitä EventSystem komentosarja kuhunkin syöttökenttään ja määritä se. Se voi olla mikä tahansa esine, jonka haluat liittää.

Aseta kukin menetelmä kutsumaan, kun painiketta napsautetaan.

Tallenna arvo

Nyt kun menetelmää kutsutaan, kun OnClickSave tallennuspainiketta napsautetaan, tallennuspainikkeen prosessi on seuraava.

/// <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 Menetelmäksi asetetaan avain ja tallennettava arvo. Avain määritetään ladattaessa tallennettuja tietoja. SetString Tässä kutsumme menetelmää, koska tallennettava arvo on merkkijono. int float Jos haluat SetInt tallentaa toisen tyyppisen arvon, kuten ja , on olemassa menetelmiä, kuten ja SetFloat , joten kutsu niitä tyypin mukaan.

PlayerPrefs.Save Soita lopuksi menetelmään tallennuksen vahvistamiseksi. Itse asiassa se voidaan tallentaa, vaikka et kutsu tätä menetelmää, mutta on turvallisempaa kutsua sitä.

Vaikka suoritat pelin tässä vaiheessa, se tallentaa vain arvon, joten et tiedä, onko se tallennettu oikein. Jos tarkistat tallennetun sijainnin, näet tiedot, mutta ...

Hanki tallennettu arvo

Toteuta seuraavaksi tallennettujen tietojen latausprosessi. Painikkeen käsittely on sama kuin tallennusprosessi, joten tässä kuvataan vain latausprosessin 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");
}

Käytä menetelmää tallennettujen tietojen lataamiseen PlayerPrefs.GetString . Voit saada kyseisellä avaimella tallennetun arvon määrittämällä argumentiksi Tallenna-kohdassa määritetyn avaimen. Arvo noudetaan menetelmän palautusarvosta.

Tämä tallennetaan myös merkkijonona samalla tavalla kuin tallennettaessa, joten GetString kutsumme menetelmää. int float Jos tallennat GetIntGetFloat tai , soita menetelmään.

Noudettu arvo näkyy syöttökentässä.

Voit nyt tallentaa ja ladata tiedot. En usko, että siinä on mitään vaikeita elementtejä.

Kokeile siirtää sitä

Syötä, tallenna ja lataa suorittamalla. Tallennetut tiedot säilyvät, ja ne pitäisi pystyä lataamaan, vaikka poistuisit pelistä ja suorittaisit sen uudelleen. Jos voit vahvistaa seuraavan mallin, mielestäni ei ole mitään ongelmaa.

  1. Anna arvo
  2. Klikkaa Tallenna-painiketta
  3. Syötetyn arvon muuttaminen
  4. Napsauta tuontipainiketta vahvistaaksesi, että se palaa tallennettuun arvoon.
  5. Poistu pelistä
  6. Suorita peli uudelleen ja napsauta latauspainiketta nähdäksesi, voitko palauttaa tallennetun arvon
  7. Kirjoita toinen arvo, tallenna se ja tarkista, voitko lukea saman päivitetyllä arvolla

Tallenna ja lataa osa tiedoista

Tähän mennessä otokseen on tallennettu vain muutama parametri. Kun todella teet peliä, tallennettavien parametrien määrä kasvaa tasaisesti, ja jos luet ja kirjoitat ne yksitellen, koodi on valtava. Siksi, kun luodaan tosiasiallisesti tallennettavia tietoja, teoria on yhdistää tallennettavat tiedot yhdeksi ja kirjoittaa ne sitten kaikki kerralla.

Luo ensin tallennustietorakenne luokkana. Tavoitteena on pystyä lukemaan ja kirjoittamaan tietoja kerralla, mutta myös luokittelemaan tiedot, jotta koodin on helpompi päästä käsiksi kuhunkin tietoon.

Seuraavassa on esimerkkejä pelien tallennusluokista: Se voidaan kirjoittaa mihin tahansa, mihin siihen voidaan viitata toisesta koodista. Tämä luokkarakenne on näyte, joten todellisessa pelissä sinun on luotava se pelillesi.

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

Tällä kertaa käytetyssä Unity-standardifunktiossa List , jos määrität matriiseja tai sinulla on useita yksilöllisiä luokkia, System.Serializable Jos et lisää attribuuttia, sitä ei muunneta oikein, joten Character asetin määritteen Serializable luokkaan.

Kun olet luonut kurssin, luo tallennettavat tiedot. Tietenkin sinulla voi olla tämän luokan esiintymiä koko pelin ajan. Tämä riippuu siitä, miten peli tehdään.

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

Kun olet asettanut JsonUtility.ToJson tiedot luokan esiintymään, muunna (sarjoittaa) se JSON-merkkijonoksi menetelmällä. Koska objektin arvo on yksi "merkkijono", jota kutsutaan JSON: ksi tietorakenteella, kaikkiPlayerPrefs.SetString tiedot voidaan kirjoittaa yhdellä kutsulla menetelmään.

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

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

Koska kaikki tiedot on kuitenkin kerätty yhteen, ei ole mahdollista tallentaa vain osaa siitä tai lukea vain osaa siitä. Siksi on suositeltavaa tehdä siitä yksikkö, joka on helppo tiivistää, kuten yhdistää se yhdeksi objektiksi yhdelle tallennustiedolle.

Kun luet tallennettuja tietoja, voit tehdä käänteisen käsittelyn tallennettaessa. Luettavat tiedot ovat yksi merkkijono, mutta sisältö on JSON-muotoisia tietorakenteita, joten JsonUtility.FromJson ne voidaan muuntaa (sarjoittaa) luokkaesiintymiksi menetelmillä. Koska merkkijonossa ei FromJson kuitenkaan ole tietoa siitä, mihin luokkaan muunnetaan, meidän on määritettävä tyyppi menetelmää kutsuttaessa.

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

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

Jos yrität siirtää sitä, näet, että se on tallennettu oikein ja että se voidaan ladata.

Muuten, käytämme Unity-standardiluokkia JsonUtility tällä kertaa, mutta ne eivät ehkä pysty muuntamaan luokkia monimutkaisilla tietorakenteilla, koska ne eivät ole kovin toimivia. Siinä tapauksessa on suositeltavaa käyttää muita kirjastoja.

Mihin tiedot tallennetaan?

PlayerPrefs Kun käytät luokkaa tietojen tallentamiseen, sijainti, johon ne tallennetaan, riippuu käyttämästäsi alustasta. Katso alla olevalta viralliselta sivulta, mihin se todella tallennetaan.

Joissakin ympäristöissä, kuten Windowsissa, niitä ei tallenneta tiedostoon, vaan järjestelmäasetuksiin, kuten rekisteriin. Koska se ei ole tiedosto, se ei sovellu tallennettujen tietojen tallentamiseen esimerkiksi jos tallennustiedot ovat erittäin suuria tai PlayerPrefs haluat synkronoida tallennetut tiedot toisen ympäristön kanssa. Toisaalta, jos tallennettavat tiedot ovat optiotason kokoisia tai jos se on itsenäinen peli, joka suoritetaan vain ympäristössä, jossa se on käynnissä, mielestäni on PlayerPrefs mahdollista tallentaa tiedot .

Lisäksi "CompanyName"- ja "ProductName"-asetukset voivat vaikuttaa tallennetun sijainnin polkuun. Jos haluat julkaista pelisi, sinun on päätettävä näistä arvoista hyvissä ajoin etukäteen eikä muutettava niitä pelin julkaisemisen jälkeen.

Tietoja tietojen salauksesta

Tallennettuja tietoja ei salata automaattisesti. Jos pelaajan kyvyt tallennetaan sellaisenaan, käyttäjä kirjoittaa vapaasti arvot, jotka vaikuttavat peliin.

Onko sinun salattava, ja jos on, mitä vahvuustasoa tarvitaan ja miten salausavainta käsitellään? Huomioon otettavat asiat vaihtelevat pelistä toiseen.

En selitä salausmenetelmää tässä, mutta jos etsit sitä Internetistä, se on tärkeä kieli ja työkalu, joten mielestäni on olemassa erilaisia menetelmiä. Toistaiseksi, jos et ymmärrä tallennetun sisällön merkitystä, vaikka avaat tiedoston, ja jos peukaloit tietoja huonosti, et voi käyttää tallennustietoja, mielestäni on jonkin verran petostentorjuntavaikutusta.