PlayerPrefsを使ったデータ保存方法[Unity]

PlayerPrefs

PlayerPrefsはUnityで一番よく利用されるデータ保存方法みたいです.

こちらのサンプルプログラムを用いて学びます.

作って学べる Unity本格入門

作って学べる 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();
    }

    // 略
}