ڈیٹا پڑھنے اور لکھنے کے لئے PlayerPrefs استعمال کریں

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

تصدیق کا ماحول

Windows
  • ونڈوز 11
یونٹی ایڈیٹر
  • 2021.3.3f1
ان پٹ سسٹم پیکیج
  • 1.3.0

اس ٹوٹکے کے لئے ضروری شرائط

مندرجہ ذیل ترتیبات اس ٹپ کی وضاحت کے لئے بنیاد کے طور پر پیشگی بنائی گئی ہیں۔

سب سے پہلے

اگر آپ نے کھیل کھیلے ہیں تو، آپ میں سے زیادہ تر نے اس کا تجربہ کیا ہے. آپ نے شاید کسی گیم کو روک دیا ہے اور چھوڑنے کے لئے اپنے پلے ڈیٹا کو محفوظ یا لوڈ کیا ہے۔

گیم بناتے وقت ، آپ کو عام طور پر اس محفوظ اور لوڈ فنکشن ، سیٹ اختیارات وغیرہ کو بنانے کی ضرورت ہوتی ہے۔ یہاں ، ہم ڈیٹا ذخیرہ کرنے اور لوڈ کرنے کا سب سے آسان PlayerPrefs طریقہ استعمال کرتے ہوئے اسے حاصل کرنے کی کوشش کریں گے۔

UI Placement

یہاں ، ہم ان پٹ آئٹمز اور بٹن رکھ کر اور بٹن پر کلک کرکے ان پٹ مواد کو محفوظ کرنے یا پڑھنے کی کوشش کریں گے۔ فی الحال ، آپ کو صرف دو بٹن اور ایک ان پٹ فیلڈ کی ضرورت ہے ، لہذا انہیں رکھنے کے لئے آزاد محسوس کریں۔

یو آئی پروسیسنگ کے لئے تیاری

سب سے پہلے، آئیے محفوظ کریں کے بٹن کو نافذ کریں. بٹن ایونٹ بنانے کا طریقہ مندرجہ ذیل تجاویز میں متعارف کرایا گیا ہے ، لہذا میں صرف متعلقہ حصوں کی فہرست دوں گا۔

اسکرپٹ کا نام ButtonEvent اس طرح چھوڑ دیں۔

اسکرپٹ اس طرح نظر آتا ہے:

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

چونکہ داخل کردہ قیمت کو حاصل کرنا یا سیٹ کرنا ضروری ہے ، لہذا اسے فیلڈ کے طور پر تیار کریں۔ اس کے علاوہ ، وہ طریقہ شامل کریں جو ہر بٹن پر کلک کرنے پر کہا جائے گا۔

اپنے EventSystem اسکرپٹ کو ہر ان پٹ فیلڈ سے منسلک کریں اور سیٹ کریں۔ یہ کوئی بھی چیز ہوسکتی ہے جسے آپ منسلک کرنا چاہتے ہیں۔

بٹن پر کلک ہونے پر پکارنے کا ہر طریقہ سیٹ کریں۔

قیمت کو محفوظ کریں

اب جب کہ جب سیو بٹن پر کلک کیا جاتا ہے تو OnClickSave طریقہ کار کہا جاتا ہے ، محفوظ بٹن کا عمل مندرجہ ذیل ہے۔

/// <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 طریقہ ایک کلید اور ایک قدر کو محفوظ کرنے کے لئے سیٹ کیا گیا ہے۔ محفوظ کردہ ڈیٹا لوڈ کرتے وقت کلید کی وضاحت کی جاتی ہے۔ SetString یہاں ہم طریقہ کار کو کہہ رہے ہیں کیونکہ ذخیرہ کی جانے والی قیمت ایک تار ہے۔ int float اگر آپ کسی اور قسم کی قدر کو بچانا چاہتے SetInt ہیں ، جیسے اور ، اس طرح کے SetFloat طریقے موجود ہیں ، لہذا انہیں قسم کے مطابق کال کریں۔

PlayerPrefs.Save آخر میں ، محفوظ کرنے کی تصدیق کرنے کے لئے طریقہ پر کال کریں۔ دراصل ، اگر آپ اس طریقہ کار کو کال نہیں کرتے ہیں تو بھی اسے محفوظ کیا جاسکتا ہے ، لیکن اسے کال کرنا زیادہ محفوظ ہے۔

