השתמש ב- PlayerPrefs כדי לקרוא ולכתוב נתונים

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 11
עורך Unity
  • 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);

אם תנסה להזיז אותו, תוכל לראות שהוא נשמר כראוי וניתן לטעון אותו.

אגב, אנחנו משתמשים הפעם במחלקות הסטנדרטיות JsonUtility של יוניטי, אבל ייתכן שהם לא יוכלו להמיר מחלקות עם מבני נתונים מורכבים מכיוון שהם לא מאוד פונקציונליים. במקרה כזה, מומלץ להשתמש בספריות אחרות.

היכן מאוחסנים הנתונים?

PlayerPrefs כאשר אתה משתמש במחלקה לאחסון נתונים, המיקום שבו הם נשמרים תלוי בפלטפורמה שבה אתה פועל. אנא עיין בדף הרשמי למטה עבור המקום שבו הוא מאוחסן בפועל.

בסביבות מסוימות, כגון Windows, הם אינם מאוחסנים בקובץ, אלא בהגדרות מערכת כגון הרישום. מכיוון שהוא אינו קובץ, הוא אינו מתאים לשמירת נתונים שנשמרו ב- , לדוגמה, אם הנתונים השמורים גדולים מאוד או PlayerPrefs שברצונך לסנכרן את הנתונים השמורים עם סביבה אחרת. לעומת זאת, אם הנתונים שיש לשמור הם בגודל של רמת האופציה, או אם זה משחק עצמאי שהושלם רק בסביבה שבה הוא פועל, אני חושב שאפשר PlayerPrefs לשמור את הנתונים ב .

בנוסף, הנתיב של המיקום שנשמר עשוי להיות מושפע מההגדרות "CompanyName" ו- "ProductName". אם ברצונך לפרסם את המשחק שלך, עליך להחליט על ערכים אלה זמן רב מראש ולא לשנות אותם לאחר פרסום המשחק.

אודות הצפנת נתונים

הנתונים המאוחסנים אינם מוצפנים באופן אוטומטי. אם יכולות השחקן נשמרות כפי שהן, המשתמש ישכתב באופן חופשי את הערכים, מה שישפיע על המשחק.

האם עליך להצפין, ואם כן, מהי רמת החוזק הנדרשת, וכיצד אתה מטפל במפתח ההצפנה? הדברים שיש לקחת בחשבון משתנים ממשחק למשחק.

אני לא אסביר את שיטת ההצפנה כאן, אבל אם אתה מחפש את זה באינטרנט, זה שפה וכלי מרכזי, אז אני חושב שיש שיטות שונות. לעת עתה, אם אתה לא מבין את המשמעות של התוכן המאוחסן גם אם אתה פותח את הקובץ, ואם אתה מתעסק עם הנתונים בצורה גרועה, לא תוכל להשתמש בנתונים לשמור, אני חושב שיהיה קצת אפקט נגד הונאה.