Utilizzare PlayerPrefs per leggere e scrivere dati

Pagina aggiornata :
Data di creazione della pagina :

Ambiente di verifica

Finestre
  • Windows 11
Unity Editor
  • 2021.3.3f1
Pacchetto del sistema di input
  • 1.3.0

Prerequisiti per questo suggerimento

Le seguenti impostazioni sono state effettuate in anticipo come premessa per la descrizione di questo suggerimento.

Dapprima

Se hai giocato, la maggior parte di voi l'ha sperimentato. Probabilmente hai messo in pausa un gioco e salvato o caricato i tuoi dati di gioco per interromperlo.

Quando si crea un gioco, di solito è necessario creare questa funzione di salvataggio e caricamento, impostare le opzioni, ecc. Qui, cercheremo di raggiungere questo obiettivo utilizzando il modo più semplice PlayerPrefs per archiviare e caricare i dati.

Posizionamento dell'interfaccia utente

Qui, proveremo a salvare o leggere il contenuto di input posizionando gli elementi e i pulsanti di input e facendo clic sul pulsante. Per il momento, hai solo bisogno di almeno due pulsanti e un campo di input, quindi sentiti libero di posizionarli.

Preparazione per l'elaborazione dell'interfaccia utente

Innanzitutto, implementiamo il pulsante di salvataggio. Come creare un evento pulsante è introdotto nei seguenti suggerimenti, quindi elencherò solo le parti rilevanti.

Lasciare il nome ButtonEvent dello script come .

Lo script è simile al seguente:

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

Poiché è necessario ottenere o impostare il valore immesso, prepararlo come campo. Inoltre, includere il metodo che verrà chiamato quando si fa clic su ciascun pulsante.

Allegare lo EventSystem script e impostare ogni campo di input. Può essere qualsiasi oggetto che si desidera allegare.

Impostare ogni metodo da chiamare quando si fa clic sul pulsante.

Salva il valore

Ora che il metodo viene chiamato quando OnClickSave si fa clic sul pulsante Salva, il processo del pulsante di salvataggio è il seguente.

/// <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 Il metodo è impostato su una chiave e un valore da salvare. La chiave viene specificata durante il caricamento dei dati salvati. SetString Qui stiamo chiamando il metodo perché il valore da memorizzare è una stringa. int float Se si desidera SetInt salvare un valore di un altro tipo, ad esempio e , esistono metodi come e SetFloat , quindi chiamarli in base al tipo.

PlayerPrefs.Save Infine, chiamare il metodo per confermare il salvataggio. In realtà, può essere salvato anche se non si chiama questo metodo, ma è più sicuro chiamarlo.

Tuttavia, anche se esegui il gioco a questo punto, salverà solo il valore, quindi non saprai se è stato salvato correttamente. Se controlli la posizione salvata, puoi vedere i dati, ma ...

Ottenere un valore salvato

Quindi, implementare il processo di caricamento dei dati salvati. L'elaborazione del pulsante è la stessa del processo di salvataggio, quindi qui viene descritto solo il codice del processo di caricamento.

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

Utilizzare il metodo per PlayerPrefs.GetString caricare i dati salvati. È possibile ottenere il valore salvato con tale chiave specificando la chiave specificata in Salva come argomento. Il valore viene recuperato nel valore restituito del metodo.

Anche questo viene salvato come stringa nello stesso modo in cui si salva, quindi GetString chiamiamo il metodo. int float Se si GetIntGetFloat sta salvando con o , chiamare il metodo.

Il valore recuperato viene riflesso nel campo di input.

Ora puoi salvare e caricare i dati. Non credo ci siano elementi difficili.

Prova a spostarlo

Corri per entrare, salvare e caricare. I dati salvati vengono mantenuti e dovrebbero poter essere caricati anche se si esce e si ripete il gioco. Se puoi confermare il seguente modello, penso che non ci siano problemi.

  1. Immettere un valore
  2. Fai clic sul pulsante Salva
  3. Modificare il valore immesso
  4. Fare clic sul pulsante di importazione per confermare che venga restituito il valore salvato.
  5. Esci dal gioco
  6. Riesegui il gioco e fai clic sul pulsante di caricamento per vedere se riesci a richiamare il valore salvato
  7. Inserisci un valore diverso, salvalo e controlla se riesci a leggere lo stesso con il valore aggiornato

Salvare e caricare un blocco di dati