تاہم ، یہاں تک کہ اگر آپ اس مقام پر کھیل چلاتے ہیں تو ، یہ صرف قیمت کو بچائے گا ، لہذا آپ کو معلوم نہیں ہوگا کہ آیا یہ مناسب طریقے سے محفوظ کیا گیا تھا یا نہیں۔ اگر آپ محفوظ کردہ مقام چیک کرتے ہیں تو ، آپ ڈیٹا دیکھ سکتے ہیں ، لیکن ...

ایک محفوظ قیمت حاصل کریں

اگلا ، محفوظ کردہ ڈیٹا لوڈ کرنے کے عمل کو نافذ کریں۔ بٹن کی پروسیسنگ محفوظ کرنے کے عمل کی طرح ہی ہے ، لہذا صرف لوڈنگ کے عمل کا کوڈ یہاں بیان کیا گیا ہے۔

/// <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");
}

محفوظ کردہ ڈیٹا لوڈ کرنے کا PlayerPrefs.GetString طریقہ استعمال کریں۔ آپ ایک دلیل کے طور پر محفوظ کریں میں بیان کردہ کلید کی وضاحت کرکے اس کلید کے ساتھ محفوظ کردہ قدر حاصل کرسکتے ہیں۔ قیمت طریقہ کار کی واپسی کی قیمت میں بازیافت کی جاتی ہے.

یہ بھی اسی طرح ایک تار کے طور پر محفوظ کیا جاتا ہے جیسے بچت کرتے وقت، لہذا GetString ہم طریقہ کہتے ہیں. int float اگر آپ GetIntGetFloat اس کے ساتھ بچت کر رہے ہیں یا ، تو طریقہ پر کال کریں۔

بازیافت شدہ قیمت ان پٹ فیلڈ میں ظاہر ہوتی ہے۔

اب آپ ڈیٹا کو محفوظ اور لوڈ کرسکتے ہیں۔ مجھے نہیں لگتا کہ اس میں کوئی مشکل عناصر ہیں.

اسے منتقل کرنے کی کوشش کریں

داخل ہونے ، محفوظ کرنے اور لوڈ کرنے کے لئے دوڑیں۔ محفوظ کردہ ڈیٹا برقرار رہتا ہے اور اگر آپ باہر نکلتے ہیں اور کھیل کو دوبارہ چلاتے ہیں تو بھی اسے لوڈ کرنے کے قابل ہونا چاہئے۔ اگر آپ مندرجہ ذیل نمونے کی تصدیق کرسکتے ہیں تو ، مجھے لگتا ہے کہ کوئی مسئلہ نہیں ہے۔

  1. قیمت درج کریں
  2. محفوظ کریں کے بٹن پر کلک کریں
  3. آپ کے داخل کردہ قدر کو تبدیل کریں
  4. اس بات کی تصدیق کرنے کے لئے درآمد کے بٹن پر کلک کریں کہ یہ محفوظ کردہ قیمت پر واپس آتا ہے۔
  5. کھیل سے باہر نکلیں
  6. گیم کو دوبارہ چلائیں اور یہ دیکھنے کے لئے لوڈ بٹن پر کلک کریں کہ آیا آپ محفوظ کردہ قدر کو یاد کرسکتے ہیں یا نہیں۔
  7. ایک مختلف قیمت درج کریں ، اسے محفوظ کریں ، اور چیک کریں کہ آیا آپ اسے اپ ڈیٹ شدہ قدر کے ساتھ پڑھ سکتے ہیں یا نہیں۔

ڈیٹا کا ایک حصہ محفوظ اور لوڈ کریں

اب تک نمونے میں ، صرف چند پیرامیٹرز محفوظ کیے گئے ہیں۔ جیسا کہ آپ واقعی ایک گیم بناتے ہیں ، محفوظ کیے جانے والے پیرامیٹرز کی تعداد میں مسلسل اضافہ ہوگا ، اور اگر آپ انہیں ایک ایک کرکے پڑھتے اور لکھتے ہیں تو ، کوڈ بہت بڑا ہوگا۔ لہذا ، جب ڈیٹا کو اصل میں محفوظ کیا جاتا ہے تو ، نظریہ یہ ہے کہ ڈیٹا کو ایک میں محفوظ کرنے کے لئے یکجا کیا جائے اور پھر اسے ایک ہی وقت میں لکھیں۔

