Cara ideal untuk menyimpan variabel antar adegan adalah melalui kelas manajer tunggal. Dengan membuat kelas untuk menyimpan data yang persisten, dan mengatur kelas itu untuk DoNotDestroyOnLoad()
, Anda dapat memastikan itu segera diakses dan bertahan di antara adegan.
Opsi lain yang Anda miliki adalah menggunakan PlayerPrefs
kelas. PlayerPrefs
dirancang untuk memungkinkan Anda menyimpan data di antara sesi bermain , tetapi tetap berfungsi sebagai sarana untuk menyimpan data di antara adegan .
Menggunakan kelas singleton dan DoNotDestroyOnLoad()
Script berikut menciptakan kelas singleton persisten. Kelas singleton adalah kelas yang dirancang untuk hanya menjalankan satu instance pada saat yang sama. Dengan menyediakan fungsionalitas seperti itu, kita dapat dengan aman membuat referensi mandiri statis, untuk mengakses kelas dari mana saja. Ini berarti Anda dapat langsung mengakses kelas DataManager.instance
, termasuk variabel publik apa pun di dalam kelas.
using UnityEngine;
/// <summary>Manages data for persistance between levels.</summary>
public class DataManager : MonoBehaviour
{
/// <summary>Static reference to the instance of our DataManager</summary>
public static DataManager instance;
/// <summary>The player's current score.</summary>
public int score;
/// <summary>The player's remaining health.</summary>
public int health;
/// <summary>The player's remaining lives.</summary>
public int lives;
/// <summary>Awake is called when the script instance is being loaded.</summary>
void Awake()
{
// If the instance reference has not been set, yet,
if (instance == null)
{
// Set this instance as the instance reference.
instance = this;
}
else if(instance != this)
{
// If the instance reference has already been set, and this is not the
// the instance reference, destroy this game object.
Destroy(gameObject);
}
// Do not destroy this object, when we load a new scene.
DontDestroyOnLoad(gameObject);
}
}
Anda dapat melihat singleton beraksi, di bawah ini. Perhatikan bahwa segera setelah saya menjalankan adegan awal, objek DataManager bergerak dari heading khusus adegan ke heading "DontDestroyOnLoad", pada tampilan hierarki.
Menggunakan PlayerPrefs
kelas
Unity memiliki built in class untuk mengelola data persisten dasar yang dipanggilPlayerPrefs
. Setiap data yang dikomit ke PlayerPrefs
file akan bertahan di seluruh sesi permainan , jadi tentu saja, itu mampu bertahan data di seluruh adegan.
The PlayerPrefs
File dapat menyimpan variabel jenis string
, int
dan float
. Ketika kami memasukkan nilai ke dalam PlayerPrefs
file, kami memberikan tambahan string
sebagai kunci. Kami menggunakan kunci yang sama untuk kemudian mengambil nilai kami dari PlayerPref
file.
using UnityEngine;
/// <summary>Manages data for persistance between play sessions.</summary>
public class SaveManager : MonoBehaviour
{
/// <summary>The player's name.</summary>
public string playerName = "";
/// <summary>The player's score.</summary>
public int playerScore = 0;
/// <summary>The player's health value.</summary>
public float playerHealth = 0f;
/// <summary>Static record of the key for saving and loading playerName.</summary>
private static string playerNameKey = "PLAYER_NAME";
/// <summary>Static record of the key for saving and loading playerScore.</summary>
private static string playerScoreKey = "PLAYER_SCORE";
/// <summary>Static record of the key for saving and loading playerHealth.</summary>
private static string playerHealthKey = "PLAYER_HEALTH";
/// <summary>Saves playerName, playerScore and
/// playerHealth to the PlayerPrefs file.</summary>
public void Save()
{
// Set the values to the PlayerPrefs file using their corresponding keys.
PlayerPrefs.SetString(playerNameKey, playerName);
PlayerPrefs.SetInt(playerScoreKey, playerScore);
PlayerPrefs.SetFloat(playerHealthKey, playerHealth);
// Manually save the PlayerPrefs file to disk, in case we experience a crash
PlayerPrefs.Save();
}
/// <summary>Saves playerName, playerScore and playerHealth
// from the PlayerPrefs file.</summary>
public void Load()
{
// If the PlayerPrefs file currently has a value registered to the playerNameKey,
if (PlayerPrefs.HasKey(playerNameKey))
{
// load playerName from the PlayerPrefs file.
playerName = PlayerPrefs.GetString(playerNameKey);
}
// If the PlayerPrefs file currently has a value registered to the playerScoreKey,
if (PlayerPrefs.HasKey(playerScoreKey))
{
// load playerScore from the PlayerPrefs file.
playerScore = PlayerPrefs.GetInt(playerScoreKey);
}
// If the PlayerPrefs file currently has a value registered to the playerHealthKey,
if (PlayerPrefs.HasKey(playerHealthKey))
{
// load playerHealth from the PlayerPrefs file.
playerHealth = PlayerPrefs.GetFloat(playerHealthKey);
}
}
/// <summary>Deletes all values from the PlayerPrefs file.</summary>
public void Delete()
{
// Delete all values from the PlayerPrefs file.
PlayerPrefs.DeleteAll();
}
}
Perhatikan bahwa saya mengambil tindakan pencegahan tambahan, saat menangani PlayerPrefs
file:
- Saya telah menyimpan setiap tombol sebagai
private static string
. Ini memungkinkan saya untuk menjamin bahwa saya selalu menggunakan kunci yang benar, dan itu berarti bahwa jika saya harus mengubah kunci untuk alasan apa pun, saya tidak perlu memastikan saya mengubah semua referensi untuk itu.
- Saya menyimpan
PlayerPrefs
file ke disk setelah menulis ke sana. Ini mungkin tidak akan membuat perbedaan, jika Anda tidak menerapkan kegigihan data di seluruh sesi bermain. PlayerPrefs
akan menyimpan ke disk saat aplikasi normal ditutup, tetapi mungkin tidak secara otomatis memanggil jika game Anda crash.
- Saya benar-benar memeriksa bahwa setiap kunci ada di
PlayerPrefs
, sebelum saya mencoba untuk mengambil nilai yang terkait dengannya. Ini mungkin tampak seperti mengecek tidak ada gunanya, tetapi ini adalah praktik yang baik untuk dilakukan.
- Saya punya
Delete
metode yang segera menghapus PlayerPrefs
file. Jika Anda tidak ingin memasukkan data yang persisten di seluruh sesi permainan, Anda dapat mempertimbangkan untuk memanggil metode ini Awake
. Dengan membersihkan PlayerPrefs
file pada awal setiap pertandingan, Anda memastikan bahwa setiap data yang tidak bertahan dari sesi sebelumnya tidak keliru ditangani sebagai data dari saat sesi.
Anda dapat melihat PlayerPrefs
aksi, di bawah. Perhatikan bahwa ketika saya mengklik "Simpan Data", saya langsung memanggil Save
metode, dan ketika saya mengklik "Muat Data", saya langsung memanggil Load
metode. Implementasi Anda sendiri kemungkinan akan bervariasi, tetapi ini menunjukkan dasar-dasarnya.
Sebagai catatan terakhir, saya harus menunjukkan bahwa Anda dapat memperluas dasar PlayerPrefs
, untuk menyimpan jenis yang lebih berguna. JPTheK9 memberikan jawaban yang baik untuk pertanyaan serupa , di mana mereka menyediakan skrip untuk membuat serial array ke dalam bentuk string, untuk disimpan dalam PlayerPrefs
file. Mereka juga mengarahkan kami ke Unify Community Wiki , di mana pengguna telah mengunggah PlayerPrefsX
skrip yang lebih luas untuk memungkinkan dukungan untuk berbagai jenis yang lebih besar, seperti vektor dan array.