【Unity】Serializable の必要性について

Serializable は、Unity でオブジェクトのデータを保存・復元する際に非常に重要な役割を果たします。具体的には、データを JSONバイナリ形式 などで保存する際に、クラスやデータ構造を直列化(シリアライズ)するために使用します。


1. 直列化(シリアライズ)とは?

直列化 (Serialization) とは、オブジェクトのデータを保存や転送できる形(通常はバイト列やテキスト形式)に変換するプロセスです。Unity では、ゲームの進行状況や設定データなどを保存する際に、この直列化が行われます。

一方、逆直列化 (Deserialization) とは、保存されたデータを再びオブジェクトに戻すプロセスです。これにより、ゲームが再開された際に、以前のゲーム状態が復元されます。

Unity で直列化を行うためには、対象のクラスや構造体に [Serializable] 属性を付ける必要があります。これがなければ、Unity や C# の JSON シリアライズPlayerPrefs などの保存機能が、そのクラスのデータを変換できません。


2. Unity における Serializable の必要性

Unity では、JsonUtilityPlayerPrefs などを使用してデータを保存する際に、オブジェクトがシリアライズ可能である必要があります。このため、カスタムクラスに [Serializable] 属性を付けることが推奨されます。

なぜ Serializable が必要なのか?

  • データを保存するため: JsonUtility.ToJson() などでオブジェクトを JSON に変換するには、対象のオブジェクトがシリアライズ可能である必要があります。Serializable 属性がないと、JSON 形式に変換できません。
  • スクリプト間でデータのやり取りをするため: Unity のエディターや、特にプレハブやコンポーネントでデータを扱う場合、Serializable にすることで、オブジェクトやクラスのデータを正しく保持できます。

3. Serializable の使用例

たとえば、以下のクラス GameData を保存したい場合、[Serializable] 属性をつけることで、Unity の JsonUtility などを使用して、このクラスのインスタンスをシリアライズできます。

[System.Serializable]
public class GameData
{
    public float elapsedTime; // ゲームの経過時間
    public int point;         // 現在のスコア
    public int highScore;     // ハイスコア
    public List<GenerationParameters> generationParametersList; // パラメータリスト
}

このクラスは System.Serializable として宣言されています。これにより、以下のコードで GameData クラスのインスタンスを JSON 形式に変換でき、保存が可能になります。

GameData data = new GameData
{
    elapsedTime = 100.0f,
    point = 500,
    highScore = 1000,
    generationParametersList = new List<GenerationParameters>() // 適切なデータを入れる
};

// JSON に変換
string jsonData = JsonUtility.ToJson(data);

4. Serializable の欠点

  1. フィールド制約:
  • Serializable 属性を付けたクラスは、シリアライズ可能なフィールド(基本的な型やリストなど)しか変換できません。例えば、DictionaryHashtable などのデータ型は JsonUtility ではシリアライズできません。
  1. 動的データの制約:
  • Unity の JsonUtility は、動的データ(例えば、ランタイムに生成されたプロパティや非公開フィールド)には対応していません。

5. まとめ

  • [Serializable] は、Unity におけるデータ保存の基盤となる仕組みであり、オブジェクトのデータを外部ファイルやメモリ上にシリアライズして保存・復元するために必要です。
  • JsonUtilityPlayerPrefs などで JSON 形式にデータを変換し、データをゲームのセッション間で保持する際に不可欠な要素です。

Unity

Posted by hidepon