سب سے پہلے ، ایک کلاس کے طور پر ڈیٹا محفوظ کرنے کا ڈھانچہ بنائیں۔ مقصد ایک ہی وقت میں اعداد و شمار کو پڑھنے اور لکھنے کے قابل ہونا ہے ، لیکن ڈیٹا کی درجہ بندی کرنا بھی ہے تاکہ کوڈ کے لئے ڈیٹا کے ہر ٹکڑے تک رسائی آسان ہوجائے۔

سیو گیم کلاسز کی مثالیں درج ذیل ہیں: یہ کہیں بھی لکھا جا سکتا ہے یہ دوسرے کوڈ سے حوالہ دیا جا سکتا ہے. یہ کلاس ڈھانچہ ایک نمونہ ہے ، لہذا ایک حقیقی کھیل میں آپ کو اسے اپنے کھیل کے لئے بنانے کی ضرورت ہے۔

/// <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;
}

اس بار استعمال ہونے والے List یونٹی اسٹینڈرڈ فنکشن میں ، اگر آپ سرے کی وضاحت کرتے ہیں یا متعدد منفرد کلاسیں رکھتے ہیں ، System.Serializable اگر آپ کوئی خصوصیت شامل نہیں کرتے ہیں تو ، اسے صحیح طریقے سے تبدیل نہیں کیا جائے گا ، لہذا Character میں نے خصوصیت کو کلاس میں سیٹ کیا ہے Serializable ۔

کلاس بنانے کے بعد ، محفوظ کرنے کے لئے ڈیٹا بنائیں۔ یقینا ، آپ کو پورے کھیل میں اس کلاس کی مثالیں مل سکتی ہیں۔ یہ اس بات پر منحصر ہے کہ کھیل کس طرح بنایا جاتا ہے.

// 保存するデータ作成
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, },
  },
};

کلاس کی مثال میں ڈیٹا سیٹ کرنے JsonUtility.ToJson کے بعد ، اسے طریقہ کار کے ساتھ جے ایس او این سٹرنگ میں تبدیل (سیریلائز) کریں۔ چونکہ آبجیکٹ کی قیمت ایک واحد "سٹرنگ" ہے جسے ڈیٹا اسٹرکچر کے ساتھ جے ایس او این کہا جاتا ہے ، لہذا تمامPlayerPrefs.SetString اعداد و شمار کو طریقہ کار پر ایک ہی کال کے ساتھ لکھا جاسکتا ہے۔

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

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

تاہم ، چونکہ تمام اعداد و شمار ایک میں جمع کیے جاتے ہیں ، لہذا اس کا صرف ایک حصہ محفوظ کرنا یا اس کا صرف ایک حصہ پڑھنا ممکن نہیں ہے۔ لہذا ، اسے ایک یونٹ بنانا بہتر ہے جس کا خلاصہ کرنا آسان ہے ، جیسے اسے ایک محفوظ ڈیٹا کے لئے ایک آبجیکٹ کے طور پر جوڑنا۔

محفوظ کردہ ڈیٹا کو پڑھتے وقت ، آپ بچت کرتے وقت ریورس پروسیسنگ کرسکتے ہیں۔ پڑھنے کے لئے ڈیٹا ایک واحد سٹرنگ ہے ، لیکن مواد جے ایس او این فارمیٹڈ ڈیٹا ڈھانچے ہیں ، لہذا JsonUtility.FromJson انہیں طریقوں کے ذریعہ کلاس مثالوں میں تبدیل کیا جاسکتا ہے ۔ تاہم ، چونکہ ہمارے پاس سٹرنگ میں معلومات نہیں ہیں FromJson کہ کس کلاس میں تبدیل کرنا ہے ، لہذا ہمیں طریقہ کار پر کال کرتے وقت قسم کی وضاحت کرنا ہوگی۔

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

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

اگر آپ اسے منتقل کرنے کی کوشش کرتے ہیں تو ، آپ دیکھ سکتے ہیں کہ یہ صحیح طریقے سے محفوظ ہے اور لوڈ کیا جاسکتا ہے۔

