Usar PlayerPrefs para leer y escribir datos

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 11
Unity Editor
  • 2021.3.3F1
Paquete del sistema de entrada
  • 1.3.0

Requisitos previos para esta sugerencia

Los siguientes ajustes se han realizado de antemano como premisa para la descripción de este consejo.

Al principio

Si has jugado, la mayoría de ustedes lo han experimentado. Probablemente hayas pausado un juego y guardado o cargado tus datos de juego para dejarlo.

Al crear un juego, generalmente necesita crear esta función de guardar y cargar, establecer opciones, etc. Aquí, intentaremos lograr esto utilizando la forma más sencilla PlayerPrefs de almacenar y cargar datos.

Ubicación de la interfaz de usuario

Aquí, intentaremos guardar o leer el contenido de entrada colocando los elementos y botones de entrada y haciendo clic en el botón. Por el momento, solo necesita al menos dos botones y un campo de entrada, así que siéntase libre de colocarlos.

Preparación para el procesamiento de la interfaz de usuario

Primero, implementemos el botón de guardar. Cómo crear un evento de botón se presenta en los siguientes consejos, por lo que solo enumeraré las partes relevantes.

Deje el nombre ButtonEvent del script como .

El script tiene este aspecto:

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()
  {
  }
}

Dado que es necesario obtener o establecer el valor introducido, prepárelo como un campo. Además, incluya el método al que se llamará al hacer clic en cada botón.

Adjunte su EventSystem script y establezca cada campo de entrada. Puede ser cualquier objeto que desee adjuntar.

Establezca cada método al que se llamará cuando se haga clic en el botón.

Guarde el valor

Ahora que se llama al método cuando OnClickSave se hace clic en el botón Guardar, el proceso del botón Guardar es el siguiente.

/// <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 El método se establece en una clave y un valor que se va a guardar. La clave se especifica al cargar los datos guardados. SetString Aquí llamamos al método porque el valor que se va a almacenar es una cadena. int float Si desea SetInt guardar un valor de otro tipo, como y , existen métodos como y SetFloat , así que llámelos según el tipo.

PlayerPrefs.Save Finalmente, llame al método para confirmar el guardado. En realidad, se puede guardar incluso si no llama a este método, pero es más seguro llamarlo.

Sin embargo, incluso si ejecuta el juego en este punto, solo guardará el valor, por lo que no sabrá si se guardó correctamente. Si verifica la ubicación guardada, puede ver los datos, pero ...

Obtenga un valor guardado

A continuación, implemente el proceso de carga de los datos guardados. El procesamiento del botón es el mismo que el proceso de guardado, por lo que aquí solo se describe el código del proceso de carga.

/// <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");
}

Utilice el método para PlayerPrefs.GetString cargar los datos guardados. Puede obtener el valor guardado con esa clave especificando la clave especificada en Guardar como argumento. El valor se recupera en el valor devuelto del método.

Esto también se guarda como una cadena de la misma manera que cuando se guarda, por lo que GetString llamamos al método. int float Si está GetIntGetFloat ahorrando con o , llame al método.

El valor recuperado se refleja en el campo de entrada.

Ahora puede guardar y cargar los datos. No creo que haya elementos difíciles.

Intenta moverlo

Ejecute para entrar, guardar y cargar. Los datos guardados se conservan y deberían poder cargarse incluso si sales y vuelves a ejecutar el juego. Si puede confirmar el siguiente patrón, creo que no hay problema.

  1. Introduzca un valor
  2. Haga clic en el botón Guardar
  3. Cambiar el valor introducido
  4. Haga clic en el botón de importación para confirmar que vuelve al valor guardado.
  5. Sal del juego
  6. Vuelva a ejecutar el juego y haga clic en el botón de carga para ver si puede recuperar el valor guardado
  7. Introduzca un valor diferente, guárdelo y compruebe si puede leer lo mismo con el valor actualizado

Guardar y cargar un fragmento de datos

