TATIKUNLOG.

主にゲーム作りについて書き留めるブログ。

SerializeField を付けた変数がどこにいってるのかについて【Unity】

f:id:tat1kun:20210711162159p:plain

最近、Unityの書籍とかでスクリプトを読んでいると、「SerializeField」という属性を変数の上にくっつけてるケースを良く見ます。

使用用途は「インスペクタ上でその変数の値を変更できるようにする」が主なんですが、

実際何をしているものなのか良く忘れるので、メモしておこうと思いました。

今回、フィールドを変数と表記しているのですが、フィールドという表記に馴染みがない人も少なくないので、どうしたらいいかと悩んでいるところではあります。

シリアライズ

シリアライズ自体には

様々な要素を組み合わせた複合的なデータや、コンピュータで実行中のプログラムがメインメモリ上に展開しているオブジェクトなどを、一定のデータ形式や変換規則に従って文字列やバイト列に変換し、保存したり送受信できるようにすることを指す。(IT用語辞典 e-Wordsより)

という意味があるみたいですが、

Unity上ではデータを読み書きできるように何らかの形で書き出しておくものだと考えて間違いないかと思います。

Unityでスクリプト変数のシリアライズ

スクリプトのシリアル化 - Unity マニュアル

スクリプト変数(フィールド)のシリアライズの条件に関しては公式リファレンスで詳しく書かれています。

今回は「[SerializeField]属性を持たせる」のと「publicにすること」シリアライズをしてみます。

※属性については↓の記事が参考になります。

UnityのAttribute(属性)についてまとめてメモる。 - テラシュールブログ

シリアライズされた変数はどこに

インスペクタで設定した変数のデータがどこに保存されているのか、と調べてみました。

まずは適当なシリアライズされる変数を用意しておきます。

f:id:tat1kun:20210711151352p:plain

インスペクタ上でも適当な値を設定します。

シリアライズされた値はインスペクタ上に表示され、編集可能になるので、下のように表示されます。

一方で、privateの変数は表示されていません。

f:id:tat1kun:20210711151418p:plain

で、設定した値はシーンファイルの中で確認することができます。

f:id:tat1kun:20210711153347p:plain

ここで確認するのはmetaファイルの方ではなく、シーン名.unity自体の方です。

普通に開こうとするとUnityEditor側でシーンを開くことが多いので、なんとかテキストエディタで開いてやります。

f:id:tat1kun:20210711152253p:plain

下の方にhensuuという、先ほど設定した変数を確認することができました。

また、シリアライズされた配列が連続して配置されているのが分かります。

このffffff7fは16進数表記で、10進数表記に直すと2147483647になります。

さいごに

データを扱っていくうえで、どこに何があるのかを把握するのは大事です。

今回、普段何気なく編集しているインスペクタ上の値がどこにあるのか分かって良かったです。

Unityのシリアライズに関する記事ってググると結構出てくるので、改めて書くかは悩ましいですね。

余談

シリアライズする形式はテキスト形式とバイナリ形式の選択をすることができます。

f:id:tat1kun:20210711160622p:plain

f:id:tat1kun:20210711160635p:plain

この違いについてマニュアルを参照して確認してみましたが、

基本的にはテキストで出力するので問題ないみたいです。

というか、バージョン管理ソフトを使用する場合にはテキストを使用する必要があるみたいですね。

バイナリ形式はコンピュータ側に優しいだけなので、基本的には必要ない感じでしょうか。

f:id:tat1kun:20210711160426p:plain

Editor - Unity マニュアルより

参考

UnityのAttribute(属性)についてまとめてメモる。 - テラシュールブログ

【Unity】スクリプトがシリアライズされる仕組み | ねこじゃらシティ

【Unity】SerializeReferenceをちゃんと理解する - LIGHT11

Editor - Unity マニュアル