Використовуйте PlayerPrefs для читання та запису даних
Середовище перевірки
- Вікна
-
- вікна 11
- Редактор єдності
-
- 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
Якщо ви GetInt
GetFloat
зберігаєте за допомогою або , викличте метод.
Отримане значення відображається в полі введення.
Тепер ви можете зберігати та завантажувати дані. Я не думаю, що є якісь складні елементи.
Спробуйте перемістити його
Запустіть, щоб ввести, зберегти та завантажити. Збережені дані зберігаються і їх можна завантажити, навіть якщо ви вийдете з гри та запустите її повторно. Якщо ви можете підтвердити наступну закономірність, я думаю, що проблем немає.
- Введіть значення
- Натисніть кнопку Зберегти
- Змінення введеного значення
- Натисніть кнопку імпорту, щоб підтвердити, що вона повертається до збереженого значення.
- Вийти з гри
- Повторно запустіть гру і натисніть кнопку завантаження, щоб подивитися, чи зможете ви згадати збережене значення
- Введіть інше значення, збережіть його та перевірте, чи можете ви прочитати те саме з оновленим значенням
Збережіть і завантажте шматок даних
У вибірці поки що збережено лише кілька параметрів. У міру того, як ви власне робите гру, кількість параметрів, які потрібно зберегти, буде неухильно збільшуватися, і якщо ви будете читати і записувати їх по одному, код буде величезним. Тому при створенні даних, які будуть фактично збережені, теорія полягає в тому, щоб об'єднати дані, які потрібно зберегти, в одну, а потім записати їх все відразу.
Спочатку створіть структуру даних збереження як класу. Мета полягає в тому, щоб мати можливість читати та записувати дані одночасно, а також класифікувати дані, щоб полегшити доступ коду до кожної частини даних.
Нижче наведено приклади збереження класів ігор: Його можна написати де завгодно, на нього можна посилатися з іншого коду. Ця структура класу є зразком, тому в реальній грі вам потрібно створити її для своєї гри.
<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
класи Unity, але вони можуть не мати можливості конвертувати класи зі складними структурами даних, оскільки вони не дуже функціональні.
У такому випадку рекомендується використовувати інші бібліотеки.
Де зберігаються дані?
PlayerPrefs
Коли ви використовуєте клас для зберігання даних, розташування, де вони зберігаються, залежить від платформи, на якій ви працюєте.
Будь ласка, зверніться до офіційної сторінки нижче, де він насправді зберігається.
- PlayerPrefs
- 【Єдність】 Розташування даних, що зберігаються в PlayerPrefs в WebGL в Windows (IndexedDB)
У деяких середовищах, таких як Windows, вони зберігаються не у файлі, а в системних параметрах, таких як реєстр.
Оскільки це не файл, він не підходить для збереження збережених даних у , наприклад, якщо дані збереження дуже великі або PlayerPrefs
ви хочете синхронізувати дані збереження з іншим середовищем.
І навпаки, якщо дані, які потрібно зберегти, - це розмір рівня опції, або якщо це окрема гра, яка завершується лише в середовищі, в якій вона запущена, я думаю, що PlayerPrefs
можна зберегти дані в .
Крім того, на шлях збереженого розташування можуть впливати налаштування "Назва компанії" та "Назва продукту". Якщо ви хочете опублікувати свою гру, вам потрібно заздалегідь визначитися з цими значеннями і не змінювати їх після публікації гри.
Про шифрування даних
Дані, що зберігаються, не шифруються автоматично. Якщо здібності гравця збережені як є, користувач буде вільно переписувати значення, що вплине на гру.
Вам потрібно шифрувати, і якщо так, то який рівень міцності потрібен, і як ви обробляєте ключ шифрування? Речі, які слід враховувати, відрізняються від гри до гри.
Я не буду пояснювати тут метод шифрування, але якщо ви подивитеся на нього в Інтернеті, це основна мова та інструмент, тому я думаю, що існують різні методи. На даний момент, якщо ви не розумієте значення збереженого вмісту, навіть якщо відкриєте файл, і якщо ви погано підробляєте дані, ви не зможете використовувати збережені дані, я думаю, що буде якийсь ефект боротьби з шахрайством.