Menggunakan PlayerPrefs untuk membaca dan menulis data

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 11
Editor Kesatuan
  • 2021.3.3f1
Paket Sistem Input
  • 1.3.0

Prasyarat untuk tip ini

Pengaturan berikut telah dibuat sebelumnya sebagai premis untuk deskripsi tip ini.

Pada awalnya

Jika Anda pernah bermain game, sebagian besar dari Anda pernah mengalaminya. Anda mungkin telah menjeda game dan menyimpan atau memuat data pemutaran Anda untuk berhenti.

Saat membuat game, Anda biasanya perlu membuat fungsi simpan dan muat ini, mengatur opsi, dll. Di sini, kami akan mencoba mencapai ini menggunakan cara paling sederhana PlayerPrefs untuk menyimpan dan memuat data.

Penempatan UI

Di sini, kita akan mencoba menyimpan atau membaca konten input dengan menempatkan item input dan tombol dan mengklik tombol. Untuk saat ini, Anda hanya perlu setidaknya dua tombol dan satu bidang input, jadi jangan ragu untuk menempatkannya.

Mempersiapkan Pemrosesan UI

Pertama, mari kita terapkan tombol simpan. Cara membuat acara tombol diperkenalkan dalam tips berikut, jadi saya hanya akan mencantumkan bagian yang relevan.

Biarkan nama ButtonEvent skrip sebagai .

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

Karena perlu untuk mendapatkan atau menetapkan nilai yang dimasukkan, siapkan sebagai bidang. Juga, sertakan metode yang akan dipanggil ketika Anda mengklik setiap tombol.

Lampirkan skrip Anda EventSystem ke dan atur setiap bidang input. Itu bisa berupa benda apa saja yang ingin Anda lampirkan.

Atur setiap metode yang akan dipanggil saat tombol diklik.

Simpan nilainya

Sekarang metode ini dipanggil ketika OnClickSave tombol simpan diklik, proses tombol simpan adalah sebagai 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 Metode ini diatur ke kunci dan nilai yang akan disimpan. Kunci ditentukan saat memuat data yang disimpan. SetString Di sini kita memanggil metode karena nilai yang akan disimpan adalah string. int float Jika Anda ingin SetInt menyimpan nilai tipe lain, seperti dan , ada metode seperti dan SetFloat , jadi panggil mereka sesuai dengan jenisnya.

PlayerPrefs.Save Terakhir, panggil metode untuk mengonfirmasi penyimpanan. Sebenarnya, itu dapat disimpan bahkan jika Anda tidak memanggil metode ini, tetapi lebih aman untuk menyebutnya.

Namun, bahkan jika Anda menjalankan game pada titik ini, itu hanya akan menghemat nilainya, jadi Anda tidak akan tahu apakah itu disimpan dengan benar. Jika Anda memeriksa lokasi yang disimpan, Anda dapat melihat datanya, tetapi ...

Mendapatkan nilai yang disimpan

Selanjutnya, terapkan proses memuat data yang disimpan. Pemrosesan tombol sama dengan proses penyimpanan, jadi hanya kode proses pemuatan yang dijelaskan 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 metode ini untuk PlayerPrefs.GetString memuat data yang disimpan. Anda bisa mendapatkan nilai yang disimpan dengan kunci tersebut dengan menentukan kunci yang ditentukan dalam Simpan sebagai argumen. Nilai diambil dalam nilai pengembalian metode.

Ini juga disimpan sebagai string dengan cara yang sama seperti saat menyimpan, jadi GetString kita memanggil metode. int float Jika Anda GetIntGetFloat menabung dengan atau , hubungi metode ini.

Nilai yang diambil tercermin dalam bidang input.

Anda sekarang dapat menyimpan dan memuat data. Saya tidak berpikir ada elemen yang sulit.

Coba pindahkan

Jalankan untuk masuk, simpan, dan muat. Data yang disimpan tetap ada dan harus dapat dimuat bahkan jika Anda keluar dan menjalankan kembali game. Jika Anda dapat mengkonfirmasi pola berikut, saya pikir tidak ada masalah.

  1. Masukkan nilai
  2. Klik tombol Simpan
  3. Mengubah nilai yang Anda masukkan
  4. Klik tombol impor untuk mengonfirmasi bahwa itu kembali ke nilai yang disimpan.
  5. Keluar dari game
  6. Jalankan kembali game dan klik tombol muat untuk melihat apakah Anda dapat mengingat nilai yang disimpan
  7. Masukkan nilai yang berbeda, simpan, dan periksa apakah Anda dapat membaca yang sama dengan nilai yang diperbarui

Menyimpan dan memuat potongan data

Dalam sampel sejauh ini, hanya beberapa parameter yang telah disimpan. Saat Anda benar-benar membuat game, jumlah parameter yang akan disimpan akan terus meningkat, dan jika Anda membaca dan menulisnya satu per satu, kodenya akan sangat besar. Oleh karena itu, ketika membuat data untuk benar-benar disimpan, teorinya adalah menggabungkan data yang akan disimpan menjadi satu dan kemudian menulis semuanya sekaligus.

