দৃশ্যের মধ্যে ভেরিয়েবলগুলি সংরক্ষণ করার একটি আদর্শ উপায় হ'ল সিঙ্গলটন ম্যানেজার শ্রেণির মাধ্যমে। অবিরাম ডেটা সঞ্চয় করার জন্য একটি শ্রেণি তৈরি করে এবং সেই শ্রেণিটি সেট করে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);
}
}
আপনি নীচে সিঙ্গেলটন কর্মে দেখতে পাচ্ছেন। মনে রাখবেন যে আমি প্রথম দৃশ্যটি চালানোর সাথে সাথে ডেটা ম্যানেজার অবজেক্টটি দৃশ্য-নির্দিষ্ট শিরোনাম থেকে ক্রমবর্ধমান ভিউতে "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
আরও বিভিন্ন ধরণের যেমন ভেক্টর এবং অ্যারে সমর্থন করার জন্য আরও বিস্তৃত স্ক্রিপ্ট আপলোড করেছেন ।