【Unity】Serializable の必要性について
Serializable
は、Unity でオブジェクトのデータを保存・復元する際に非常に重要な役割を果たします。具体的には、データを JSON や バイナリ形式 などで保存する際に、クラスやデータ構造を直列化(シリアライズ)するために使用します。
1. 直列化(シリアライズ)とは?
直列化 (Serialization) とは、オブジェクトのデータを保存や転送できる形(通常はバイト列やテキスト形式)に変換するプロセスです。Unity では、ゲームの進行状況や設定データなどを保存する際に、この直列化が行われます。
一方、逆直列化 (Deserialization) とは、保存されたデータを再びオブジェクトに戻すプロセスです。これにより、ゲームが再開された際に、以前のゲーム状態が復元されます。
Unity で直列化を行うためには、対象のクラスや構造体に [Serializable]
属性を付ける必要があります。これがなければ、Unity や C# の JSON シリアライズ、PlayerPrefs などの保存機能が、そのクラスのデータを変換できません。
2. Unity における Serializable
の必要性
Unity では、JsonUtility
や PlayerPrefs
などを使用してデータを保存する際に、オブジェクトがシリアライズ可能である必要があります。このため、カスタムクラスに [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
の欠点
- フィールド制約:
Serializable
属性を付けたクラスは、シリアライズ可能なフィールド(基本的な型やリストなど)しか変換できません。例えば、Dictionary
やHashtable
などのデータ型はJsonUtility
ではシリアライズできません。
- 動的データの制約:
- Unity の
JsonUtility
は、動的データ(例えば、ランタイムに生成されたプロパティや非公開フィールド)には対応していません。
5. まとめ
[Serializable]
は、Unity におけるデータ保存の基盤となる仕組みであり、オブジェクトのデータを外部ファイルやメモリ上にシリアライズして保存・復元するために必要です。JsonUtility
やPlayerPrefs
などで JSON 形式にデータを変換し、データをゲームのセッション間で保持する際に不可欠な要素です。
ディスカッション
コメント一覧
まだ、コメントがありません