本記事で解決できること
- SerializeFieldとは?
- SerializeFieldとPublicの違い、使い分け
Unityでゲーム開発をする際によく使用するSerializeFieldについて解説します!
Unityを学ぶ本や動画によって、public とSerializeFieldが同じように使われていて、何が違うのか特に意識せずに使っている人もいると思います。そこについても解説します。
そもそもシリアライズ(Serialize)とは?
シリアライズ(Serialize)とは、プログラム内のデータを保存や送信できる形式に変換することです。
プログラム寄りの説明
- プログラムでは、変数やオブジェクトの情報(数値や文字列、状態など)を扱います。
- そのままではファイルやネットワークに保存・送信できないことがあります。
- シリアライズを使うと、データを保存したり、他のシステムに送信したりできる形に変換できます。
- Unityでは、SerializeFieldを付けることでInspector上で変数を編集できるようにしつつ、データとしても扱えるようにする仕組みです。
SerializeFieldとは?
SerializeFieldは、Unityで使われる属性(Attribute)の一つであり、変数やプロパティをUnityのInspectorウィンドウに表示可能にするためのものです。SerializeFieldを使うことで、プログラマーはゲームオブジェクトやコンポーネントのプロパティを直接編集することなく、簡単に調整できるようになります。
SerializeFieldの基本的な使い方
SerializeFieldを使用するには、Unityスクリプト内の変数やプロパティの前に[SerializeField]という属性を付けるだけです。例えば、以下のようなコードを考えてみましょう。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] float moveSpeed = 5f;
[SerializeField] int playerHealth = 100;
// 他のコード
}
この例では、moveSpeed
とplayerHealth
という変数にSerializeFieldをつけています。これにより、UnityのInspectorウィンドウ上でこれらの変数の値を調整できるようになります。
SerializeFieldのメリットとは何か
SerializeFieldの最大のメリットは、プログラマーがコード内で変数を定義するだけで、その変数をInspector上で編集できるようになることです。これにより、値の調整やテストが非常に容易になります。
SerializeFieldとPublicの違い
異なる点
- public 他のスクリプトから変更できる
- SerializeField 他のスクリプトから変更できない
項目 | public | [SerializeField] |
---|---|---|
Inspectorでの編集 | 可能 | 可能 |
他スクリプトからアクセス | 可能 | 不可 |
ポイントは、publicは他のスクリプトからもアクセス可能で、SerializeFieldはInspectorからは見えるが他スクリプトからはアクセスできないことです。
必要がなければpublicを避け、SerializeFieldを使うのが推奨です。
実際に確認
public と SerializeField のパラメーターをそれぞれ用意します
public class test : MonoBehaviour
{
public int PublicNum = 0;
[SerializeField] int SerializeNum = 0;
}
別のスクリプトを用意し、参照できるかを確認してみると、SerializeFieldの参照ができないエラーが出てきます。

インスペクターでの編集はさせずに、他スクリプトからアクセスするには?
Unityで変数をInspectorに表示せずに、他のスクリプトからアクセスしたい場合はどうしたら良いのか?
このようなケースでは、System.NonSerialized
属性を使う方法が便利です。
1. System.NonSerializedとは?
System.NonSerialized
は、シリアライズ(保存・Inspector表示)を無効化するために使います。
public
変数に付けることで、他スクリプトからアクセス可能- しかし、[NonSerialized]をつけることで、Inspectorには表示されない
- シーン保存時にも値は保持されない
2. 基本的な使い方
using UnityEngine;
using System;
public class Player : MonoBehaviour
{
[NonSerialized] public int runtimeScore; // Inspectorには表示されず、他スクリプトからアクセス可能
}
別のスクリプトからアクセスする例:
using UnityEngine;
public class GameManager : MonoBehaviour
{
public Player player;
void Start()
{
// 他スクリプトから値を参照・変更可能
player.runtimeScore = 50;
Debug.Log(player.runtimeScore); // 50と表示
}
}
runtimeScore
はInspectorに表示されませんが、publicなので他のスクリプトから自由にアクセスできます
3. SerializeFieldとの違い
属性 | Inspector表示 | 他スクリプトアクセス |
---|---|---|
SerializeField | 表示される | privateなら不可 |
System.NonSerialized | 表示されない | publicならアクセス可能 |
- SerializeField:Inspectorで編集したいprivate変数向け
- System.NonSerialized:Inspectorには表示させず、publicとして他スクリプトからアクセスしたい変数向け
まとめ
1人で簡単なゲームを開発する分には、SerializeFieldとPublic、どちらを使っても大差ないように思いますが、複数人で開発をするときは、意識した方が良さそうです。
インスペクターの表示をさらに見やすく効率的に使いたい方は、こちらのアセットがおすすめです。