Gunakan PlayerPrefs untuk membaca dan menulis data

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2021.3.3F1
Pakej Sistem Input
  • 1.3.0

Prasyarat untuk petua ini

Tetapan berikut telah dibuat terlebih dahulu sebagai premis untuk penerangan petua ini.

Pada mulanya

Jika anda telah bermain permainan, kebanyakan anda telah mengalaminya. Anda mungkin telah menjeda permainan dan menyimpan atau memuatkan data permainan anda untuk berhenti.

Apabila membuat permainan, anda biasanya perlu membuat fungsi simpan dan beban ini, menetapkan pilihan, dll. Di sini, kami akan cuba mencapainya menggunakan cara paling PlayerPrefs mudah untuk menyimpan dan memuatkan data.

Penempatan UI

Di sini, kami akan cuba menyimpan atau membaca kandungan input dengan meletakkan item dan butang input dan mengklik butang. Buat masa ini, anda hanya memerlukan sekurang-kurangnya dua butang dan satu medan input, jadi jangan ragu untuk meletakkannya.

Persediaan untuk Pemprosesan UI

Pertama, mari kita laksanakan butang simpan. Cara membuat acara butang diperkenalkan dalam petua berikut, jadi saya hanya akan menyenaraikan bahagian yang berkaitan.

Tinggalkan nama ButtonEvent skrip sebagai .

Skrip kelihatan seperti ini:

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

Oleh kerana perlu mendapatkan atau menetapkan nilai yang dimasukkan, sediakannya sebagai medan. Juga, sertakan kaedah yang akan dipanggil apabila anda mengklik setiap butang.

Lampirkan skrip anda EventSystem dan tetapkan setiap medan input. Ia boleh menjadi objek yang ingin anda lampirkan.

Tetapkan setiap kaedah yang akan dipanggil apabila butang diklik.

Simpan nilai

Sekarang kaedah itu dipanggil apabila OnClickSave butang simpan diklik, proses butang simpan adalah seperti berikut.

/// <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 Kaedah ini ditetapkan kepada kunci dan nilai yang akan disimpan. Kekunci ditentukan semasa memuatkan data yang disimpan. SetString Di sini kita memanggil kaedah kerana nilai yang akan disimpan adalah rentetan. int float Jika anda ingin SetInt menyimpan nilai jenis lain, seperti dan , terdapat kaedah seperti dan SetFloat , jadi panggil mereka mengikut jenis.

PlayerPrefs.Save Akhirnya, hubungi kaedah untuk mengesahkan simpan. Sebenarnya, ia mungkin disimpan walaupun anda tidak memanggil kaedah ini, tetapi lebih selamat untuk memanggilnya.

Walau bagaimanapun, walaupun anda menjalankan permainan pada ketika ini, ia hanya akan menjimatkan nilai, jadi anda tidak akan tahu sama ada ia disimpan dengan betul. Jika anda menyemak lokasi yang disimpan, anda boleh melihat data, tetapi ...

Dapatkan nilai yang disimpan

Seterusnya, laksanakan proses memuatkan data yang disimpan. Pemprosesan butang adalah sama dengan proses simpan, jadi hanya kod proses pemuatan diterangkan di sini.

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

Gunakan kaedah PlayerPrefs.GetString untuk memuatkan data yang disimpan. Anda boleh mendapatkan nilai yang disimpan dengan kunci tersebut dengan menentukan kekunci yang ditentukan dalam Simpan sebagai argumen. Nilai diambil dalam nilai pulangan kaedah.

Ini juga disimpan sebagai rentetan dengan cara yang sama seperti semasa menyimpan, jadi GetString kami memanggil kaedah tersebut. int float Jika anda GetIntGetFloat menyimpan dengan atau , hubungi kaedah tersebut.

Nilai yang diambil ditunjukkan dalam medan input.

Anda kini boleh menyimpan dan memuatkan data. Saya rasa tidak ada unsur yang sukar.

Cuba gerakkannya

Jalankan untuk memasuki, menyimpan, dan memuatkan. Data yang disimpan berterusan dan sepatutnya dapat dimuatkan walaupun anda keluar dan menjalankan semula permainan. Jika anda boleh mengesahkan corak berikut, saya rasa tidak ada masalah.

  1. Masukkan nilai
  2. Klik butang Simpan
  3. Mengubah nilai yang anda masukkan
  4. Klik butang import untuk mengesahkan bahawa ia kembali kepada nilai yang disimpan.
  5. Keluar dari permainan
  6. Jalankan semula permainan dan klik butang muat untuk melihat sama ada anda boleh menarik balik nilai yang disimpan
  7. Masukkan nilai yang berbeza, simpan dan semak sama ada anda boleh membaca sama dengan nilai yang dikemas kini

Simpan dan muatkan sebahagian data

Dalam sampel setakat ini, hanya beberapa parameter yang telah disimpan. Seperti yang anda benar-benar membuat permainan, bilangan parameter yang akan disimpan akan meningkat dengan mantap, dan jika anda membaca dan menulisnya satu demi satu, kod itu akan menjadi sangat besar. Oleh itu, apabila mencipta data untuk benar-benar disimpan, teori ini adalah untuk menggabungkan data untuk disimpan menjadi satu dan kemudian menulis semuanya sekaligus.