En la muestra hasta ahora, solo se han guardado unos pocos parámetros. A medida que hagas un juego, el número de parámetros que se guardarán aumentará constantemente, y si los lees y escribes uno por uno, el código será enorme. Por lo tanto, al crear datos para que se guarden realmente, la teoría es combinar los datos que se guardarán en uno solo y luego escribirlos todos a la vez.

En primer lugar, cree una estructura de datos guardada como una clase. El objetivo es poder leer y escribir datos a la vez, pero también clasificar los datos para facilitar el acceso del código a cada dato.

Los siguientes son ejemplos de clases de partidas guardadas: Se puede escribir en cualquier lugar donde se pueda hacer referencia desde otro código. Esta estructura de clases es una muestra, por lo que en un juego real necesitas crearla para tu juego.

/// <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;
}

En la función estándar de List Unity utilizada esta vez, si define matrices o tiene varias clases únicas, System.Serializable Si no agrega un atributo, no se convertirá correctamente, así que Character establezco el atributo en la Serializable clase.

Después de crear la clase, cree los datos que desea guardar. Por supuesto, puedes tener instancias de esta clase a lo largo del juego. Esto depende de cómo se haga el juego.

// 保存するデータ作成
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, },
  },
};

Después de establecer JsonUtility.ToJson los datos en la instancia de la clase, conviértalos (serialícense) en una cadena JSON con el método. Dado que el valor del objeto es una sola "cadena" llamada JSON con una estructura de datos, todos losPlayerPrefs.SetString datos se pueden escribir con una sola llamada al método.

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

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

Sin embargo, dado que todos los datos se recopilan en uno, no es posible guardar solo una parte o leer solo una parte. Por lo tanto, es preferible convertirlo en una unidad que sea fácil de resumir, como combinarlo como un objeto para guardar datos.

Al leer los datos guardados, puede realizar el procesamiento inverso al guardar. Los datos que se van a leer son una sola cadena, pero el contenido son estructuras de datos con formato JSON, por lo JsonUtility.FromJson que se pueden convertir (deserializar) en instancias de clase mediante métodos. Sin embargo, dado que no FromJson tenemos información en la cadena a qué clase convertir, debemos especificar el tipo al llamar al método.

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

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

Si intenta moverlo, puede ver que está guardado correctamente y se puede cargar.

Por cierto, esta vez estamos usando las clases estándar JsonUtility de Unity, pero es posible que no puedan convertir clases con estructuras de datos complejas porque no son muy funcionales. En ese caso, se recomienda utilizar otras bibliotecas.

¿Dónde se almacenan los datos?

PlayerPrefs Cuando se utiliza una clase para almacenar datos, la ubicación donde se guardan depende de la plataforma en la que se esté ejecutando. Consulte la página oficial a continuación para saber dónde se almacena realmente.

En algunos entornos, como Windows, no se almacenan en un archivo, sino en la configuración del sistema, como el registro. Dado que no es un archivo, no es adecuado para guardar datos guardados en , por ejemplo, si los datos guardados son muy grandes o PlayerPrefs si desea sincronizar los datos guardados con otro entorno. Por el contrario, si los datos a guardar son del tamaño del nivel de opción, o si se trata de un juego independiente que se completa solo en el entorno en el que se está ejecutando, creo que es PlayerPrefs posible guardar los datos en .

Además, la ruta de la ubicación guardada puede verse afectada por la configuración "CompanyName" y "ProductName". Si desea publicar su juego, debe decidir estos valores con suficiente antelación y no cambiarlos una vez que publique su juego.

Acerca del cifrado de datos

Los datos almacenados no se cifran automáticamente. Si las habilidades del jugador se guardan tal como están, el usuario reescribirá libremente los valores, lo que afectará el juego.

¿Necesita cifrar y, de ser así, qué nivel de fuerza se requiere y cómo maneja la clave de cifrado? Las cosas a considerar varían de un juego a otro.

No explicaré el método de cifrado aquí, pero si lo busca en Internet, es un lenguaje y una herramienta importantes, por lo que creo que hay varios métodos. Por el momento, si no comprende el significado del contenido almacenado, incluso si abre el archivo, y si manipula mal los datos, no podrá usar los datos guardados, creo que habrá algún efecto antifraude.