Χρήση του PlayerPrefs για ανάγνωση και εγγραφή δεδομένων
Περιβάλλον επαλήθευσης
- παράθυρα
-
- Παράθυρα 11
- Επεξεργαστής ενότητας
-
- 2021.3.3στ1
- Πακέτο συστήματος εισόδου
-
- 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;
}
Στην τυπική συνάρτηση Unity που χρησιμοποιείται αυτή τη List
φορά, εάν ορίσετε πίνακες ή να έχετε πολλές μοναδικές,
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);
Εάν προσπαθήσετε να το μετακινήσετε, μπορείτε να δείτε ότι έχει αποθηκευτεί σωστά και μπορεί να φορτωθεί.
Παρεμπιπτόντως, χρησιμοποιούμε τις τυπικές Unity αυτή τη φορά, αλλά ενδέχεται να μην είναι σε θέση να μετατρέψουν με πολύπλοκες δομές δεδομένων επειδή δεν είναι πολύ λειτουργικές JsonUtility
.
Σε αυτή την περίπτωση, συνιστάται η χρήση άλλων βιβλιοθηκών.
Πού αποθηκεύονται τα δεδομένα;
PlayerPrefs
Όταν χρησιμοποιείτε μια κλάση για την αποθήκευση δεδομένων, η θέση όπου αποθηκεύονται εξαρτάται από την πλατφόρμα στην οποία εκτελείτε.
Ανατρέξτε στην επίσημη σελίδα παρακάτω για το πού είναι πραγματικά αποθηκευμένο.
- ΠαίκτηςPrefs
- 【Ενότητα】 Θέση των δεδομένων που είναι αποθηκευμένα στο PlayerPrefs στο WebGL στα Windows (IndexedDB)
Σε ορισμένα περιβάλλοντα, όπως τα Windows, δεν αποθηκεύονται σε αρχείο, αλλά σε ρυθμίσεις συστήματος, όπως το μητρώο.
Δεδομένου ότι δεν είναι αρχείο, δεν είναι κατάλληλο για αποθήκευση αποθηκευμένων δεδομένων στο , για παράδειγμα, εάν τα αποθηκευμένα δεδομένα είναι πολύ μεγάλα ή PlayerPrefs
θέλετε να συγχρονίσετε τα αποθηκευμένα δεδομένα με άλλο περιβάλλον.
Αντίθετα, εάν τα δεδομένα που πρέπει να αποθηκευτούν είναι το μέγεθος του επιπέδου επιλογής ή εάν πρόκειται για αυτόνομο παιχνίδι που ολοκληρώνεται μόνο στο περιβάλλον στο οποίο εκτελείται, νομίζω ότι είναι PlayerPrefs
δυνατή η αποθήκευση των δεδομένων στο .
Επιπλέον, η διαδρομή της αποθηκευμένης τοποθεσίας ενδέχεται να επηρεαστεί από τις ρυθμίσεις "CompanyName" και "ProductName". Αν θέλετε να δημοσιεύσετε το παιχνίδι σας, πρέπει να αποφασίσετε για αυτές τις τιμές πολύ νωρίτερα και να μην τις αλλάξετε μόλις δημοσιεύσετε το παιχνίδι σας.
Σχετικά με την κρυπτογράφηση δεδομένων
Τα αποθηκευμένα δεδομένα δεν κρυπτογραφούνται αυτόματα. Εάν οι ικανότητες του παίκτη αποθηκευτούν ως έχουν, ο χρήστης θα ξαναγράψει ελεύθερα τις τιμές, οι οποίες θα επηρεάσουν το παιχνίδι.
Χρειάζεται να κρυπτογραφήσετε και, αν ναι, ποιο επίπεδο ισχύος απαιτείται και πώς χειρίζεστε το κλειδί κρυπτογράφησης; Τα πράγματα που πρέπει να λάβετε υπόψη διαφέρουν από παιχνίδι σε παιχνίδι.
Δεν θα εξηγήσω τη μέθοδο κρυπτογράφησης εδώ, αλλά αν την αναζητήσετε στο Διαδίκτυο, είναι μια σημαντική γλώσσα και εργαλείο, οπότε νομίζω ότι υπάρχουν διάφορες μέθοδοι. Προς το παρόν, εάν δεν καταλαβαίνετε την έννοια των αποθηκευμένων περιεχομένων ακόμη και αν ανοίξετε το αρχείο και εάν παραβιάσετε τα δεδομένα κακώς, δεν θα μπορείτε να χρησιμοποιήσετε τα αποθηκευμένα δεδομένα, νομίζω ότι θα υπάρξει κάποιο αποτέλεσμα καταπολέμησης της απάτης.