はじめに
こんにちはsuzukiです。本日はUnityのインスペクターから値を編集するフィールドシリアライゼーションについて説明いたします。
上記のメリットとして、unityでrunしている最中に値の変更を行うことができたり、必要な設定をコード上以外からも編集できるため便利です。
利用する方法として、[SerializeField]を利用するか、publicの装飾子を利用するかとなります。
それぞれ利用パターンが異なるため整理します。
シリアライズ
これからを説明するにはシリアラライズが何かを説明すると、公式の説明では下記の様に説明されており
“シリアライゼーションは、データ構造やオブジェクトの状態を Unity が保存して後で再構成できる形式に変換する自動プロセスです。”
重要なことは上記を行うことにより、Unityのインスペクタからの値の更新を、runしているプログラムに適用できる様になります。
シリアライズ利用するため準拠するルールがあります。
- public であるか、または SerializeField 属性をもっていること。
- 静的でないこと。
- const ではないこと。
- 読み取り専用でないこと。
- シリアラル化可能なフィールド型であること。
- プリミティブなデータ型 (int、float、double、bool、string など) であること。
- Enum 型 (32 バイト以下) であること。
- 固定サイズバッファであること。
- Unity の組み込み型 (例えば、Vector2、Vector3、Rect、Matrix4x4、Color、AnimationCurve) であること。
- Serializable 属性をもつカスタム構造体であること。
- UnityEngine.Object から派生するオブジェクトへの参照であること。
- Serializable 属性を持つカスタムクラスであること。
- 上記のフィールド型の配列であること。
- 上記のフィールド型の List
であること。
[SerializeField]
[SerializeField] は、その値がシリアライズ可能であることを表す属性です。
インスペクタから値の更新が可能になります
暗黙的にprivate装飾子がついている状態になるため、他のスクリプトからの値の参照ができません。
public
その値がシリアライズ可能であることを表すのはSerializeFieldと同様です
インスペクタから値の更新が可能になります
他のスクリプトから値に参照ができ、上書き等も可能です。
[System.NonSerialized] public
こちらはおまけ的な要素ですが、下記の二つの要素を合わせることで
[System.NonSerialized]:その値がシリアライズ不可を表す属性
public:他のスクリプトから値の参照ができる
インスペクタに表示されず、他のスクリプトからアクセスを可能とします。
まとめ
まとめると下記の様な表になります。不要な参照はない方がいいので、それぞれの要不要を判断しながら適した内容を使っていければと思います。
装飾子 | インスペクタからの参照 | 他のスクリプトからの参照 |
---|---|---|
無・private | 不要 | 不要 |
[SerializeField] | 必要 | 不要 |
public | 必要 | 必要 |
[System.NonSerialized] public | 不要 | 必要 |