استفاده از PlayerPrefs برای خواندن و نوشتن داده ها

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط تایید

ویندوز
  • ویندوز 11
ویرایشگر یونیتی
  • دانلود: 2021.3.3f1
بسته سیستم ورودی
  • 1.3.0

پیشنیازهای این نکته

تنظیمات زیر از قبل به عنوان یک فرض برای توصیف این نکته ساخته شده است.

در ابتدا

اگر بازی کرده اید، اکثر شما ان را تجربه کرده اید. شما احتمالا یک بازی را متوقف کرده اید و داده های بازی خود را ذخیره یا بارگذاری کرده اید تا خاموش شود.

هنگام ایجاد یک بازی، معمولا باید این تابع ذخیره و بار، گزینه های تنظیم و غیره را ایجاد کنید. در اینجا، ما سعی خواهیم کرد برای رسیدن به این هدف با استفاده از ساده ترین PlayerPrefs راه برای ذخیره و بارگذاری داده ها.

قرار دادن UI

در اینجا، ما سعی خواهیم کرد محتویات ورودی را با قرار دادن موارد ورودی و دکمه ها و کلیک بر روی دکمه ذخیره یا بخوانیم. در حال حاضر، شما فقط به حداقل دو دکمه و یک فیلد ورودی نیاز دارید، بنابراین احساس راحتی کنید که انها را قرار دهید.

اماده سازی برای پردازش UI

اول، بیایید دکمه ذخیره را اجرا کنیم. نحوه ایجاد یک رویداد دکمه در نکات زیر معرفی شده است، بنابراین من فقط بخش های مربوطه را لیست می کنم.

نام 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;
}

در تابع استاندارد Unity که 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 داده ها در نمونه کلاس، ان را به یک رشته 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);

اگر سعی کنید ان را حرکت دهید، می توانید ببینید که به درستی ذخیره شده و می تواند بارگذاری شود.

به هر حال، ما این بار از کلاس های استاندارد JsonUtility Unity استفاده می کنیم، اما ممکن است انها قادر به تبدیل کلاس هایی با ساختارهای داده پیچیده نباشند زیرا انها بسیار کاربردی نیستند. در این صورت توصیه می شود از کتابخانه های دیگر استفاده کنید.

داده ها کجا ذخیره می شوند؟

PlayerPrefs هنگامی که از یک کلاس برای ذخیره داده ها استفاده می کنید، مکانی که در ان ذخیره می شود بستگی به پلت فرمی دارد که در ان اجرا می کنید. لطفا به صفحه رسمی زیر مراجعه کنید تا جایی که در واقع ذخیره شده است.

در برخی از محیط ها، مانند ویندوز، انها در یک فایل ذخیره نمی شوند، بلکه در تنظیمات سیستم مانند رجیستری ذخیره می شوند. از انجا که این یک فایل نیست، برای ذخیره داده های ذخیره شده در ان مناسب نیست، به عنوان مثال، اگر داده های ذخیره بسیار بزرگ باشد یا PlayerPrefs می خواهید داده های ذخیره را با محیط دیگری همگام سازی کنید. برعکس، اگر داده هایی که باید ذخیره شوند اندازه سطح گزینه باشد یا اگر یک بازی مستقل باشد که فقط در محیطی که در ان اجرا می شود تکمیل می شود، من فکر می کنم می توان داده ها را در ان PlayerPrefs ذخیره کرد.

علاوه بر این، مسیر مکان ذخیره شده ممکن است تحت تاثیر تنظیمات "نام شرکت" و "نام محصول" قرار گیرد. اگر می خواهید بازی خود را منتشر کنید، باید از قبل در مورد این ارزش ها تصمیم بگیرید و پس از انتشار بازی خود انها را تغییر ندهید.

درباره رمزگذاری داده ها

داده های ذخیره شده به طور خودکار رمزگذاری نمی شوند. اگر توانایی های بازیکن به همان اندازه ذخیره شود، کاربر ازادانه مقادیر را بازنویسی می کند که بر بازی تاثیر می گذارد.

ایا شما نیاز به رمزگذاری دارید و اگر چنین است، چه سطح از قدرت مورد نیاز است و چگونه کلید رمزگذاری را اداره می کنید؟ چیزهایی که باید در نظر بگیرید از بازی به بازی متفاوت است.

من روش رمزگذاری را در اینجا توضیح نخواهم داد، اما اگر شما ان را در اینترنت جستجو کنید، این یک زبان و ابزار اصلی است، بنابراین من فکر می کنم روش های مختلفی وجود دارد. در حال حاضر، اگر شما معنای محتویات ذخیره شده را درک نکنید حتی اگر فایل را باز کنید، و اگر داده ها را ضعیف دستکاری کنید، نمی توانید از داده های ذخیره شده استفاده کنید، من فکر می کنم که برخی از اثرات ضد تقلب وجود خواهد داشت.