Использование PlayerPrefs для чтения и записи данных

Страница обновлена :
Дата создания страницы :

Среда верификации

Виндоус
  • Windows 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 классы Unity, но они могут не иметь возможности преобразовывать классы со сложными структурами данных, потому что они не очень функциональны. В этом случае рекомендуется использовать другие библиотеки.

Где хранятся данные?

PlayerPrefs Когда вы используете класс для хранения данных, расположение, в котором они сохраняются, зависит от платформы, на которой вы работаете. Пожалуйста, обратитесь к официальной странице ниже, чтобы узнать, где он на самом деле хранится.

В некоторых средах, таких как Windows, они хранятся не в файле, а в системных параметрах, таких как реестр. Поскольку это не файл, он не подходит для сохранения сохраненных данных в , например, если данные сохранения очень большие или PlayerPrefs вы хотите синхронизировать данные сохранения с другой средой. И наоборот, если данные, которые нужно сохранить, соответствуют размеру уровня опций или если это отдельная игра, которая завершается только в той среде, в которой она запущена, я думаю, что PlayerPrefs можно сохранить данные в .

Кроме того, на путь к сохраненному расположению могут влиять настройки "CompanyName" и "ProductName". Если вы хотите опубликовать свою игру, вам нужно заранее определиться с этими значениями и не менять их после публикации игры.

О шифровании данных

Хранящиеся данные не шифруются автоматически. Если способности игрока сохранены как есть, пользователь будет свободно переписывать значения, что повлияет на игру.

Нужно ли вам шифровать, и если да, то какой уровень надежности требуется и как вы обрабатываете ключ шифрования? Вещи, которые следует учитывать, варьируются от игры к игре.

Я не буду объяснять здесь метод шифрования, но если вы посмотрите его в Интернете, это основной язык и инструмент, поэтому я думаю, что существуют различные методы. На данный момент, если вы не понимаете значения сохраненного содержимого, даже если вы откроете файл, и если вы плохо подделаете данные, вы не сможете использовать данные сохранения, я думаю, что будет некоторый эффект против мошенничества.