Pertama, buat struktur data penyimpanan sebagai kelas. Tujuannya adalah untuk dapat membaca dan menulis data sekaligus, tetapi juga untuk mengklasifikasikan data untuk memudahkan kode mengakses setiap bagian data.

Berikut ini adalah contoh kelas save game: Itu dapat ditulis di mana saja, dapat dirujuk dari kode lain. Struktur kelas ini adalah sampel, jadi dalam permainan nyata Anda harus membuatnya 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;
}

Dalam fungsi standar Unity yang List digunakan saat ini, jika Anda mendefinisikan array atau memiliki beberapa kelas unik, System.Serializable Jika Anda tidak menambahkan atribut, itu tidak akan dikonversi dengan benar, jadi Character saya mengatur atribut ke Serializable kelas.

Setelah Anda membuat kelas, buat data untuk disimpan. Tentu saja, Anda dapat memiliki contoh kelas ini sepanjang permainan. Ini tergantung pada bagaimana game 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, },
  },
};

Setelah mengatur JsonUtility.ToJson data dalam contoh kelas, konversikan (serialisasi) ke string JSON dengan metode ini. Karena nilai objek adalah "string" tunggal yang disebut JSON dengan struktur data, semuaPlayerPrefs.SetString data dapat ditulis dengan satu panggilan ke metode.

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

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

Namun, karena semua data dikumpulkan dalam satu, tidak mungkin untuk menyimpan hanya sebagian saja atau hanya membaca sebagian saja. Oleh karena itu, lebih baik menjadikannya unit yang mudah diringkas, seperti menggabungkannya sebagai satu objek untuk satu save data.

Saat membaca data yang disimpan, Anda dapat melakukan pemrosesan terbalik saat menyimpan. Data yang akan dibaca adalah string tunggal, tetapi isinya adalah struktur data berformat JSON, sehingga JsonUtility.FromJson dapat dikonversi (dideserialisasi) menjadi instance kelas dengan metode. Namun, karena kita tidak FromJson memiliki informasi dalam string kelas apa yang akan dikonversi, kita harus menentukan jenisnya saat memanggil metode.

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

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

Jika Anda mencoba memindahkannya, Anda dapat melihat bahwa itu disimpan dengan benar dan dapat dimuat.

Omong-omong, kami menggunakan kelas standar JsonUtility Unity kali ini, tetapi mereka mungkin tidak dapat mengonversi kelas dengan struktur data yang kompleks karena tidak terlalu fungsional. Dalam hal ini, disarankan untuk menggunakan pustaka lain.

Di mana data disimpan?

PlayerPrefs Saat Anda menggunakan kelas untuk menyimpan data, lokasi penyimpanannya bergantung pada platform tempat Anda menjalankan. Silakan merujuk ke halaman resmi di bawah ini untuk tempat penyimpanannya.

Di beberapa lingkungan, seperti Windows, mereka tidak disimpan dalam file, tetapi dalam pengaturan sistem seperti registri. Karena ini bukan file, ini tidak cocok untuk menyimpan data yang disimpan di , misalnya, jika data penyimpanan sangat besar atau PlayerPrefs Anda ingin menyinkronkan data penyimpanan dengan lingkungan lain. Sebaliknya, jika data yang akan disimpan adalah ukuran level opsi, atau jika itu adalah game mandiri yang diselesaikan hanya di lingkungan di mana ia berjalan, saya pikir adalah PlayerPrefs mungkin untuk menyimpan data di .

Selain itu, jalur lokasi yang disimpan mungkin dipengaruhi oleh pengaturan "CompanyName" dan "ProductName". Jika Anda ingin mempublikasikan game Anda, Anda harus memutuskan nilai-nilai ini jauh sebelumnya dan tidak mengubahnya setelah Anda mempublikasikan game Anda.

Tentang enkripsi data

Data yang disimpan tidak dienkripsi secara otomatis. Jika kemampuan pemain disimpan sebagaimana adanya, pengguna akan dengan bebas menulis ulang nilainya, yang akan memengaruhi permainan.

Apakah Anda perlu mengenkripsi, dan jika demikian, tingkat kekuatan apa yang diperlukan, dan bagaimana Anda menangani kunci enkripsi? Hal-hal yang perlu dipertimbangkan bervariasi dari game ke game.

Saya tidak akan menjelaskan metode enkripsi di sini, tetapi jika Anda mencarinya di Internet, ini adalah bahasa dan alat utama, jadi saya pikir ada berbagai metode. Untuk saat ini, jika Anda tidak memahami arti dari konten yang disimpan bahkan jika Anda membuka file, dan jika Anda merusak data dengan buruk, Anda tidak akan dapat menggunakan data simpan, saya pikir akan ada beberapa efek anti-penipuan.