前回に引き続き、データの保存する方法をみていきたいとおもいます
前回の状況では複数で構成されたデータを保存するために複数のキーを使って保存する方法もありますが、これではキー管理が煩雑になることが容易に想像できるので、できればキーを一つにして保存したいものです
今回は複数のデータを1つのキーで保存する方法を見ていきたいともいます
コンテンツ
複数のデータで構成されたデータを保存する方法
複数のデータを保存する場合は、データをJsonして形式で文字列として保存する方法があります
基本的にJsonを扱うライブラリは様々(LitJson, JsonMapper等)があります
UnityにはJsonUtilityというものが標準で搭載されています
今回はこちらを使用したいと思います
実装方法
JsonUtility扱うためにはJsonのデータを定義たクラスが必要となります
前回のまとめで見たデータ構成をJson化する場合は
↓ 前回のまとめ の例
- 名前
- レベル
- 今のHP
- 所持アイテム
- 現在の装備
- 覚えている技
これをクラス化します
[System.Serializable] // これで属性定義する必要があります
class PlayerData
{
public string name;
public int level;
public int now_hp;
public string equip;
public string [] items;
public int[] skills;
}
このようなクラスを定義します。
変数は基本的にはpublicで作らないとその変数はJson化されません
変数をprivateしたい場合は [serializefield] をつけることでその変数もJson化されます
[serializefield]
public string name;
このように各変数につけていきます。
これでJson化する準備は整いました。
Jsonデータを保存する
それでは実際にデータを保存していきます
以下の手順で行っていきます
- クラスにパラメータセット
- Json化する
- 文字列形式で保存
// クラスにパラメータセット
var playerData = new PlayerData()
{
name = "ああああ";
level = 1;
now_hp = 100;
equip = "ヒノキの棒";
items = new string [] { "金貨", "ポーション" };
skills = new int[] { 0 };
}
// Json化
var saveData = JsonUtility.ToJson(playerData);
/*
ここでこのような文字列になります
{
name : "ああああ",
level : 1,
now_hp : 100,
equip : "ヒノキの棒",
items : [
"金貨",
"ポーション"
],
skills : [
0
]
}
*/
// 文字列形式で保存
PlayerPrefs.SetString("PlayerData", saveData);
このようにすることでデータの保存がきます
保存データのロード
実際にセーブしたデータをロードする場合は
先ほどの逆の手順で行えば読み込みすることができます
- 文字列でデータ取得
- Jsonを展開
// 文字列形式で読み込み
var saveData = PlayerPrefs.GetString("PlayerData", saveData);
// Jsonを展開 ここで展開するクラスを記載しておきます
var playerData = JsonUtility.FromJson<PlayerData>(saveData);
これで複数のデータで構成されたデータの保存と読み込みを行うことができました
まとめ
これで PlayerPrefsにいったん文字列に変換することで
複数のデータで構成されたデータを保存することが来ました。
新しくパラメータを追加したいときはクラスにパラメータだけで対応可能ですので、
複数のキーで管理するよりもはるかに運用も非常に楽になるかと思われます。