Unity_Lesson

[System.Serializable]属性について

[System.Serializable]属性は、UnityやC#でオブジェクトをシリアライズ可能(データとして保存・読み込み可能)にするために使用されます。

まとめ

[System.Serializable]を付けるかどうかは、そのクラスをUnityのInspectorで確認するか、またはデータをファイルやセーブシステムに保存する用途があるかで決まります。もし、PlayerSaveDataを単純なデータ保持用としてのみ使用するなら、どちらでも問題ありませんが、保存が必要なら[System.Serializable]を付けるのが良いでしょう。

しかし、今回[System.Serializable]を付けなくてもデータが保存されているのは、Unityが提供するシリアライズ機能とは別のシリアライズ手段を使っているためです。

例えば、次のような場合には[System.Serializable]を付けなくてもシリアライズが可能です:

  1. JSON形式のシリアライズ
    JsonUtilityNewtonsoft.JsonなどのJSONシリアライズライブラリを使用している場合は、[System.Serializable]属性が不要です。これらのライブラリは、C#の標準的なクラスをデータ化できるため、PlayerSaveDataクラスに特別な属性が付いていなくてもシリアライズされます。

    // JsonUtilityを使った例
    PlayerSaveData playerData = new PlayerSaveData("Player", 100);
    string json = JsonUtility.ToJson(playerData);  // シリアライズ
    PlayerSaveData loadedData = JsonUtility.FromJson<PlayerSaveData>(json);  // デシリアライズ
    
  2. バイナリ形式のシリアライズ
    バイナリフォーマットでのシリアライズをする場合、BinaryFormatterなどのシリアライズクラスによっては、特定の属性がなくてもデータをバイナリとして保存可能です(ただし、バイナリシリアライズでは通常[Serializable]が必要になりますが、Unity以外のシリアライズ方法では柔軟に扱える場合があります)。

  3. UnityのScriptableObjectやPlayerPrefsの活用
    PlayerPrefsを使って簡単なデータ(数値や文字列)を保存する場合も、特定のクラスがシリアライズされていなくても保存が可能です。また、ScriptableObjectなどを使うときも属性は不要です。


まとめ

Unity独自のシリアライズシステム(例えばInspector上での表示など)では[System.Serializable]が必要ですが、JSONやその他のシリアライズライブラリを用いる場合は、この属性がなくてもデータの保存や読み込みが可能です。そのため、[System.Serializable]が必須ではないケースもあるわけです。なので今回はなくていいです。