ویسے، ہم اس بار یونٹی اسٹینڈرڈ JsonUtility کلاسوں کا استعمال کر رہے ہیں، لیکن وہ پیچیدہ ڈیٹا ڈھانچے کے ساتھ کلاسوں کو تبدیل کرنے کے قابل نہیں ہوسکتے ہیں کیونکہ وہ بہت فعال نہیں ہیں. اس صورت میں، دیگر لائبریریوں کو استعمال کرنے کی سفارش کی جاتی ہے.

ڈیٹا کہاں ذخیرہ کیا جاتا ہے؟

PlayerPrefs جب آپ ڈیٹا ذخیرہ کرنے کے لئے کلاس کا استعمال کرتے ہیں تو ، وہ مقام جہاں یہ محفوظ ہوتا ہے اس کا انحصار اس پلیٹ فارم پر ہوتا ہے جس پر آپ چل رہے ہیں۔ براہ کرم نیچے دیئے گئے سرکاری صفحے کا حوالہ دیں کہ یہ اصل میں کہاں ذخیرہ کیا گیا ہے۔

کچھ ماحول میں ، جیسے ونڈوز ، وہ فائل میں محفوظ نہیں ہوتے ہیں ، لیکن سسٹم کی ترتیبات جیسے رجسٹری میں۔ چونکہ یہ ایک فائل نہیں ہے ، لہذا یہ محفوظ شدہ ڈیٹا کو محفوظ کرنے کے لئے موزوں نہیں ہے ، مثال کے طور پر ، اگر محفوظ کردہ ڈیٹا بہت بڑا ہے یا PlayerPrefs آپ محفوظ کردہ ڈیٹا کو کسی دوسرے ماحول کے ساتھ ہم آہنگ کرنا چاہتے ہیں۔ اس کے برعکس ، اگر محفوظ کیا جانے والا ڈیٹا آپشن لیول کا سائز ہے ، یا اگر یہ ایک اسٹینڈ لون گیم ہے جو صرف اس ماحول میں مکمل ہوتا ہے جس میں یہ چل رہا ہے ، تو میرے خیال میں ڈیٹا کو محفوظ کرنا ممکن ہے PlayerPrefs ۔

اس کے علاوہ ، محفوظ کردہ مقام کا راستہ "کمپنی نام" اور "پروڈکٹ نام" کی ترتیبات سے متاثر ہوسکتا ہے۔ اگر آپ اپنا کھیل شائع کرنا چاہتے ہیں تو ، آپ کو ان اقدار پر پہلے سے فیصلہ کرنے کی ضرورت ہے اور اپنے کھیل کو شائع کرنے کے بعد انہیں تبدیل نہیں کریں گے۔

ڈیٹا خفیہ کاری کے بارے میں

ذخیرہ کردہ ڈیٹا خود بخود خفیہ نہیں ہوتا ہے۔ اگر کھلاڑی کی صلاحیتوں کو اسی طرح محفوظ کیا جاتا ہے جیسے وہ ہیں تو ، صارف آزادانہ طور پر اقدار کو دوبارہ لکھے گا ، جو کھیل کو متاثر کرے گا۔

کیا آپ کو خفیہ کاری کرنے کی ضرورت ہے ، اور اگر ایسا ہے تو ، کس سطح کی طاقت کی ضرورت ہے ، اور آپ خفیہ کاری کی کلید کو کیسے سنبھالتے ہیں؟ غور کرنے والی چیزیں ہر کھیل میں مختلف ہوتی ہیں۔

میں یہاں خفیہ کاری کے طریقہ کار کی وضاحت نہیں کروں گا ، لیکن اگر آپ اسے انٹرنیٹ پر دیکھتے ہیں تو ، یہ ایک اہم زبان اور آلہ ہے ، لہذا مجھے لگتا ہے کہ مختلف طریقے موجود ہیں۔ فی الحال، اگر آپ فائل کھولنے کے باوجود ذخیرہ شدہ مواد کا مطلب نہیں سمجھتے ہیں، اور اگر آپ ڈیٹا کے ساتھ خراب طریقے سے چھیڑ چھاڑ کرتے ہیں، تو آپ محفوظ کردہ ڈیٹا کا استعمال نہیں کر سکیں گے، میرے خیال میں کچھ اینٹی فراڈ اثر ہوگا.