Değişkenleri sahneler arasında saklamanın ideal bir yolu, singleton manager sınıfıdır. Kalıcı verileri depolamak için bir sınıf oluşturarak ve o sınıfı ayarlayarak, DoNotDestroyOnLoad()
ona hemen erişilebildiğinden ve sahneler arasında kalıcı olduğundan emin olabilirsiniz.
Sahip olduğunuz başka bir seçenek de PlayerPrefs
sınıfı kullanmak . oyun oturumları arasındaPlayerPrefs
veri kaydetmenize izin vermek için tasarlanmıştır , ancak yine de sahneler arasında veri kaydetme aracı olarak işlev görecektir .
Singleton sınıfı kullanma ve DoNotDestroyOnLoad()
Aşağıdaki komut dosyası kalıcı bir singleton sınıfı oluşturur. Bir singleton sınıfı, aynı anda sadece tek bir örneği çalıştırmak için tasarlanmış bir sınıftır. Bu tür bir işlevselliği sağlayarak, sınıfa her yerden erişmek için güvenli bir statik referans oluşturabiliriz. Bu, sınıf DataManager.instance
içindeki genel değişkenler dahil olmak üzere sınıfa doğrudan erişebileceğiniz anlamına gelir .
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);
}
}
Singleton'u çalışırken görebilirsiniz. İlk sahneyi çalıştırdığımda, DataManager nesnesinin sahneye özgü başlıktan hiyerarşi görünümünde "DontDestroyOnLoad" başlığına geçtiğini unutmayın.
PlayerPrefs
Sınıfı kullanma
Birlik, çağrılan temel kalıcı verileri yönetmek için bir sınıf içinde yerleşiktirPlayerPrefs
. PlayerPrefs
Dosyaya işlenen herhangi bir veri oyun oturumları boyunca sürecek , bu yüzden doğal olarak, sahneler arasında verileri devam ettirme yeteneğine sahip.
PlayerPrefs
Dosya türlerinin değişkenleri saklayabilir string
, int
ve float
. PlayerPrefs
Dosyaya değerler eklediğimizde string
, anahtar olarak bir ek sağlıyoruz . Aynı anahtarı daha sonra PlayerPref
dosyadan değerlerimizi almak için kullanırız .
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();
}
}
PlayerPrefs
Dosyayı kullanırken ek önlemler aldığımı unutmayın :
- Her anahtarı a olarak kaydettim
private static string
. Bu, her zaman doğru anahtarı kullandığımı garanti etmeme izin verir ve bu, herhangi bir nedenle anahtarı değiştirmek zorunda kalırsam, tüm referansları değiştirdiğimden emin olmam gerekmediği anlamına gelir.
- Kurtarmam
PlayerPrefs
yazdıktan sonra diske dosyayı. Oyun oturumlarında veri kalıcılığını uygulamazsanız, bu muhtemelen bir fark yaratmayacaktır. PlayerPrefs
olacak normal bir uygulama yakın sırasında diske kaydetmek, ancak oyun çökerse doğal çağrı olmayabilir.
- Aslında kontrol her anahtar o var içinde
PlayerPrefs
onunla ilişkili bir değer almak için denemeden önce. Bu anlamsız çift kontrol gibi gözükebilir, ancak olması iyi bir uygulamadır.
Delete
Hemen PlayerPrefs
dosyayı silecek bir yöntemim var . Oyun oturumları arasında veri kalıcılığı eklemeyi düşünmüyorsanız, bu yöntemi çağırmayı düşünebilirsiniz Awake
. Temizleyerek PlayerPrefs
her oyun başlangıcında dosya, herhangi bir veri sağlamak vermedi önceki oturumdan devam yanlışlıkla gelen veri olarak işlenmiyor geçerli oturumda.
PlayerPrefs
Aşağıda eylemde görebilirsiniz . "Veri Kaydet" e tıkladığımda, doğrudan Save
yöntemi çağırdığımı ve "Veri Yükle" yi tıklattığımda, Load
yöntemi doğrudan çağırdığımı unutmayın . Kendi uygulamanız büyük olasılıkla değişecektir, ancak temellerini gösterir.
Son bir not olarak, PlayerPrefs
daha faydalı türler depolamak için temelde genişleyebileceğinizi belirtmeliyim. JPTheK9 , dizileri dizgede dizmek için bir dosyada saklamak için bir betik sağlayan benzer bir soruya iyi bir cevap sunarPlayerPrefs
. Ayrıca , bir kullanıcının vektörler ve diziler gibi daha çeşitli türler için desteğe izin vermek için daha geniş bir komut dosyası yüklediği Unify Community Wiki'ye de işaret ediyorlar .PlayerPrefsX