Mula-mula, cipta struktur data simpan sebagai kelas. Matlamatnya adalah untuk dapat membaca dan menulis data sekaligus, tetapi juga untuk mengklasifikasikan data untuk memudahkan kod mengakses setiap bahagian data.

Berikut adalah contoh kelas permainan simpan: Ia boleh ditulis di mana sahaja ia boleh dirujuk dari kod lain. Struktur kelas ini adalah sampel, jadi dalam permainan sebenar anda perlu menciptanya untuk permainan anda.

/// <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 Dalam fungsi standard Perpaduan yang digunakan kali ini, jika anda menentukan tatasusunan atau mempunyai pelbagai kelas unik, System.Serializable Jika anda tidak menambah atribut, ia tidak akan ditukar dengan betul, jadi Character saya menetapkan atribut ke Serializable kelas.

Selepas anda mencipta kelas, cipta data untuk disimpan. Sudah tentu, anda boleh mempunyai contoh kelas ini sepanjang permainan. Ini bergantung kepada bagaimana permainan dibuat.

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

Selepas menetapkan JsonUtility.ToJson data dalam contoh kelas, tukar (bersiri) kepada rentetan JSON dengan kaedah. Oleh kerana nilai objek adalah "rentetan" tunggal yang dipanggil JSON dengan struktur data, semuaPlayerPrefs.SetString data boleh ditulis dengan panggilan tunggal ke kaedah tersebut.

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

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

Walau bagaimanapun, kerana semua data dikumpulkan dalam satu, tidak mungkin untuk menyimpan hanya sebahagian daripadanya atau hanya membaca sebahagian daripadanya. Oleh itu, adalah lebih baik untuk menjadikannya satu unit yang mudah diringkaskan, seperti menggabungkannya sebagai satu objek untuk satu menyimpan data.

Apabila membaca data yang disimpan, anda boleh melakukan pemprosesan terbalik semasa menyimpan. Data yang hendak dibaca ialah rentetan tunggal, tetapi kandungannya ialah struktur data berformat JSON, supaya JsonUtility.FromJson ia boleh ditukar (deserialized) kepada contoh kelas mengikut kaedah. Walau bagaimanapun, kerana kita tidak FromJson mempunyai maklumat dalam rentetan kelas apa yang hendak ditukar, kita mesti menentukan jenis apabila memanggil kaedah tersebut.

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

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

Jika anda cuba memindahkannya, anda dapat melihat bahawa ia disimpan dengan betul dan boleh dimuatkan.

Dengan cara ini, kita menggunakan kelas standard JsonUtility Perpaduan kali ini, tetapi mereka mungkin tidak dapat menukar kelas dengan struktur data yang kompleks kerana mereka tidak begitu berfungsi. Dalam kes itu, adalah disyorkan untuk menggunakan perpustakaan lain.

Di manakah data disimpan?

PlayerPrefs Apabila anda menggunakan kelas untuk menyimpan data, lokasi di mana ia disimpan bergantung pada platform yang anda jalankan. Sila rujuk halaman rasmi di bawah untuk di mana ia benar-benar disimpan.

Dalam sesetengah persekitaran, seperti Windows, mereka tidak disimpan dalam fail, tetapi dalam tetapan sistem seperti pendaftaran. Oleh kerana ia bukan fail, ia tidak sesuai untuk menyimpan data yang disimpan dalam , contohnya, jika data simpan sangat besar atau PlayerPrefs anda ingin menyegerakkan data simpan dengan persekitaran lain. Sebaliknya, jika data yang hendak disimpan adalah saiz tahap opsyen, atau jika ia adalah permainan mandiri yang diselesaikan hanya dalam persekitaran di mana ia berjalan, saya fikir adalah PlayerPrefs mungkin untuk menyimpan data dalam .

Di samping itu, laluan lokasi yang disimpan mungkin dipengaruhi oleh tetapan "Nama Syarikat" dan "Nama Produk". Jika anda ingin menerbitkan permainan anda, anda perlu memutuskan nilai-nilai ini terlebih dahulu dan tidak mengubahnya sebaik sahaja anda menerbitkan permainan anda.

Perihal penyulitan data

Data yang disimpan tidak disulitkan secara automatik. Sekiranya kebolehan pemain disimpan seperti sedia ada, pengguna akan menulis semula nilai-nilai secara bebas, yang akan menjejaskan permainan.

Adakah anda perlu menyulitkan, dan jika ya, tahap kekuatan apa yang diperlukan, dan bagaimana anda mengendalikan kunci penyulitan? Perkara yang perlu dipertimbangkan berbeza dari permainan ke permainan.

Saya tidak akan menerangkan kaedah penyulitan di sini, tetapi jika anda melihatnya di Internet, ia adalah bahasa dan alat utama, jadi saya fikir terdapat pelbagai kaedah. Buat masa ini, jika anda tidak memahami maksud kandungan yang disimpan walaupun anda membuka fail, dan jika anda mengganggu data dengan buruk, anda tidak akan dapat menggunakan data simpan, saya fikir akan ada beberapa kesan anti-penipuan.