やりたいこと
[SerializeField]とは何者だ。
[~~]の意味
- C#の機能で属性と呼ぶ。
- Javaでいうアノテーションで各フィールドごとに意味を持たせる。
- 自作の属性も作ることができる。
- Unity固有の属性も数十と用意されておりSerializeFieldもその一つ。
- Unity固有の属性一覧については参考サイト1. を参照
SerializeFieldの意味
- エディタのインスペクタビューに項目追加され、値の設定が可能になる。
- ホットリロードが可能になる。
(ゲーム実行中にスクリプトを修正しても、フィールドの値が失われない。) - シリアライズによりハードディスク等外部からの復元を保証する?
(保証するのか、シリアライズ化の対象であることをマーク(明示)しているだけか
どちらであるかは調べていない。)
具体的な使用例
テストコード
SerialA.cs
public class SerialA : MonoBehaviour
{
[SerializeField] SerialB serialB;
void Start()
{
serialB.Value1 = 400;
}
}
SerialB.cs
public class SerialB : MonoBehaviour
{
[SerializeField] int Value1; ・・・(※1)
}
パターン1 : エディタ上から編集したいが、スクリプト上では隠蔽したい。
SerialB.cs
[SerializeField] private int Value1;
エディタ上から値の初期化を行うときに有効。
カプセル化も維持される。
パターン2 : エディタ上から編集しない、スクリプト上では隠蔽したい。
SerialB.cs
private int Value1;
値の初期化をスクリプトで行う場合などに有効。
エディタで誤って値を設定させない場合に有効。
パターン3 : エディタ上から編集する、スクリプト上でも公開する。
SerialB.cs
[SerializeField] public int Value1{get; set;}
// または,
public int Value1{get; set;}
おそらくあり得ないパターン。スクリプト上で初期化するならインスペクタビューへの公開は不要であるし、逆もまた然り。
まぁ趣味として速さ優先で書く分にはいいかと。
インスペクタビューへの公開のみを目的とするなら下の書き方のが簡潔。