最近、Unityの書籍とかでスクリプトを読んでいると、「SerializeField」という属性を変数の上にくっつけてるケースを良く見ます。
使用用途は「インスペクタ上でその変数の値を変更できるようにする」が主なんですが、
実際何をしているものなのか良く忘れるので、メモしておこうと思いました。
今回、フィールドを変数と表記しているのですが、フィールドという表記に馴染みがない人も少なくないので、どうしたらいいかと悩んでいるところではあります。
シリアライズ
「シリアライズ」自体には
様々な要素を組み合わせた複合的なデータや、コンピュータで実行中のプログラムがメインメモリ上に展開しているオブジェクトなどを、一定のデータ形式や変換規則に従って文字列やバイト列に変換し、保存したり送受信できるようにすることを指す。(IT用語辞典 e-Wordsより)
という意味があるみたいですが、
Unity上ではデータを読み書きできるように何らかの形で書き出しておくものだと考えて間違いないかと思います。
Unityでスクリプト変数のシリアライズ
スクリプト変数(フィールド)のシリアライズの条件に関しては公式リファレンスで詳しく書かれています。
今回は「[SerializeField]属性を持たせる」のと「publicにすること」でシリアライズをしてみます。
※属性については↓の記事が参考になります。
UnityのAttribute(属性)についてまとめてメモる。 - テラシュールブログ
シリアライズされた変数はどこに
インスペクタで設定した変数のデータがどこに保存されているのか、と調べてみました。
まずは適当なシリアライズされる変数を用意しておきます。
インスペクタ上でも適当な値を設定します。
シリアライズされた値はインスペクタ上に表示され、編集可能になるので、下のように表示されます。
一方で、privateの変数は表示されていません。
で、設定した値はシーンファイルの中で確認することができます。
ここで確認するのはmetaファイルの方ではなく、シーン名.unity自体の方です。
普通に開こうとするとUnityEditor側でシーンを開くことが多いので、なんとかテキストエディタで開いてやります。
下の方にhensuuという、先ほど設定した変数を確認することができました。
また、シリアライズされた配列が連続して配置されているのが分かります。
このffffff7fは16進数表記で、10進数表記に直すと2147483647になります。
さいごに
データを扱っていくうえで、どこに何があるのかを把握するのは大事です。
今回、普段何気なく編集しているインスペクタ上の値がどこにあるのか分かって良かったです。
Unityのシリアライズに関する記事ってググると結構出てくるので、改めて書くかは悩ましいですね。
余談
シリアライズする形式はテキスト形式とバイナリ形式の選択をすることができます。
この違いについてマニュアルを参照して確認してみましたが、
基本的にはテキストで出力するので問題ないみたいです。
というか、バージョン管理ソフトを使用する場合にはテキストを使用する必要があるみたいですね。
バイナリ形式はコンピュータ側に優しいだけなので、基本的には必要ない感じでしょうか。
参考
UnityのAttribute(属性)についてまとめてメモる。 - テラシュールブログ
【Unity】スクリプトがシリアライズされる仕組み | ねこじゃらシティ