前書き
前回、ゲームデータを保存する場合、Dictionary形はうまくないのでList型に変換しましょうという記事を書きましたが、単純にList型に直しただけだとゲームデータが保存できない事象にハマったため備忘録として残しておこうと思います。
前回の記事はこちらからご覧いただけます。
Unityでデータを保存するときの形式
Unityでは、データを保存する方法として以下のような手段があります:
- PlayerPrefs
- ScriptableObject
- JSON形式での保存(JsonUtility や Newtonsoft.Json)
- バイナリ保存
これらの方法では、シリアライズ(直列化)可能なデータ構造である必要があります。
シリアライズとは何か?
「シリアライズ(Serialize)」とは、オブジェクトの状態(フィールドの値など)を保存できる形式に変換する処理のことです。
たとえば、以下のようなクラスを保存したい場合、
public class PlayerData
{
public string Name;
public int Level;
}
このままでは PlayerData は Unity にとって「保存対象」として認識されません。シリアライズ化をして保存できる形式にする必要があります。
なぜ [System.Serializable] が必要なのか
Unityのシリアライズシステムは、C#の標準である[System.Serializable]属性が付いたクラスのみを保存対象として認識します。
List 型を定義して保存しようとしても、PlayerData に [System.Serializable] がついていなければ、内部の要素はシリアライズされず保存に失敗します。
[System.Serializable]
public class PlayerData
{
public string Name;
public int Level;
}
これを付けることで、UnityやJsonUtilityがこのクラスの中身を正しく扱えるようになります。
[Serializable] を忘れるとどうなるか
public class SaveData
{
public List<PlayerData> Players;
}
- JsonUtility.ToJson(saveData) を使っても、内部の List が空になる(もしくは null)
- ScriptableObject などでインスペクターに表示しようとしても、リストの要素が見えない・消える
- 保存・読み込み処理が正常に動作しない
といった問題が起こる可能性があります。
まとめ
List型を使ってゲームデータを管理するのは非常に便利ですが、中に入れるクラスには [System.Serializable]を忘れずにつけることが重要です。これがなければ、Unityのシリアライズ処理(保存・読み込み・インスペクター表示)で正しく動作しません。
コメント