Easy Save2 で シリアライズされたクラスを保存する

前回、Easy Save2 を使ってみる でEasy Save2 を簡単に使ってみた。
クラス内の保存するパラメータが少ないうちは、1つずつセーブしたりロードしたりしてもいいのだが、これが大量になるといちいち記述するのも面倒になる。
Saving and Loading Custom Scriptsを見てもらうとわかるのだが、SaveとLoadで該当するパラメータを全部記載しないといけないので、なかなか骨が折れる。
できることなら、クラス内のパラメータをまとめて保存したい。というわけで、今回はクラスをシリアライズして保存してみる。

以下のようなクラスをサンプルとする。

1
2
3
4
5
6
7
public class Player {

public int hp;
public string name;

}

BinaryFormatterでバイナリにシリアライズして保存する

BinaryFormatterはクラスをバイナリにシリアライズするものである。使う際には[System.Serializable]の記述が必要なので、以下のように修正。

1
2
[System.Serializable]
public class Player {

BinaryFormatterはstreamを引数に取る必要があるので、MemoryStreamを指定する。これでシリアライズされたデータをbyte配列で取得できる。あとは、このbyte配列をEasy Save2に渡して保存すれば良い。ロードはその逆。以下にソースを示す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Player player = new Player();
player.hp = 100;
player.name = "あいうえお";

//セーブ.
BinaryFormatter bf = new BinaryFormatter();
MemoryStream saveMem = new MemoryStream();
bf.Serialize(saveMem, player);
ES2.Save(saveMem.ToArray(), "player"); //byte配列で保存.
saveMem.Close();


//ロード.
bf = new BinaryFormatter();
MemoryStream loadMem = new MemoryStream(ES2.LoadArray<byte>("player"));
Player loadPlayer = (Player)bf.Deserialize(loadMem);
loadMem.Close();

print(loadPlayer.name); //あいうえお
print(loadPlayer.hp); //100

これで動くことは動くのだが、非常に残念なことに、BinaryFormatterはiOSだと動かないらしい。
仕方ないのでJSONでも保存してみる。

ListJSONでJSONにシリアライズして保存する

クラスをJSONにシリアライズするのにLitJSONを使う。
準備として、上記ページからLitJSONのdllをダウンロードし、UnityのProjectのPluguinsフォルダに突っ込む。
JSONにシリアライズしたら、stringとして保存すれば良い。ソースを以下に示す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Player player = new Player();
player.hp = 100;
player.name = "あいうえお";

//セーブ.
string saveJson = LitJson.JsonMapper.ToJson(player);
ES2.Save(saveJson, "player");

//ロード.
string loadJson = ES2.Load<string>("player");
Player loadPlayer = LitJson.JsonMapper.ToObject<Player>(loadJson);

print(loadPlayer.name); //あいうえお
print(loadPlayer.hp); //100

確認バージョン

Unity 4.6

Unityカテゴリの記事
History Inspectorの紹介
敵AIとビジュアルスクリプティング
Chronosを使った感想
コンポーネントの順番をスクリプトから並び替える
Smart Inspectorの紹介
Kris' Favorite Assets が便利
キー操作でUIのナビゲーションをループさせる
TextMeshProのSprite Assetを更新する
UnityPhysicsDebugDraw2D が便利
色管理を考える
細かいTips
ビルドスクリプトを書く
AnimatorのCulling Modeでハマった話
Vectrosityを使ってUGUI上で線や円のアニメーションをする
スプレッドシートからjsonデータを読み込む
ビジュアルノベルアセットFungusにコマンドを追加してカスタマイズする
Skinned Mesh Renderer の Boundsについて
シーンごとにビルド結果の容量を出す
シーンビューにクオリティ設定のスライダーを出すエディタ拡張
ビルド結果のFile headersが大きい理由
フリーのビジュアルノベルアセットFungusを使ってRPGのイベントを作る
Move To View を改良する
フリーのビジュアルノベルアセットのFungusが便利
Visual Studio で保存時にフォーマットする
スプレッドシートからデータを読み込む
ShaderでSpriteの色相をシフトする
Sprite、Texture の 色相をシフトする
uGUIのButtonをクリック時にハイライトのままになる
uGUIのCanvas Groupを使って透過処理をしたり、操作を制限する
自作のコンフィグ画面に必要なもの
uGUIでトグルなボタンを作る
uGUI で動的にボタンを作る
Easy Save2 を使ってみる
csv読み込んで ローカライズ
LoadLevelAdditive で共通シーンを加算
画面全体に色をかける
Any State でどこからでも遷移できるようにする
iTween のStop ではまる
sprite の multiple で 境界がおかしくなる
2D画面に線を引く Line Renderer
Renderer の Materials を スクリプトから設定する
背景をスクロールさせる