استخدام PlayerPrefs لقراءة البيانات وكتابتها

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١١
محرر الوحدة
  • 2021.3.3f1
حزمة نظام الإدخال
  • 1.3.0

المتطلبات الأساسية لهذه النصيحة

تم إجراء الإعدادات التالية مسبقا كمقدمة لوصف هذه النصيحة.

في البداية

إذا كنت قد لعبت ألعابا ، فقد جربها معظمكم. من المحتمل أنك أوقفت لعبة مؤقتا وحفظت بيانات التشغيل أو حملتها لتركها.

عند إنشاء لعبة ، تحتاج عادة إلى إنشاء وظيفة الحفظ والتحميل هذه ، وتعيين الخيارات ، وما إلى ذلك. هنا ، سنحاول تحقيق ذلك باستخدام أبسط PlayerPrefs طريقة لتخزين البيانات وتحميلها.

موضع واجهة المستخدم

هنا ، سنحاول حفظ أو قراءة محتويات الإدخال عن طريق وضع عناصر الإدخال والأزرار والنقر فوق الزر. في الوقت الحالي ، تحتاج فقط إلى زرين على الأقل وحقل إدخال واحد ، لذلك لا تتردد في وضعهما.

التحضير لمعالجة واجهة المستخدم

أولا ، دعنا ننفذ زر الحفظ. يتم تقديم كيفية إنشاء حدث زر في النصائح التالية ، لذلك سأدرج الأجزاء ذات الصلة فقط.

اترك اسم 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 في الدالة القياسية Unity المستخدمة هذه المرة ، إذا قمت بتعريف المصفوفات أو لديك فئات فريدة متعددة ، 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 البيانات في مثيل الفئة ، قم بتحويلها (تسلسلها) إلى سلسلة JSON باستخدام الطريقة. نظرا لأن قيمة الكائن عبارة عن "سلسلة" واحدة تسمى JSON ببنية بيانات ، يمكن كتابة جميعPlayerPrefs.SetString البيانات باستدعاء واحد للطريقة.

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

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

ومع ذلك ، نظرا لأنه يتم جمع جميع البيانات في واحدة ، فلا يمكن حفظ جزء منها فقط أو قراءة جزء منها فقط. لذلك يفضل جعلها وحدة يسهل تلخيصها ، مثل دمجها ككائن واحد لبيانات حفظ واحدة.

عند قراءة البيانات المحفوظة ، يمكنك إجراء المعالجة العكسية عند الحفظ. البيانات المراد قراءتها عبارة عن سلسلة واحدة ، ولكن المحتويات عبارة عن هياكل بيانات بتنسيق JSON ، بحيث JsonUtility.FromJson يمكن تحويلها (إلغاء تسلسلها) إلى مثيلات فئة حسب الأساليب. ومع ذلك ، نظرا لعدم وجود FromJson معلومات في السلسلة عن الفئة التي يجب التحويل إليها ، يجب علينا تحديد النوع عند استدعاء الطريقة.

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

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

إذا حاولت نقله ، يمكنك أن ترى أنه تم حفظه بشكل صحيح ويمكن تحميله.

بالمناسبة ، نحن نستخدم فئات Unity القياسية JsonUtility هذه المرة ، لكنها قد لا تكون قادرة على تحويل الفئات ذات هياكل البيانات المعقدة لأنها لا تعمل بشكل كبير. في هذه الحالة ، يوصى باستخدام مكتبات أخرى.

أين يتم تخزين البيانات؟

PlayerPrefs عند استخدام فئة لتخزين البيانات ، يعتمد الموقع الذي يتم حفظها فيه على النظام الأساسي الذي تعمل عليه. يرجى الرجوع إلى الصفحة الرسمية أدناه لمعرفة مكان تخزينها بالفعل.

في بعض البيئات ، مثل Windows ، لا يتم تخزينها في ملف ، ولكن في إعدادات النظام مثل السجل. نظرا لأنه ليس ملفا ، فهو غير مناسب لحفظ البيانات المحفوظة في ، على سبيل المثال ، إذا كانت بيانات الحفظ كبيرة جدا أو PlayerPrefs كنت تريد مزامنة بيانات الحفظ مع بيئة أخرى. على العكس من ذلك ، إذا كانت البيانات المراد حفظها بحجم مستوى الخيار ، أو إذا كانت لعبة قائمة بذاتها يتم إكمالها فقط في البيئة التي تعمل فيها ، أعتقد أنه PlayerPrefs من الممكن حفظ البيانات في .

بالإضافة إلى ذلك، قد يتأثر مسار الموقع المحفوظ بإعدادات "اسم الشركة" و "اسم المنتج". إذا كنت ترغب في نشر لعبتك ، فأنت بحاجة إلى تحديد هذه القيم مسبقا وعدم تغييرها بمجرد نشر لعبتك.

حول تشفير البيانات

لا يتم تشفير البيانات المخزنة تلقائيا. إذا تم حفظ قدرات اللاعب كما هي ، فسيقوم المستخدم بإعادة كتابة القيم بحرية ، مما سيؤثر على اللعبة.

هل تحتاج إلى التشفير ، وإذا كان الأمر كذلك ، فما هو مستوى القوة المطلوب ، وكيف تتعامل مع مفتاح التشفير؟ تختلف الأشياء التي يجب مراعاتها من لعبة إلى أخرى.

لن أشرح طريقة التشفير هنا ، ولكن إذا بحثت عنها على الإنترنت ، فهي لغة وأداة رئيسية ، لذلك أعتقد أن هناك طرقا مختلفة. في الوقت الحالي ، إذا كنت لا تفهم معنى المحتويات المخزنة حتى إذا فتحت الملف ، وإذا عبثت بالبيانات بشكل سيئ ، فلن تتمكن من استخدام بيانات الحفظ ، أعتقد أنه سيكون هناك بعض التأثير المضاد للاحتيال.