एक एकल प्रबंधक वर्ग के माध्यम से दृश्यों के बीच चर को स्टोर करने का एक आदर्श तरीका है। लगातार डेटा संग्रहीत करने के लिए एक क्लास बनाकर, और उस क्लास को सेट करके DoNotDestroyOnLoad()
, आप यह सुनिश्चित कर सकते हैं कि यह तुरंत सुलभ हो और दृश्यों के बीच बना रहे।
आपके पास एक और विकल्प PlayerPrefs
कक्षा का उपयोग करना है । PlayerPrefs
आपको प्ले सेशन के बीच डेटा बचाने की अनुमति देने के लिए डिज़ाइन किया गया है , लेकिन यह अभी भी दृश्यों के बीच डेटा को बचाने के साधन के रूप में काम करेगा ।
एकल वर्ग का उपयोग करना और DoNotDestroyOnLoad()
निम्न स्क्रिप्ट एक निरंतर एकल वर्ग बनाता है। एक सिंगलटन क्लास एक ऐसा वर्ग है जिसे केवल एक ही समय में एक ही उदाहरण चलाने के लिए डिज़ाइन किया गया है। इस तरह की कार्यक्षमता प्रदान करके, हम सुरक्षित रूप से एक स्थिर आत्म-संदर्भ बना सकते हैं, कहीं से भी कक्षा तक पहुँचने के लिए। इसका मतलब यह है कि आप कक्षा के साथ DataManager.instance
किसी भी सार्वजनिक चर सहित सीधे वर्ग तक पहुंच सकते हैं ।
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);
}
}
आप एक्शन में सिंगलटन को नीचे देख सकते हैं। ध्यान दें कि जैसे ही मैं प्रारंभिक दृश्य चलाता हूं, DataManager ऑब्जेक्ट दृश्य-विशिष्ट शीर्षक से "DontDestroyOnLoad" शीर्षक पर, पदानुक्रम दृश्य पर चलता है।
PlayerPrefs
कक्षा का उपयोग करना
एकता के पास एक अंतर्निहित वर्ग है जिसे मूलभूत सतत डेटा कहा जाता हैPlayerPrefs
। PlayerPrefs
फ़ाइल के लिए प्रतिबद्ध कोई भी डेटा गेम सत्रों में बना रहेगा , इसलिए स्वाभाविक रूप से, यह दृश्यों में डेटा को बनाए रखने में सक्षम है।
PlayerPrefs
फ़ाइल प्रकार के चर स्टोर कर सकते हैं string
, int
और float
। जब हम PlayerPrefs
फ़ाइल में मान सम्मिलित करते हैं, तो हम string
कुंजी के रूप में एक अतिरिक्त प्रदान करते हैं । हम बाद में PlayerPref
फ़ाइल से अपने मूल्यों को पुनः प्राप्त करने के लिए उसी कुंजी का उपयोग करते हैं ।
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
फ़ाइल संभालते समय मैं अतिरिक्त सावधानी बरतता हूँ :
- मैंने प्रत्येक कुंजी को एक के रूप में सहेजा है
private static string
। यह मुझे गारंटी देता है कि मैं हमेशा सही कुंजी का उपयोग कर रहा हूं, और इसका मतलब है कि अगर मुझे किसी भी कारण से कुंजी को बदलना है, तो मुझे यह सुनिश्चित करने की आवश्यकता नहीं है कि मैं इसके सभी संदर्भों को बदल दूं।
- मैं
PlayerPrefs
फाइल को डिस्क पर लिखने के बाद सेव करता हूं । यह शायद कोई फर्क नहीं पड़ेगा, अगर आप प्ले सेशन के दौरान डेटा दृढ़ता को लागू नहीं करते हैं। एक सामान्य अनुप्रयोग के दौरान डिस्क PlayerPrefs
को बचाएगा, लेकिन यदि आपका गेम क्रैश हो जाता है तो यह स्वाभाविक रूप से कॉल नहीं कर सकता है।
- मैं वास्तव में जांचता हूं कि प्रत्येक कुंजी में मौजूद है
PlayerPrefs
, इससे पहले कि मैं इसके साथ जुड़े मूल्य को पुनः प्राप्त करने का प्रयास करता हूं। यह व्यर्थ डबल-चेकिंग की तरह लग सकता है, लेकिन यह एक अच्छा अभ्यास है।
- मेरे पास एक
Delete
विधि है जो तुरंत PlayerPrefs
फ़ाइल को मिटा देती है। यदि आप नाटक सत्र में डेटा दृढ़ता को शामिल करने का इरादा नहीं रखते हैं, तो आप इस पद्धति को कॉल करने पर विचार कर सकते हैं Awake
। साफ़ करके PlayerPrefs
प्रत्येक खेल की शुरुआत में फ़ाइल है, तो आप यह सुनिश्चित करें कि किसी भी डेटा को था पिछले सत्र से जारी रहती है गलती से डेटा के रूप में संभाला नहीं है वर्तमान सत्र।
आप PlayerPrefs
नीचे क्रिया में देख सकते हैं । ध्यान दें कि जब मैं "डेटा सहेजें" पर क्लिक करता हूं, तो मैं सीधे Save
विधि को कॉल कर रहा हूं, और जब मैं "लोड डेटा" पर क्लिक करता हूं, तो मैं सीधे Load
विधि को कॉल कर रहा हूं । आपके स्वयं के कार्यान्वयन की संभावना अलग-अलग होगी, लेकिन यह मूल बातें प्रदर्शित करता है।
अंतिम नोट के रूप में, मुझे इंगित करना चाहिए कि आप बुनियादी पर विस्तार कर सकते हैं PlayerPrefs
, अधिक उपयोगी प्रकारों को संग्रहीत कर सकते हैं। JPTheK9 एक समान प्रश्न का एक अच्छा उत्तर प्रदान करता है , जिसमें वे स्ट्रिंग PlayerPrefs
फ़ाइल में क्रमबद्ध सरणियों के लिए एक स्क्रिप्ट प्रदान करते हैं, एक फ़ाइल में संग्रहीत की जाती है । वे हमें यूनीफाइड कम्युनिटी विकी की ओर भी इशारा करते हैं , जहां एक उपयोगकर्ता नेPlayerPrefsX
वैक्टर और सरणियों जैसे अधिक प्रकार के प्रकारों के लिए समर्थन की अनुमति देने के लिए एक अधिक विस्तारक स्क्रिप्ट अपलोड की है ।