Nell'esempio finora sono stati salvati solo alcuni parametri. Man mano che crei un gioco, il numero di parametri da salvare aumenterà costantemente, e se li leggi e li scrivi uno per uno, il codice sarà enorme. Pertanto, quando si creano dati da salvare effettivamente, la teoria è quella di combinare i dati da salvare in uno e quindi scriverli tutti in una volta.

Creare innanzitutto una struttura di dati di salvataggio come classe. L'obiettivo è quello di essere in grado di leggere e scrivere dati contemporaneamente, ma anche di classificare i dati per rendere più facile per il codice accedere a ogni pezzo di dati.

Di seguito sono riportati esempi di classi di salvataggio: Può essere scritto ovunque sia possibile fare riferimento da altro codice. Questa struttura di classi è un esempio, quindi in un gioco reale è necessario crearla per il gioco.

/// <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 Nella funzione standard Unity utilizzata questa volta, se si definiscono matrici o si dispone di più classi univoche, System.Serializable Se non aggiungi un attributo, non verrà convertito correttamente, quindi Character ho impostato l'attributo Serializable sulla classe.

Dopo aver creato la classe, creare i dati da salvare. Naturalmente, puoi avere istanze di questa classe durante il gioco. Questo dipende da come è fatto il gioco.

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

Dopo aver impostato JsonUtility.ToJson i dati nell'istanza della classe, convertirli (serializzarli) in una stringa JSON con il metodo. Poiché il valore dell'oggetto è una singola "stringa" chiamata JSON con una struttura dati, tutti iPlayerPrefs.SetString dati possono essere scritti con una singola chiamata al metodo.

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

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

Tuttavia, poiché tutti i dati vengono raccolti in uno, non è possibile salvarne solo una parte o leggerne solo una parte. Pertanto, è preferibile renderlo un'unità facile da riepilogare, ad esempio combinandola come un oggetto per un salvataggio dei dati.

Durante la lettura dei dati salvati, è possibile eseguire l'elaborazione inversa durante il salvataggio. I dati da leggere sono una singola stringa, ma il contenuto è costituito da strutture di dati in formato JSON, quindi JsonUtility.FromJson possono essere convertiti (deserializzati) in istanze di classe mediante metodi. Tuttavia, poiché non FromJson abbiamo informazioni nella stringa in quale classe convertire, dobbiamo specificare il tipo quando chiamiamo il metodo.

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

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

Se provi a spostarlo, puoi vedere che è salvato correttamente e può essere caricato.

A proposito, questa volta stiamo usando le classi standard JsonUtility di Unity, ma potrebbero non essere in grado di convertire classi con strutture di dati complesse perché non sono molto funzionali. In tal caso, si consiglia di utilizzare altre librerie.

Dove vengono archiviati i dati?

PlayerPrefs Quando si utilizza una classe per archiviare i dati, il percorso in cui vengono salvati dipende dalla piattaforma su cui si è in esecuzione. Si prega di fare riferimento alla pagina ufficiale qui sotto per dove è effettivamente memorizzato.

In alcuni ambienti, ad esempio Windows, non vengono archiviati in un file, ma in impostazioni di sistema come il Registro di sistema. Poiché non si tratta di un file, non è adatto per il salvataggio dei dati salvati in , ad esempio, se i dati di salvataggio sono molto grandi o PlayerPrefs si desidera sincronizzare i dati di salvataggio con un altro ambiente. Al contrario, se i dati da salvare sono la dimensione del livello di opzione, o se si tratta di un gioco autonomo che viene completato solo nell'ambiente in cui è in esecuzione, penso che sia PlayerPrefs possibile salvare i dati in .

Inoltre, il percorso della posizione salvata potrebbe essere influenzato dalle impostazioni "CompanyName" e "ProductName". Se si desidera pubblicare il gioco, è necessario decidere questi valori con largo anticipo e non modificarli una volta pubblicato il gioco.

Informazioni sulla crittografia dei dati

I dati memorizzati non vengono crittografati automaticamente. Se le abilità del giocatore vengono salvate così come sono, l'utente riscriverà liberamente i valori, che influenzeranno il gioco.

È necessario crittografare e, in caso affermativo, quale livello di forza è richiesto e come gestire la chiave di crittografia? Le cose da considerare variano da gioco a gioco.

Non spiegherò il metodo di crittografia qui, ma se lo cerchi su Internet, è un linguaggio e uno strumento importante, quindi penso che ci siano vari metodi. Per il momento, se non capisci il significato dei contenuti memorizzati anche se apri il file, e se manometti male i dati, non sarai in grado di utilizzare i dati di salvataggio, penso che ci sarà qualche effetto antifrode.