PlayerPrefsを使ったデータ保存方法[Unity]
PlayerPrefs
PlayerPrefsはUnityで一番よく利用されるデータ保存方法みたいです.
こちらのサンプルプログラムを用いて学びます.
保存方法
保存できる型は以下.
int
float
string
以下のメソッドを使っていく感じ.
設定:PlayerPrefs.SetString(TestKey, testData)
保存:PlayerPrefs.Save()
取得:PlayerPrefs.GetString(TestKey)
基本的な流れは以下.
using UnityEngine; public class PlayerPrefsTest : MonoBehaviour{ // Keyは定数で定義する private const string TEST_KEY = "test"; private void Start(){ // 保存するValueの定義 var testData = "this is test string data"; // KeyValue設定 PlayerPrefs.SetString(TEST_KEY, testData); // 設定の保存 PlayerPrefs.Save(); // 保存情報の取得 var saveData = PlayerPrefs.GetString(TEST_KEY); Debug.Log("saveData"); } }
上記のサンプルプログラムではKeyValueで保存したが,保存情報が増えると管理が面倒になる. このように煩雑なデータを扱う場合,オブジェクトをJSONにシリアライズするのが便利である.
JSON
JavaScript Object Notationの略.JavaScriptをベースにしたデータフォーマット.
{ "name": "xrdnk", "age": 26 }
シリアライズできないものがある
DIctionary型,DateTime型はJSON化できない. またフィールドをreadonly(Javaではtransient)に指定するとシリアライズ対象から外れる.
暗号化
PlayerPrefsは簡単にデータを覗き見ることができるため, セーブデータを暗号化して保存するとデータ改ざんのリスクが減る.
サンプルプログラム
オブジェクトとJSONの相互変換にはJsonUtilityを利用する.
JSON化(シリアライズ):JsonUtility.ToJson(objData)
JSONパース(デシリアライズ):JsonUtility.FromJson<T>(jsonData)
using System; using System.Linq; using System.Collections.Generic; using UnityEngine; [Serializable] // Serializable属性をつける public class OwnedItemsData { /// <summary> /// PlayerPrefs保存先Key /// </summary> private const string PlayerPrefsKey = "OWNED_ITEMS_DATA"; /// <summary> /// Singleton Pattern (セーブデータを1つだけに設定する場合) /// </summary> private static OwnedItemsData _instance; public static OwnedItemsData Instance { get { if (null == _instance) { // セーブデータが存在する場合,PlayerPrefs保存データを取得し,JSONパース _instance = PlayerPrefs.HasKey(PlayerPrefsKey) ? JsonUtility.FromJson<OwnedItemsData>(PlayerPrefs.GetString(PlayerPrefsKey)) : new OwnedItemsData(); } return _instance; } } // 所得アイテム [SerializeField] private List<OwnedItem> ownedItems = new List<OwnedItem>(); public OwnedItem[] OwnedItems { get { return ownedItems.ToArray(); } } /// <summary> /// Singleton Pattern.コンストラクタのprivate化. /// </summary> private OwnedItemsData() { } /// <summary> /// JSON化してPlayerPrefsに保存 /// </summary> public void Save() { // JSON化 var jsonString = JsonUtility.ToJson(this); // 情報の設定と保存 PlayerPrefs.SetString(PlayerPrefsKey, jsonString); PlayerPrefs.Save(); } // 略 }