[System.Serializable]
属性について[System.Serializable]
属性は、UnityやC#でオブジェクトをシリアライズ可能(データとして保存・読み込み可能)にするために使用されます。
PlayerSaveData
クラスのインスタンスをJSONやXML、バイナリ形式で保存したり、ファイルに書き込んだりする際に自動でデータとして扱えるようになります。[System.Serializable]
を使ってカスタムクラスをシリアライズ化するのが一般的です。[System.Serializable]
を付けるかどうかは、そのクラスをUnityのInspectorで確認するか、またはデータをファイルやセーブシステムに保存する用途があるかで決まります。もし、PlayerSaveData
を単純なデータ保持用としてのみ使用するなら、どちらでも問題ありませんが、保存が必要なら[System.Serializable]
を付けるのが良いでしょう。
しかし、今回[System.Serializable]
を付けなくてもデータが保存されているのは、Unityが提供するシリアライズ機能とは別のシリアライズ手段を使っているためです。
例えば、次のような場合には[System.Serializable]
を付けなくてもシリアライズが可能です:
JSON形式のシリアライズ
JsonUtility
やNewtonsoft.Json
などのJSONシリアライズライブラリを使用している場合は、[System.Serializable]
属性が不要です。これらのライブラリは、C#の標準的なクラスをデータ化できるため、PlayerSaveData
クラスに特別な属性が付いていなくてもシリアライズされます。
// JsonUtilityを使った例
PlayerSaveData playerData = new PlayerSaveData("Player", 100);
string json = JsonUtility.ToJson(playerData); // シリアライズ
PlayerSaveData loadedData = JsonUtility.FromJson<PlayerSaveData>(json); // デシリアライズ
バイナリ形式のシリアライズ
バイナリフォーマットでのシリアライズをする場合、BinaryFormatter
などのシリアライズクラスによっては、特定の属性がなくてもデータをバイナリとして保存可能です(ただし、バイナリシリアライズでは通常[Serializable]
が必要になりますが、Unity以外のシリアライズ方法では柔軟に扱える場合があります)。
UnityのScriptableObjectやPlayerPrefsの活用
PlayerPrefs
を使って簡単なデータ(数値や文字列)を保存する場合も、特定のクラスがシリアライズされていなくても保存が可能です。また、ScriptableObject
などを使うときも属性は不要です。
Unity独自のシリアライズシステム(例えばInspector上での表示など)では[System.Serializable]
が必要ですが、JSONやその他のシリアライズライブラリを用いる場合は、この属性がなくてもデータの保存や読み込みが可能です。そのため、[System.Serializable]
が必須ではないケースもあるわけです。なので今回はなくていいです。