UnityのC#スクリプトを書いていると、よく目にするのが [SerializeField] という謎のキーワード。
「これって何? 付けたり付けなかったり、違いがよく分からない…」という Unity初心者の方向けに、できるだけシンプルに解説します。
[SerializeField] を一言でいうと?
「private のままにしたいけど、Inspector から値をいじれるようにするタグ」
これが [SerializeField] の正体です。
通常、Unityの変数は
public int speed;
のように public にすると Inspector に表示され、エディタ上から値を変えられます。
しかし、何でもかんでも public にすると、外部のスクリプトからも書き換え放題になってしまうため、あまり良くありません。
private にすると Inspector に出てこない
では、ちゃんとカプセル化を意識して private にするとどうなるでしょう?
private int speed;
これだと、Inspector に表示されないので、エディタ上から値を調整できません。
毎回スクリプトを開いて数値を変えるのは面倒ですし、ゲームバランスの調整もしづらくなります。
そこで [SerializeField] の出番!
[SerializeField] を付けると、private だけど Inspector に表示できるという、いいとこ取りができます。
public class Player : MonoBehaviour
{
[SerializeField] private int speed = 5;
void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
speedはprivateなので、他のクラスから勝手に変更できません。- しかし、Inspector には表示されるので、エディタ上で数値を自由に調整できます。
つまり、[SerializeField] を使うことで
- コードの設計としては「外部から触らせたくない」
- でも「ゲーム制作・調整のときは Inspector からいじりたい」
というワガママを叶えてくれるわけです。
よくある使い方の例
ゲーム制作でよく出てくる例をいくつか挙げてみます。
public class Enemy : MonoBehaviour
{
[SerializeField] private int maxHp = 10; // 敵の最大HP
[SerializeField] private float moveSpeed = 2.5f; // 移動速度
[SerializeField] private GameObject dropItem; // 倒したときに落とすアイテムのプレハブ
}
- HP、スピード、ドロップアイテムなどは、ゲームバランス調整で数値やオブジェクトをいじりたい部分。
- でも、外部のスクリプトからむやみに書き換えられるとバグの元になるので
privateにしておきたい。 - このようなときに
[SerializeField]が大活躍します。
public と [SerializeField] の違い
少し整理しておきましょう。
| 書き方 | Inspectorに表示 | 他クラスからアクセス |
|---|---|---|
public int value; |
表示される | できる(読み書き自由) |
private int value; |
表示されない | できない |
[SerializeField] private int value; |
表示される | できない(private のまま) |
「Inspector に出したい = public にする」ではなく、「Inspector に出したいなら SerializeField」という意識を持っておくと、設計が綺麗になります。
[SerializeField] を使うときの注意点
- クラスのフィールド(メンバ変数)に付けるものです。
- ローカル変数(メソッド内の変数)には付けても意味がありません。
- スクリプトを編集して値の名前や型を変えたとき、既存のプレハブやシーンの値がリセットされることがあります。
まとめ:[SerializeField] は Inspector と仲良くするためのキーワード
[SerializeField]は「private だけど Inspector で編集したい」というときに使う。- public にしなくて済むので、スクリプトの設計が安全になる。
- ゲームバランス調整に使うパラメータ、プレハブの参照などによく使われる。
Unityでスクリプトを書いていて、
「外から触らせたくないけど、Inspectorには出したいな…」と思ったら、
とりあえず [SerializeField] を思い出してみてください。

