【Unity】SerializeFieldとは?

C#

どうも、Doo(@doo11gms)です_(:3」∠)_

私が初めてUnityに触れた頃、最初に持った疑問は「SerializeFieldってなに?」でした。

privateなメンバをインスペクタに表示するために使っていただけでしたが、まあ細かいことはそのうち分かるだろーって思ってたら、案の定2年くらいずーっと疑問のままでした。

以下にSerializeFieldとは何かをまとめてみましたが、ぶっちゃけUnityを(まともな使い方で)使う分には詳しく知る必要無いです。

ですので、「privateメンバをInspectorに表示させたい時に変数の前に[SerializeField]と書く」とだけ覚えておけば、あとは別に知らなくても困ることはないと思われます。

 

[SerializeField]とは?

結論から言いますと、Unityでよく使う[SerializeField]とは、

「直後の領域をシリアライザが走れる領域にする」という効果を持った属性

のことです。属性シリアライザについては後述します。

 

属性(Attribute)とは?

属性というのは、[SerializeField]みたいに[]で囲まれた文字列のことを指します(JavaScriptなら@で始まる文字列です)。

Unityには、[SerializeField]の他に34個の属性が組み込まれていて、クラスや変数に属性を付与すると、特殊な挙動をしてくれるようになります。

属性についてはこちらの方が詳しく説明して下さっていますので、細かい話は省きます。

[SerializeField]は数ある属性の内の1つということだけ覚えておいて下さい。で、「シリアライザってなんだよ!」って話ですよね。

 

シリアライザとは?

シリアライザというのは、「シリアライズ」という作業を自動で行ってくれるソフトのことです。

シリアライズはメモリなどの低レイヤーな話で一般的に使われる単語ですが、Unityにおけるシリアライズもほぼ同じ意味です。

Unityにおける「シリアライズ」とは、

データ構造やオブジェクトの状態を、保存・再構築できるようなフォーマットに変換する

という動詞です。(逆に、復元する方をデシリアライズといいます)

 

Unityには、このシリアライザというソフトが組み込まれています。シリアライザはリアルタイムでintやfloat、GameObjectなどをシリアライズします。

スクリプトのタイムスタンプが変化すると、Unityのシリアライザはロード済みの全スクリプトに対し、シリアライズを実行します。

外部のエディタでコード書いて戻って来る時に結構時間かかるのは、シリアライザがせっせと全オブジェクトをシリアライズしているからなんですね。

ただ、ご存知の通りprivateキーワードがついている領域はシリアライズできません。シリアライザが走りに行けるのは、特定の条件を満たしている領域だけなのです。

 

シリアライザが走れる領域一覧

シリアライザが走れるのは以下の領域だけです。

  • 外部からアクセスできる領域(=publicキーワードがついている領域)
  • シリアライズ可能属性の領域(=SerializeField属性が付与されている領域)
  • 静的でない領域(=staticキーワードがついていない領域)
  • 定数用でない領域(=constキーワードがついていない領域)
  • 読み取り専用でない領域(=readonlyキーワードがついていない領域)

ただし、シリアライザが走りに行けてもシリアライズできないデータ型も存在します。

 

シリアライズ可能なデータ一覧

シリアライザがシリアライズできるのは以下のデータ型のみです。

  • 普通のクラス(抽象/静的/ジェネリックでないクラス)
  • System.Serializable属性が付与されている構造体
  • プリミティブ型(int, float, double, bool, stringなど)
  • コンテナ型(配列とリスト)
  • Enum型
  • Unityに組み込まれた独自型(Vector2, Vector3, Colorなど)

故に、残念ながら辞書型やインターフェースはシリアライズすることができません。ただ、方法がない訳ではないです。Odinというアセットを使えば、すべてのデータ型をシリアライズすることができます。

Odinは超絶有能なアセットですので、エディタ拡張系アセットを持っていない方はセール時に購入しておくことをおすすめします。

無人島で1つだけアセットをダウンロードできるなら、私は迷わずOdinを選びます。それくらいマストなアセットです。

 

まとめ

長々と書き綴ってしまいましたが、まとめるとこんな感じです。

  • SerializeFieldとは、「シリアライザが走れる領域」という意味
  • シリアライズ=対象を記憶媒体に保存/復元できるようなフォーマットに変換する、という動詞
  • シリアライザ=Unityに組み込まれた、自動でオブジェクトをシリアライズするソフト

 

もっと詳しく知りたい方へ

Unityのシリアライズの仕組みについてはこちらに詳しく書かれています。Unity公式マニュアルのScriptSerializationのページです。

 

 

コメント